Вверх ↑
Этот топик читают: Гость
Ответов: 4621
Рейтинг: 746
#16: 2017-11-22 15:47:54 ЛС | профиль | цитата
3042 писал(а):
не нашёл, откуда вызывается THIMainForm.Start, никто не в курсе?

project.dpr


Program HiAsm;
{$ifdef F_P} {$APPTYPE GUI} {$endif}
{$R allres.res}
uses
hiMainForm_283B7E0,
Windows,
kol,Share;

begin
if ParamStr(1) = '/ih' then
begin
MessageBox(0,'Сделано в HiAsm.','HiAsm Info',MB_OK);
Halt;
end;
ClassMain := TClassMainForm_283B7E0.Create;
ClassMain.MainForm_283B7E0.Start; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Run(Applet);
ClassMain.Destroy;
end.

3042 писал(а):
А почему оттуда? InitDo из mainform же вызывается.
Чесно говоря, сам не очень понимаю почему.
По мне, так логично исходник должен выглядеть так:

project.dpr


begin
ClassMain := TClassMainForm_283B7E0.Create;
InitDo();
ClassMain.MainForm_283B7E0.Start;
Run(Applet);
FinalDo();
ClassMain.Destroy;
end.

Редактировалось 1 раз(а), последний 2017-11-22 16:32:59
карма: 26

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#17: 2017-11-22 16:04:44 ЛС | профиль | цитата
А событие onDestroy не прокатит для этих целей? Те перед полным уничтожением из деструктора вызывается это событие, делаются нужные действия, а после возврата объект уничтожается уже самим деструктором.
карма: 22

0
Ответов: 1925
Рейтинг: 172
#18: 2017-11-22 16:18:35 ЛС | профиль | цитата
3042 писал(а):
в MainForm обрабатывается WM_CLOSE, после чего вызывается _onClose. Там ещё все контролы существуют, ведь происходит вызов _prop_Position(true), к-е сохраняет позицию формы.


Вот в _onClose-то и можно вставить FinalDo(). И в dpr не придётся лезть.

--- Добавлено в 2017-11-22 16:24:49

Netspirit, это уже после кодогенератора, а где-то же должно быть прописано, что вставлять в project.dpr. Но я уже нашёл - в make_exe.dpr.


Res.Add('  ClassMain.' + p.MainForm + '.Start;');

Редактировалось 2 раз(а), последний 2017-11-22 16:24:49
карма: 9
0
Ответов: 4621
Рейтинг: 746
#19: 2017-11-22 16:29:00 ЛС | профиль | цитата
nesco писал(а):
Те перед полным уничтожением из деструктора вызывается это событие
Имеется в виду onDestroy MainForm? Это смотря откуда вызвать: если из деструктора MainForm, то MainForm уничтожается последней и на момент деструктора остальных компонентов уже не существует. Все равно требует вызова из *.dpr, как сделано для Start.

3042 писал(а):
Вот в _onClose-то и можно вставить FinalDo(). И в dpr не придётся лезть.
Мне чего это показалось нелогичным: это всё приходится дублировать в главном компоненте для каждого типа проектов. А раз оно все равно должно присутствовать там, то зачем морочиться, если можно сделать в одном месте?
карма: 26

0
Ответов: 1925
Рейтинг: 172
#20: 2017-11-22 16:54:22 ЛС | профиль | цитата
Посмотрим, что nesco скажет. Было бы замечательно иметь возможность вставлять свои функции для вызова перед закрытием.
карма: 9
0
Ответов: 4621
Рейтинг: 746
#21: 2017-11-22 17:03:09 ЛС | профиль | цитата
Например, это очень нужно для ожидания завершения параллельных потоков.
карма: 26

0
Ответов: 5227
Рейтинг: 588
#22: 2017-11-22 21:07:30 ЛС | профиль | цитата
nesco писал(а):
А событие onDestroy не прокатит для этих целей? Те перед полным уничтожением из деструктора вызывается это событие, делаются нужные действия, а после возврата объект уничтожается уже самим деструктором.


Раз несколько уже предлагал оживить свойство Name в Win.pas; т.е там как раз всё просто осуществлять задуманное 3042, ну х.з что там не срастается у вас.

3042, про твой случай


Add(MainForm,2953706,175,119)
{
}
Add(Edit,13545452,245,119)
{
Left=75
Top=145
Width=215
Point(PHandle)
}
Add(InlineCode,7379325,252,175)
{
@Hint=#10:SRData 2.0|
DataPoints=#5:dtPH_|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|24: fControl: PControl;|40: procedure _OnDestroy(Sender: PObj);|10: public |21: dtPH_: THI_Event;|19: procedure Init;|23: constructor Create;|5: end;|0:|14:implementation|0:|27:procedure THiAsmClass.Init;|6:begin |36: fControl := ReadControl(dtPH_,'');|35: fControl.OnDestroy := _OnDestroy;|4:end;|0:|31:constructor THiAsmClass.Create;|5:begin|18: inherited Create;|16: InitAdd(Init); |4:end;|0:|33:procedure THiAsmClass._OnDestroy;|5:begin|96: _debug('Тут собственно и должен выполнятся код, причём Sender и будет указателем на контрол');|33: _debug(PControl(Sender).Text); |4:end;|0:|4:end.|
link(dtPH_,13545452:PHandle,[])
}

карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 1925
Рейтинг: 172
#23: 2017-11-22 21:42:10 ЛС | профиль | цитата
andrestudio, можно поподробнее про Name? Свойство я видел, но оно относится к классу THIWin, но никак не к PControl, т.е. перебор контролов поимённо сделать не получится, ИМХО. Ну, или у меня не хватает ума.

andrestudio писал(а):
3042, про твой случай

