Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.31;
Скачать: CL | DM;

Вниз

Отследить разрушение TControl (TForm, TFrame)   Найти похожие ветки 

 
s.ts   (2003-07-08 15:58) [0]

подскажите пожалуйста можно ли отследить как-нибудь начало разрушения TControl (TForm, TFrame)

Задача заключается в сохранении его (контрола) свойств (property) перед удалением.

Пока есть только одна идея, которая не нравится:
создать невидимый контрол с Parent= тому, за кем "следим" и при его удалении сохранять Parent-а...

Может найдутся решения получше ???


 
Radionov Alexey ©   (2003-07-08 16:00) [1]

OnDestroy?


 
s.ts   (2003-07-08 16:07) [2]

>> Radionov Alexey
>> OnDestroy?

Это только у TCustomForm.
К тому же это событие может уже использоваться (и изменяться динамически )


 
BOA_KAA ©   (2003-07-08 16:10) [3]

OnCloseQuery?


 
VMcL ©   (2003-07-08 16:11) [4]

>s.ts (08.07.03 15:58)

BeforeDestruction


 
Radionov Alexey ©   (2003-07-08 16:13) [5]

В RxLib есть T(Form?)Storage чего-то там. Посмотри его реализацию. Там как разто, что ты спрашиваешь


 
yaJohn ©   (2003-07-08 16:21) [6]

В поставленной формулировке (произвольный контрол) видится только одно решение: через свой мемори-манагер...
Мда, не помню, Notification до или после смерти компонента вызывается?


 
s.ts   (2003-07-08 16:36) [7]

>>BOA_KAA © (08.07.03 16:10)
>>OnCloseQuery
Это только для форм

>>VMcL © (08.07.03 16:11)
>>>s.ts (08.07.03 15:58)
>>BeforeDestruction
в серединку не влезть - контрол-то не свой, а любой

>>Radionov Alexey © (08.07.03 16:13)
>>В RxLib есть T(Form?)Storage чего-то там. Посмотри его >>реализацию. Там как разто, что ты спрашиваешь
Там, насколько я помню, подменяются обработчики при чем для формы - это не подходит (уже писал об этом выше).

>>yaJohn © (08.07.03 16:21)
>>В поставленной формулировке (произвольный контрол) видится >>только одно решение: через свой мемори-манагер...
память освобождается после того, как деструктор отработает

>>Мда, не помню, Notification до или после смерти компонента >>вызывается?
До смерти компонента, но не контрола. К моменту вызова notification от контрола как такового уже мало что останется


 
MalkoLinge ©   (2003-07-08 18:29) [8]

Я бы на вашем месте обрисовал бы проблему...


 
s.ts   (2003-07-08 18:39) [9]

Нужно сохранять свойства контролов при их уничтожении (в основном это формы и фреймы, но возможны и другие контролы).
Проблема лишь в том, что этот самый момент уничтожения не поймать.
События на это действие (уничтожение) существуют только у TCustomForm и у TDataModule, хотя, и они не являются панацеей, т.к. если я установлю свой обработчик (запомнив предыдущий), то в run-time его смогут спокойно затереть.
Возможное решение - в первом сообщении темы , но не нравится оверхед.


 
vuk ©   (2003-07-08 21:35) [10]

to s.ts:
Когда решал, что делать с сохранением свойств, то подход был такой - если нельзя это сделать гарантировано и автоматически, то лучше пусть сохранение вызывается только явно из кода. Оно так надежнее и является единственным универсальным решением. Опять же никакого оверхеда и привязки к реализации TForm, TFrame или TDataModule. К тому же для разных случаев место вызова сохранения свойств может оказаться разным.




 
Ученик ©   (2003-07-09 00:15) [11]

Изврат :-)

var
BeforeDestructionInfo: TStringList;

procedure MyBeforeDestruction(aObject: TObject);
var
BeforeConstructionAddress: procedure (aSelf: Pointer);
begin
MessageBox(0, PChar(string(aObject.ClassName)), "ClassInfo", 0);
with BeforeDestructionInfo do
BeforeConstructionAddress := Pointer(Objects[IndexOf(IntToHex(Integer(aObject.ClassType), 8))]);
BeforeConstructionAddress(aObject)
end;

procedure InjectClass(AClass: TClass);
var
BeforeConstructionAddress: ^Pointer;
dwOldProtect: DWord;
begin
BeforeConstructionAddress := Pointer(PChar(AClass) + vmtBeforeDestruction);
if BeforeConstructionAddress^ <> @MyBeforeDestruction then begin
BeforeDestructionInfo.AddObject(IntToHex(Integer(AClass), 8), TObject(BeforeConstructionAddress^));
if VirtualProtect(BeforeConstructionAddress, 4, PAGE_READWRITE, dwOldProtect) then try
BeforeConstructionAddress^ := @MyBeforeDestruction
finally
VirtualProtect(BeforeConstructionAddress, 4, dwOldProtect, dwOldProtect)
end
end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
InjectClass(Self.ClassType);
InjectClass(Button1.ClassType);
end;

initialization
BeforeDestructionInfo := TStringList.Create;
finalization
BeforeDestructionInfo.Free
end.


 
Ученик ©   (2003-07-09 00:18) [12]

Сорри, с названиями запутка, еще вариант

var
BeforeDestructionInfo: TStringList;

procedure MyBeforeDestruction(aObject: TObject);
var
BeforeDestructionAddress: procedure (aSelf: Pointer);
begin
MessageBox(0, PChar(string(aObject.ClassName)), "ClassInfo", 0);
with BeforeDestructionInfo do
BeforeDestructionAddress := Pointer(Objects[IndexOf(IntToHex(Integer(aObject.ClassType), 8))]);
BeforeDestructionAddress(aObject)
end;

procedure InjectClass(AClass: TClass);
var
BeforeDestructionAddress: ^Pointer;
dwOldProtect: DWord;
begin
BeforeDestructionAddress := Pointer(PChar(AClass) + vmtBeforeDestruction);
if BeforeDestructionAddress^ <> @MyBeforeDestruction then begin
BeforeDestructionInfo.AddObject(IntToHex(Integer(AClass), 8), TObject(BeforeDestructionAddress^));
if VirtualProtect(BeforeDestructionAddress, 4, PAGE_READWRITE, dwOldProtect) then try
BeforeDestructionAddress^ := @MyBeforeDestruction
finally
VirtualProtect(BeforeDestructionAddress, 4, dwOldProtect, dwOldProtect)
end
end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
InjectClass(Self.ClassType);
InjectClass(Button1.ClassType);
end;

initialization
BeforeDestructionInfo := TStringList.Create;
finalization
BeforeDestructionInfo.Free
end.


 
s.ts   (2003-07-16 18:21) [13]

а какой аналог VirtualProtect есть в Linux ?



Страницы: 1 вся ветка

Текущий архив: 2003.07.31;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
3-100544
Spawn
2003-07-10 21:39
2003.07.31
Ссылочная целостность


3-100598
Spawn
2003-07-08 15:43
2003.07.31
InterBase


8-100832
SDS
2003-02-28 16:39
2003.07.31
Как создать TMetafileCanvas


3-100636
Cranium
2003-07-08 20:15
2003.07.31
Значения по умолчнию


14-100887
handra
2003-07-15 18:11
2003.07.31
другая сторона жизни