Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-32625
RemVal
2002-03-19 09:56
2002.04.11
Проблемы с ADO


1-32769
новенький в Делфи
2002-03-30 14:17
2002.04.11
Обработчик событий


1-32806
sammy
2002-04-01 08:07
2002.04.11
GetWinFlags


14-32978
Nest
2002-03-05 15:35
2002.04.11
Помогите пожалуйста выбрать MP3-CD плеЙер.


1-32734
Locked
2002-03-30 08:08
2002.04.11
Помогите пожалуйста!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский