Главная страница
    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.009 c
8-100838
RBear
2003-04-08 15:53
2003.07.31
Проблема с картинко в OpenGL


7-101006
Freeze
2003-05-20 09:09
2003.07.31
Народ ХелП Надо вызвать командную строку!!!


4-101037
fool
2003-05-29 11:23
2003.07.31
Печать из Word


14-100896
clickmaker
2003-07-11 20:04
2003.07.31
Офис 2000 и ХР не ставится на 2000 сервак (!!!)


1-100802
tipman
2003-07-17 10:54
2003.07.31
разделитель целой и дрбной части





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