Т.е. получается, мы переназначили обработчик, ну а если в старом обработчике объекта был какой-то код, он уже не выполнится?
карма: 9
0
Ответов: 5227
Рейтинг: 588
#24: 2017-11-22 21:57:08 ЛС | профиль | цитата
3042 писал(а):
Т.е. получается, мы переназначили обработчик, ну а если в старом обработчике объекта был какой-то код, он уже не выполнится?

Это же просто пример, кто мешает в коде проверить наличие этого метода и вызвать его в конце своего по указателю. Т.е трюки как с обычными message, пробуй.

3042 писал(а):
т.е. перебор контролов поимённо сделать не получится, ИМХО. Ну, или у меня не хватает ума.

получится ещё как, и уже давно работает. За подробностями пытай коллегу sla8a http://forum.hiasm.com/topic/63585/0
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 1925
Рейтинг: 172
#25: 2017-11-22 22:28:25 ЛС | профиль | цитата
andrestudio писал(а):
кто мешает в коде проверить наличие этого метода и вызвать его в конце своего по указателю. Т.е трюки как с обычными message, пробуй.

А можно небольшой пример? А то опыта в этой области совсем нет.
карма: 9
0
Ответов: 5227
Рейтинг: 588
#26: 2017-11-23 04:54:15 ЛС | профиль | цитата
3042, уже давно не практикую кодированием (нет времени), ну примерно так...

Add(MainForm,2953706,175,119)
{
}
Add(Edit,13545452,245,119)
{
Left=75
Top=145
Width=215
Point(PHandle)
}
Add(InlineCode,7379325,252,175)
{
@Hint=#10:SRData 2.0|
DataPoints=#5:dtPH_|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|5:type |53: TOldOnDestroy = procedure (Sender: PObj) of object;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|24: fControl: PControl;|34: fOldOnDestroy: TOldOnDestroy;|40: procedure _OnDestroy(Sender: PObj);|10: public |21: dtPH_: THI_Event;|19: procedure Init;|23: constructor Create;|5: end;|0:|14:implementation|0:|27:procedure THiAsmClass.Init;|5:begin|42: fControl := nil; fOldOnDestroy := nil; |36: fControl := ReadControl(dtPH_,'');|75: if Assigned(fControl.OnDestroy) then fOldOnDestroy := fControl.OnDestroy;|35: fControl.OnDestroy := _OnDestroy;|4:end;|0:|31:constructor THiAsmClass.Create;|5:begin|19: inherited Create;|17: InitAdd(Init); |4:end;|0:|33:procedure THiAsmClass._OnDestroy;|5:begin|96: _debug('Тут собственно и должен выполнятся код, причём Sender и будет указателем на контрол');|34: //_debug(PControl(Sender).Text);|55: // ну собственно и вызываем родной метод если он есть|57: if Assigned(fOldOnDestroy) then fOldOnDestroy(Sender); |4:end;|0:|4:end.|
link(dtPH_,13545452:PHandle,[])
}


в hiEdit сделай сам метод:

private
...
procedure _OnDestroy(Sender: PObj);
...

procedure THIEdit.Init;
begin
...
inherited;
Control.Perform(em_LimitText,_prop_MaxLenField, 0);
Control.OnChange := _OnChange;
Control.OnDestroy := _OnDestroy; // <-
...
end;

ну и сам метод типа

procedure THIEdit._OnDestroy;
begin
_debug ('это старый метод события перед деструктором');
end;
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
1
Голосовали:3042
Ответов: 4621
Рейтинг: 746
#27: 2017-11-23 11:54:39 ЛС | профиль | цитата
andrestudio писал(а):
получится ещё как, и уже давно работает. За подробностями пытай коллегу sla8a http://forum.hiasm.com/topic/63585/0
Я как-то упустил ту тему. Как я понял, там работающий вариант предложил nesco с ведением списка контролов. Реализовано это было только для визуальных компонентов (ThiWin).
Я считаю, првильным вариантом было бы реализовать это как в дельфийском TComponent: каждый компонент наследуется от общего класса, у которого есть:
- свойство, указывающее на его хозяина (owner)
- список всех его дочерних элементов (Child[i])
- метод, которым хозяин информирует дочерние элементы о том, что они будут уничтожены (Notification). Дочерние элементы добавляют/удаляют себя из списка хозяина. Тогда каждый элемент может узнать в каком контейнере он находится и получить доступ к остальным элементам.
карма: 26

0
Ответов: 2059
Рейтинг: 131
#28: 2017-11-23 12:38:12 ЛС | профиль | цитата
Netspirit писал(а):
Я считаю, правильным вариантом было бы реализовать это как в дельфийском TComponent: ...
...
Тогда каждый элемент может узнать в каком контейнере он находится и получить доступ к остальным элементам.

Да, именно так. Будет очень здорово.
карма: 6

0
Ответов: 1925
Рейтинг: 172
#29: 2017-11-23 14:00:23 ЛС | профиль | цитата
Netspirit писал(а):
Я считаю, првильным вариантом было бы реализовать это как в дельфийском TComponent: каждый компонент наследуется от общего класса, у которого есть:
- свойство, указывающее на его хозяина (owner)
- список всех его дочерних элементов (Child[i])
- метод, которым хозяин информирует дочерние элементы о том, что они будут уничтожены (Notification).


Так это вроде есть. Control.Children[i] и Control.Parent имеются, Perform тоже никто не отменял.
карма: 9
0
Ответов: 4621
Рейтинг: 746
#30: 2017-11-23 14:11:52 ЛС | профиль | цитата
А невизуальные компоненты, у которых нет Control? А как по Control получить доступ к соответствующему ThiWin?
карма: 26

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)