Форум: "Основная";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];
ВнизСопоставление процедур. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.014 c