Форум: "Основная";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];
ВнизОтследить разрушение 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c