Главная страница
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.022 c
7-92758
Igorka
2002-08-23 11:22
2002.10.28
NT Service


14-92669
Polevi
2002-10-07 13:14
2002.10.28
руки бы автору томатоса поотрывал, слов нет, №;Е№:;%


8-92617
Egor Morenis
2002-05-23 06:06
2002.10.28
Как создать звук особой частоты!


14-92668
Wonder
2002-10-07 13:45
2002.10.28
Любопытно, кто первый догадается :)))


1-92576
Shadow
2002-10-14 21:23
2002.10.28
;) Как удалить опр. строку в текстовом файле?