The Unofficial Newsletter of Delphi Users - by Robert Vivrette

Альтернативный способ использования TActionLists

By Shane A. Holmes - shane@holmes.net

Перевод Руденко Е.В.   janer@newmail.ru    сентябрь 2001 года

 

Когда я пишу небольшие приложения или утилиты, то стараюсь не использовать  Win32 контроль из модуля ComCtrls. Раньше у меня было много проблем с клиентскими программами при обновлении текущей версии ComCtrl DLL.

Теперь я создаю свои собственные процедуры обновления. Я размещаю все мои действия для моих кнопок и моих меню в их собственных процедурах и затем вызываю их из основной процедуры.

Пример:

procedure TfrmMain.UpDateBtns;
begin
 btnDelete.Enabled:= lbMain.SelCount > 0;
 btnEdit.Enabled:= lbMain.SelCount = 1;
 .
 .
 .
 btnLoad.Enabled:=  True;
 btnSave.Enabled:= (lbMain.Items.Count > 0);
end;

procedure TfrmMain.UpDateMenuItems;
begin
 mnuDelete.Enabled:= btnDelete.Enabled;
 mnuEdit.Enabled:= btnEdit.Enabled;
 .
 .
 .
 mnuLoad.Enabled:= btnLoad.Enabled;
 mnuSave.Enabled:= btnSave.Enabled;
end;

procedure TfrmMain.UpDateAll;
begin
 UpDateBtns;
 UpDateMenuItems;
end;

Вы можете вызывать процедуру "UpdateAll" из всех ваших событий..

Пример:

procedure TfrmMain.btnDeleteClick(Sender: TObject);
var
 I: Integer;
begin
 if MessageDlg('Удалить выбранное имя?'+#13+
               'Вы уверены?',
               mtConfirmation,[mbYes,mbNO],0) = mrYes then
 begin
  for I:= lbMain.Items.Count - 1 DownTo 0 do
   if lbMain.Selected[I] then
    lbMain.Items.Delete(I);
  UpDateAll;
 end;
end;

procedure TfrmMain.btnEditClick(Sender: TObject);
var
 FullName: String;
 Idx: Integer;
begin
  Idx:= lbMain.ItemIndex;
  FullName:= lbMain.Items[Idx];
  FullName := InputBox('Введите имя',
                      'Инициалы',
                      FullName);
  lbMain.Items[Idx]:= FullName;
  lbMain.Selected[Idx]:= True;
 UpDateAll;
end;

procedure TfrmMain.btnLoadClick(Sender: TObject);
begin
 dlgOpen.InitialDir:= ExtractFilePath(Application.ExeName);
 if dlgOpen.Execute then
 begin
  lbMain.Items.LoadFromFile(dlgOpen.FileName);
  UpDateAll;
 end;
end;

procedure TfrmMain.btnSaveClick(Sender: TObject);
begin
 dlgSave.InitialDir:= ExtractFilePath(Application.ExeName);
 if dlgSave.Execute then
  lbMain.Items.SaveToFile(dlgSave.FileName);
end;

Вы можете вызывать данные процедуры почти из любых Событий при необходимости обновления вашего Контроля.

Пример:  из основной формы после загрузки данных...

procedure TfrmMain.FormActivate(Sender: TObject);
begin
 Application.OnHint:= DisplayHint;
 if FileExists('Family.txt') then
  lbMain.Items.LoadFromFile('Family.txt');
 UpDateAll;
end;
Более полный пример можно загрузить с моего сайта: www.shane.holmes.net или  here on UNDU.

Надеюсь это будет вам полезно!

Shane Holmes
 Возврат в Tips&Tricks