Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];




Вниз

Как передать данные в форму? 


artko   (2002-03-29 12:21) [0]

есть нек. софтина, в которой формы создаются динамически в нужном кол-ве экземпляров каждого класса. требуется по действиям в любой другой форме передать всем остальным(или нек. их части) определенное событие. Попытка реализовать вызов определенного метода по указателю - получается, но нет доступа к конкретному экземпляру формы, передача методу указателя на экземпляр формы - не работает.
делаем так:
form := TForm.Create(self) ; в основной форме
заносим в список(Tlist) модуля @form, @form.EvHandler(процедурный тип, принимающий в качестве параметров запись с именем события и указателем на форму)
если вызывать метод как
var
mt : TEvent;
@mt:=list.items[0];
mt(params)
то управление передается в нужное место, но при попытке обратиться к форме метода(Self.Edit1.Text:="dd" к примеру) AV
при передаче методу указателя на форму и приведении типа
var
frm : TMyForm
frm:=TMyForm(params.parent типа pointer)
и вызове frm.Edit1.Text:="dd" просто ничего не происходит.

Где ошибка, подскажите?
Спасибо.



MBo   (2002-03-29 12:35) [1]

а Screen.Forms[i] не поможет?



artko   (2002-03-29 14:00) [2]

формы разных классов, посему Screen слабо помогает. а городить тучу кода для приведения типов неохота.



MBo   (2002-03-29 14:11) [3]

сомнения такие -
вместо @form заносить в список просто form - это уже указатель.
evHandler- как TMethod, т.е. Code и Data



reonid   (2002-03-29 14:20) [4]

Для форм разных классов неплохо подойдёт механизм сообщений
Определи своё сообщение
WM_YOURMSG = WM_USER + 222;

И в своих формах пишешь обработчик

TMyForm = ...
procedure WMYOURMSG(var Msg: TMessage); message WM_YOURMSG;
end;

А потом в цикле посылаешь всем формам
Screen.Forms[i].Perform(WM_YOURMSG, wP, lP);

(если не хватает параметров - в wP и lP можешь хранить ссылку на
структуру с большим числом параметров)

PS Кстати, ссылку на метод объекта в TList не засунешь - это не указатель (см TMethod - он занимает 8 байт).



artko   (2002-03-29 14:20) [5]

попытка использовать Screen с приведением типа - оказывается, что новая форма добавляется в начало списка. :) сейчас попробую придумать способ получить нужный номер :)



artko   (2002-03-29 14:29) [6]

2reonid:
PS Кстати, ссылку на метод объекта в TList не засунешь - это не указатель
я определяю тип
TMyEvent=procedure(EventData:TMyEventData) of object;
в форме описываю такую процедуру и засовываю ее в список как
List.Add(@myproc);
во всяком случае потом процедура вызывается, но вот только Self внутри этой процедуры показывает на деревню дедушке.
а со своим сообщением сейчас попробую, спасибо.



reonid   (2002-03-29 14:35) [7]

2artko ©
Именно это я и имел в виду
(и MBo тебе о том же говорил, я не заметил)

Тип
TMyEvent=procedure(EventData:TMyEventData) of object;

в действительности представляет собой
запись

TMethod = record
Code, Data: Pointer;
end;

Он хранит в себе адрес процедуры (в Code) и Self (в Data) и
занмает 8 байт. Для его хранения нужен специализированный список
(Если хочешь, пришлю)



deleon   (2002-03-29 14:42) [8]

Прикалываетесь?
Если все формы создаются от одного объекта, вот и переберите все компоненты этого объекта, через owner дочерней формы!



artko   (2002-03-29 14:45) [9]

2reonid: не отказался бы от списка.

2deleon: формы могут быть как разными, так и неск. одного типа



artko   (2002-03-29 15:16) [10]

спасибо за ответы, добился нужного эффекта определением собственного сообщения.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.025 c
1-32810           Евгений!              2002-03-31 21:29  2002.04.11  
необходимо перехватить сообщения о изменении реестра и ФС


1-32866           LazorenkoX            2002-03-29 13:03  2002.04.11  
file of XXX


3-32643           IronHawk              2002-03-19 12:24  2002.04.11  
Обнуляються данные в базе !


3-32637           AndrewK               2002-03-19 12:54  2002.04.11  
Работа с ADO


1-32900           Neox                  2002-03-29 21:26  2002.04.11  
Системное Время