Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сопоставление процедур.


Cr@sh ©   (2002-10-12 21:01:00) 

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


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

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

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

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

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

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


ZrenBy   (2002-10-17 10:09:00) [2]

>>Юрий Зотов © (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=Маленький эксперимент


Cr@sh   (2002-10-13 08:34:00) [3]

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


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

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

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


ZrenBy   (2002-10-12 21:52:00) [5]

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

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

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


Cr@sh   (2002-10-12 21:24:00) [6]

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


ZrenBy   (2002-10-12 21:06:00) [7]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо