Великолепный метод Perform
Автор: Михаил Христосенко
WEB сайт: http://mihandelphi.narod.ru
В этой статье я постараюсь показать что можно делать с помощью метода Perform, и какие интересные вещи скрываются в VCL кодах (в частности messages.pas). Метод Perform дает вам возможность посылать сообщения различным компонентам. Все сообщения описаны в файле Messages.pas (настоятельно рекомендую вам его посмотреть!!!). Данный метод надо вызывать по такой схеме:
Имя_компонента.Perform(Сообщение, верхний параметр: Integer, нижний параметр: Integer);
|
Начнем с самого простого. Попробуем закрыть форму. Для этого поставьте на форму одну кнопку и в обработчике ее события OnClick напишите:
Form1.Perform(WM_CLOSE, 0, 0);
|
Теперь попробуем изменить иконку вашей программы. Поставьте на форму компонент Image и загрузите в него какую-нибудь иконку. Будем использовать сообщение WM_SETICON. А поскольку в качестве параметров необходима величина типа Integer, то мы воспользуемся указателем на иконку (handle). Теперь обработчик нажатия кнопки может иметь вид:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Perform(WM_SETICON, 0, image1.Picture.Icon.Handle);
end;
|
Теперь попробуем осуществить программный клик по кнопке 1. Поставьте на форму еще одну кнопку и в ее обработчике события OnClick, напишите:
Button1.Perform(WM_LBUTTONDOWN, 0, 0);
Button1.Perform(WM_LBUTTONUP, 0, 0);
|
А можно и попроще реализовать:
Button1.Perform(BM_CLICK, 0, 0);
|
Объясняю почему два обработчика. Вначале посылается сообщение, что кнопка нажата, затем сообщение - что отпущена, тогда то и происходит клик. Если вы все сделали правильно и ничего с формы не убирали, то иконка вашего приложения вновь поменяется.
Теперь маленько коснемся компонентов для работы с текстом. Для начала установите на форму компонент Memo. Будем делать с ним разные стандартные вещи: добавлять символы, копировать, вставлять, вырезать, отменять и т.д.
Начнем с вырезания текста. Обработчик кнопки поменяйте на:
Memo1.SelectAll;
Memo1.Perform(WM_CUT, 0, 0);
|
С начала выделяется весь текст, а потом вырезается и помещается в буфер. Также можно и копировать текст, только надо изменить сообщение на: WM_COPY. Соответственно, чтобы вставить текст из буфера напишите:
Memo1.Perform(WM_PASTE, 0, 0);
|
Для очистки содержимого Memo, воспользуйтесь сообщением WM_CLEAR с параметрами 0,0. Для того, чтобы отменить введенный текст напишите следующее:
Memo1.Perform(EM_UNDO, 0, 0);
|
Чтобы добавить символ в Memo нужно написать так:
Memo1.Perform(WM_CHAR, 192, 0);
|
где 192, номер символа 'A', этот вызов метода Perform, можно заменить на аналогичный:
Memo1.Perform(WM_CHAR, LongInt(char('A')), 0);
|
Здесь значение символа 'A' как тип Char преобразуется в тип LongInt, а затем добавляется в Memo.
Теперь будем разбираться с Listbox' ами. Для этого добавьте его на форму а событие OnClick кнопки замените на:
Listbox1.Perform(LB_ADDSTRING, 0, LongInt(Pchar('Эта строка появится в ListBoxe')));
|
Если заменить LB_ADDSTRING на LB_INSERTSTRING, то строка будет вставляться в зависимости от первого параметра, который равен 0 в первом случае.
Для того, чтобы выделить какую-нибудь строку в Listbox'e зная ее имя нужно написать следующий код:
Listbox1.Perform(LB_SELECTSTRING, 0, LongInt(pchar('текст строки, которую нужно найти')));
|
С помощью приведенной выше строчки кода можно реализовать поиск в ListBox'e, наподобие того, как это делается в FontDialog. В текстовом поле ввода вы вводите текст, и наиболее похожий по шрифт выделяется. Чтобы это осуществить поставьте на форму компонент Edit. А в обработчике его события OnChange напишите:
Listbox1.Perform(LB_SELECTSTRING, 0, LongInt(pchar(Edit1.Text)));
|
Ну вот кратенький обзор метода Perform подошел к концу. Хочется посоветовать только одного, смотрите файл Messages.pas, ищите новые решения и не бойтесь пробовать, а вдруг сработает!!!
|