Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
1-100709
GSergei
2003-07-18 14:53
2003.07.31
Запущена ли служба?


14-100959
nick-from
2003-07-14 20:20
2003.07.31
17 элт монитор


14-100916
Viktor Kushnir
2003-07-13 09:18
2003.07.31
XML


14-100917
DeMoN-777
2003-07-14 11:16
2003.07.31
Домен


1-100813
Jakkie
2003-07-17 14:30
2003.07.31
Rtf->Plain text





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский