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

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

Как отловить сообщение? [D7, WinXP]


liho26 ©   (2002-11-20 08:51:00) 

Привет всем!
Я создаю дополнительную форму по клику меню таким образом


if not Assigned(Form2) then
begin
Form2:=TForm2.Create(Application);
Form2.Show;
end;


На этой фромочке находится TMemo. Перед самым закрытием надо из него забрать текст.
Как это зделать?


liho26   (2002-11-21 08:05:00) [1]

To KoluChi
Этот код делает совершенно противоположное от того, что требуется.

if not Assigned(Form2) then
begin
Form2:=TForm2.Create(Application);
Form2.ReturnStrings := Memo1.Lines;
Form2.Show;
end

Надо наоборот из второй (созданной формы) забрать данные перед ее уничтожением!


Вообще, после вчерашнего сражения с Делфи я уже далеко за полночь нашел таки решение данной проблемы.

Если есть потомок, значит есть главная форма. Ок, будем ловить сообщения от потомка в главной форме. Для этого перед закрытием дочерней формы посылаем в главную пользовательское сообщение.
PostMessage(Application.MainForm.Handle,SX_MESSAGE,0,0);

Где SX_MESSAGE это пользовательское сообщение, которое я определил как
const const SX_MESSAGE = WM_USER+100;

теперь в главной форме достаточно отловить это сообщение и выполнить необходимый код. Вот, собственно и все.
Спасибо всем за помощь. Тема закрыта


Smithson   (2002-11-20 14:41:00) [2]

Перекрестные ссылки - это ересь, возникшая от модульной структуры языка паскаль.
Описываешь модули в Implementation обоих модулей - и все работает.
Насчет application - если delphi старше 5, то есть объект ApplicationEvent - он как раз ловит сообщения application.


KoluChi   (2002-11-20 14:11:00) [3]

TForm2 = class
...
ReturnStrings: TStrings;
..
end;

implementation

//------------------------------------
if not Assigned(Form2) then
begin
Form2:=TForm2.Create(Application);
Form2.ReturnStrings := Memo1.Lines;
Form2.Show;
end
//------------------------------------
procedure Form2.OnClose(Sender: TObject; var Action: TCloseAction );
begin
if Assigned(ReturnMemo) then
ReturnStrings.Text := Memo1.Lines.Text;
// а если еще охота уничтожить форму
Action := caFree;
Form2 := nil;
end;



KoluChi   (2002-11-20 14:03:00) [4]

Вариант apay © (20.11.02 09:22)
SomeVar - глобальная переменная (Interface)


liho26   (2002-11-20 12:40:00) [5]

Оба варианта не подходят. Ибо из первая форма использует в uses вторую. Вторая не может использовать первую, дабы избежать перекрестных ссылок. Что, в свою очередь, не есть хорошо. Следовательно первая видит вторую, а вторая не видит первую. Данные надо передать из второй формы в первую.

Smithson я уже понял, что сообщения первая форма не видит сообщения второй.
А как сообщения ловить через Application я не могу понять

Вообще, для меня отлов и посылка сообщений - белое пятно


Song   (2002-11-20 11:45:00) [6]

Дык вставь Form1.Memo1.Lines.Assign(Memo2.Lines) в OnClose второй формы.


Smithson   (2002-11-20 11:45:00) [7]

Вместо SomeVar подставь Form1.Memo1.Text
Хотя можешь и сообщения ловить, но только это надо делать через Application - одна форма не увидит команду на закрытие другой


liho26   (2002-11-20 11:42:00) [8]

Это все понятно. Мне надо автоматизировать все это хозяйство. Необходимо, чтобы после закрытия второй формы текст автоматический отображался в Memo первой формы. Чую, что надо какое-то сообщение отлавливать, но какое и где ( и как) ума не приложу. Помогайте, плиз!


apay   (2002-11-20 09:22:00) [9]


procedure Form2.OnClose(Sender: TObject; var Action: TCloseAction );
begin
SomeVar := Memo1.Lines.Text;
// а если еще охота уничтожить форму
Action := caFree;
Form2 := nil;
end;


Наверх

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