Форум: "Основная";
Текущий архив: 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]спасибо за ответы, добился нужного эффекта определением собственного сообщения.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c