Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.28;
Скачать: CL | DM;

Вниз

Сопоставление процедур.   Найти похожие ветки 

 
Cr@sh ©   (2002-10-12 21:01) [0]

Мастера, объясните, пожалуста, как сделать:
Я создаю пункт меню в ран-тайме, как создать для него событие онклик и сопоставить этому событию некоторую процедуру.
Заранее огромное спасибо.


 
ZrenBy ©   (2002-10-12 21:06) [1]

Объявляешь процедуру
procedure MyProcOnClick(Sender:TObject);
begin
.....
end;

Присваиваешь
SomeMenuItem.onClick := MyProcOnClick;


 
Cr@sh ©   (2002-10-12 21:24) [2]

А как передать в эту процедуру некоторый параметр? Допустим s:string?


 
ZrenBy ©   (2002-10-12 21:52) [3]

Ну, наверное, так можно.

SomeMenuItem.Tag := Integer( Addr(s) );

procedure onClick(Sender: TObject);
var pStr:PString; ss:String;
begin
pStr := PString(TMenuItem(Sender).Tag);
ss := pStr^;


 
Юрий Зотов ©   (2002-10-13 02:10) [4]

Можно и без двойной адресации. Длинная строка - это уже и так указатель, поэтому в integer и обратно он преобразуется напрямую.

MenuItem.Tag := Integer(S);
...
S := String(TMenuItem(Sender).Tag);



 
Cr@sh ©   (2002-10-13 08:34) [5]

Все всем спасибо, разобрался. Я только по другому сделал, по Сендеру смотрю.


 
ZrenBy ©   (2002-10-17 10:09) [6]

>>Юрий Зотов © (13.10.02 02:10)
Прошу прощения за столь позднее сообщение.

Решил воспользоваться вашим советом, но вовремя задумался
и решил поставить маленький эксперимент.
Дело в том, что у меня указатель на строку присваивается
в начале работы, а потом строка меняется.


procedure TForm1.Button5Click(Sender: TObject);
var S:String; pYZ,pZB:Integer;
begin
Caption := "Маленький эксперимент";
S := "Строка";
pYZ := Integer( S );
pZB := Integer( Addr(S) );

memo1.Lines.add(Format("YZ: P=%x P^=%x S=%s",[0,pYZ,String(pYZ)]));
memo1.Lines.add(Format("ZB: P=%x P^=%x S=%s",[pZB,Integer(Pointer(pZB)^),PString(pZB)^]));

S := FloatToStr(Pi-Pi-Pi);
memo1.Lines.add(Format("YZ: P=%x P^=%x S=%s",[0,pYZ,String(pYZ)]));
memo1.Lines.add(Format("ZB: P=%x P^=%x S=%s",[pZB,Integer(Pointer(pZB)^),PString(pZB)^]));

SetLength(S,SendMessage(Handle,WM_GETTEXTLENGTH,0,0)+1);
SetLength(S,SendMessage(Handle,WM_GETTEXT,WPARAM(Length(S)+1),LPARAM(S)));
memo1.Lines.add(Format("YZ: P=%x P^=%x S=%s",[0,pYZ,String(pYZ)]));
memo1.Lines.add(Format("ZB: P=%x P^=%x S=%s",[pZB,Integer(Pointer(pZB)^),PString(pZB)^]));
end;


Итого получаем:

YZ: P=000000 P^=45F564 S=Строка
ZB: P=12F3A8 P^=45F564 S=Строка

YZ: P=000000 P^=45F564 S=Строка
ZB: P=12F3A8 P^=8D23A8 S=-3.14159265358979

YZ: P=000000 P^=45F564 S=Строка
ZB: P=12F3A8 P^=8D38B0 S=Маленький эксперимент


 
Юрий Зотов ©   (2002-10-17 11:54) [7]

И что же тут удивительного?

Изменение длины строки может приводить к перераспределению памяти. Это и без экспериментов известно. Естественно, адрес, который сначала был запомнен, а потом изменен, оказывается уже не тем (могло и Access Violation возникнуть). А "адрес адреса" остается неизменным. Ничего странного.

Но вот к вопросу

"А как передать в эту процедуру некоторый параметр? Допустим s:string"?

проведенный Вами эксперимент отношения не имеет - то есть, он некорректен. Поставьте другой эксперимент, который ТОЧНО моделировал бы условия задачи. То есть, напишите обработчик OnClick и передавайте в него одну и ту же строку двумя разными способами. Думаю, результат будет одинаковым.



Страницы: 1 вся ветка

Текущий архив: 2002.10.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.02 c
6-92630
FATman
2002-08-27 23:02
2002.10.28
Как понять я уже в инете или еще нет?


1-92419
Vadim SA
2002-10-16 16:35
2002.10.28
Текст и цвет


7-92754
zzet
2002-08-19 20:18
2002.10.28
функции для моуса бывают?


1-92456
IVANWIN
2002-10-17 23:30
2002.10.28
Формат отображения строки


4-92794
REL_
2002-09-16 15:32
2002.10.28
Загрузка из ресурсов