if IoResult <> 0 then DriveComboBox1.Items.Delete(i)

  else inc(i);

 end;

 ChDir(OldDirectory);

 SetErrorMode(OldErrorMode);

end;

Вопрос:

Как сообщить всем формам моего приложения (в том числе и не видимым в данный момент) об изменении каких-то глобальных значений?

Ответ:

Один из способов — создать пользовательское сообщение и использовать метод preform чтобы разослать его всем формам из массива Screen.Forms.

Пример:

{Code for Unit1}

const UM_MyGlobalMessage = WM_USER + 1;

type TForm1 = class(TForm)

 Label1: TLabel;

 Button1: TButton;

 procedure FormShow(Sender: TObject);

 procedure Button1Click(Sender: TObject);

private

 {Private declarations}

 procedure UMMyGlobalMessage(var AMessage: TMessage); message UM_MyGlobalMessage;

public

 {Public declarations}

end;

var Form1: TForm1;

implementation

{$R *.DFM}

uses Unit2;

procedure TForm1.FormShow(Sender: TObject);

begin

 Form2.Show;

end;

procedure TForm1.UMMyGlobalMessage(var AMessage: TMessage);

begin

 Label1.Left := AMessage.WParam;

 Label1.Top := AMessage.LParam;

 Form1.Caption := 'Got It!';

end;

procedure TForm1.Button1Click(Sender: TObject);

var f: integer;

begin

 for f := 0 to Screen.FormCount - 1 do Screen.Forms[f].Perform(UM_MyGlobalMessage, 42, 42);

end;

{Code for Unit2}

const UM_MyGlobalMessage = WM_USER + 1;

type TForm2 = class(TForm)

 Label1: TLabel;

private

 {Private declarations}

 procedure UMMyGlobalMessage(var AMessage: TMessage); message UM_MyGlobalMessage;

public

 {Public declarations}

end;

var Form2: TForm2;

implementation

{$R *.DFM}

procedure TForm2.UMMyGlobalMessage(var AMessage: TMessage);

begin

 Label1.Left := AMessage.WParam;

 Label1.Top := AMessage.LParam;

 Form2.Caption := 'Got It!';

end;

Вопрос:

Как обновить список дисков компонента TDriveComboBox, учитывая, что могут быть подключены/отключены сетевые диски и произведена "горячая замена" plug&play дисков?

Ответ:

Следующий пример вызывает защищенный (protected) метод класса TDriveComboBox BuildList() для регенерации списка дисков. (использовая так наз. "class cracer")

Пример:

type TNewDriveComboBox = class(TDriveComboBox) //это наш "class cracer"

end;

procedure TForm1.Button1Click(Sender: TObject);

var Drive : char;

begin

 Drive := DriveComboBox1.Drive;

 TNewDriveComboBox(DriveComboBox1).BuildList; //вызываем защищенный метод родительского класса

 DriveComboBox1.Drive := Drive;

end;

Вопрос:

Как программно заставить выпасть меню?

Ответ:

В примере показано как показать меню и выбрать в нем какой-то пункт, эмулируя нажатие "быстрой клавиши" пункта меню. Если у Вашего пункта меню нет "быстрой клавиши" Вы можете посылать комбинации VK_MENU, VK_LEFT, VK_DOWN, и VK_RETURN, чтобы программно "путешествовать" по меню.

Пример:

procedure TForm1.Button1Click(Sender: TObject);

begin

 //Allow button to finish painting in response to the click

 Application.ProcessMessages;

 {Alt Key Down}

 keybd_Event(VK_MENU, 0, 0, 0);

 {F Key Down - Drops the menu down}

 keybd_Event(ord('F'), 0, 0, 0);

 {F Key Up}

 keybd_Event(ord('F'), 0, KEYEVENTF_KEYUP, 0);

 {Alt Key Up}

 keybd_Event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);

 {F Key Down}

 keybd_Event(ord('S'), 0, 0, 0);

Перейти на страницу:

Похожие книги