Здравствуйте, Аноним, Вы писали:
А>Здраствуйте!
А>Мучает вопрос:
А>Где код который выполняет вызов конструкторов элементов управления в форме и где код
А>котрый выполняет вызов деструкторов?
1.создаем новое приложение
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
// тут пишем:
constructor Create(Aowner : TComponent);override;
destructor destroy; override;
// и нажимаем ctrl+shift+C
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor TForm1.Create(Aowner: TComponent);
begin
inherited;// в этой строке ставим точку останова
end;
destructor TForm1.destroy;
begin
inherited; // в этой строке ставим точку останова
end;
end.
2.запускаем/закрываем программу и в точках останова смотрим стек вызовов (меню view->Debug windows->call stack)
Здравствуйте, Аноним, Вы писали:
А>Здраствуйте!
А>Мучает вопрос:
А>Где код который выполняет вызов конструкторов элементов управления в форме и где код
А>котрый выполняет вызов деструкторов?
Создание:
constructor TCustomForm.Create(AOwner: TComponent);
begin
GlobalNameSpace.BeginWrite;
try
CreateNew(AOwner);
if (ClassType <> TForm) and not (csDesigning in ComponentState) then
begin
Include(FFormState, fsCreating);
try
if not InitInheritedComponent(Self, TForm) then
raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);
finally
Exclude(FFormState, fsCreating);
end;
if OldCreateOrder then DoCreate;
end;
finally
GlobalNameSpace.EndWrite;
end;
end;
function InitInheritedComponent(Instance: TComponent; RootAncestor: TClass): Boolean;
function InitComponent(ClassType: TClass): Boolean;
begin
Result := False;
if (ClassType = TComponent) or (ClassType = RootAncestor) then Exit;
Result := InitComponent(ClassType.ClassParent);
Result := InternalReadComponentRes(ClassType.ClassName, FindResourceHInstance(
FindClassHInstance(ClassType)), Instance) or Result;
end;
var
LocalizeLoading: Boolean;
begin
GlobalNameSpace.BeginWrite; // hold lock across all ancestor loads (performance)
try
LocalizeLoading := (Instance.ComponentState * [csInline, csLoading]) = [];
if LocalizeLoading then BeginGlobalLoading; // push new loadlist onto stack
try
Result := InitComponent(Instance.ClassType);
if LocalizeLoading then NotifyGlobalLoading; // call Loaded
finally
if LocalizeLoading then EndGlobalLoading; // pop loadlist off stack
end;
finally
GlobalNameSpace.EndWrite;
end;
end;
function InternalReadComponentRes(const ResName: string; HInst: THandle; var Instance: TComponent): Boolean;
var
HRsrc: THandle;
begin { avoid possible EResNotFound exception }
if HInst = 0 then HInst := HInstance;
HRsrc := FindResource(HInst, PChar(ResName), RT_RCDATA);
Result := HRsrc <> 0;
if not Result then Exit;
with TResourceStream.Create(HInst, ResName, RT_RCDATA) do
try
Instance := ReadComponent(Instance);
finally
Free;
end;
Result := True;
end;
function TStream.ReadComponent(Instance: TComponent): TComponent;
var
Reader: TReader;
begin
Reader := TReader.Create(Self, 4096);
try
Result := Reader.ReadRootComponent(Instance);
finally
Reader.Free;
end;
end;
function TReader.ReadRootComponent(Root: TComponent): TComponent;
function FindUniqueName(const Name: string): string;
var
I: Integer;
begin
I := 0;
Result := '';
if Assigned(FindGlobalComponent) then
begin
Result := Name;
while FindGlobalComponent(Result) <> nil do
begin
Inc(I);
Result := Format('%s_%d', [Name, I]);
end;
end;
end;
var
I: Integer;
Flags: TFilerFlags;
begin
ReadSignature;
Result := nil;
GlobalNameSpace.BeginWrite; // Loading from stream adds to name space
try
try
ReadPrefix(Flags, I);
if Root = nil then
begin
Result := TComponentClass(FindClass(ReadStr)).Create(nil);
Result.Name := ReadStr;
end else
begin
Result := Root;
ReadStr; { Ignore class name }
if csDesigning in Result.ComponentState then
ReadStr else
begin
Include(Result.FComponentState, csLoading);
Include(Result.FComponentState, csReading);
Result.Name := FindUniqueName(ReadStr);
end;
end;
FRoot := Result;
FLookupRoot := Result;
if GlobalLoaded <> nil then
FLoaded := GlobalLoaded else
FLoaded := TList.Create;
try
if FLoaded.IndexOf(FRoot) < 0 then
FLoaded.Add(FRoot);
FOwner := FRoot;
Include(FRoot.FComponentState, csLoading);
Include(FRoot.FComponentState, csReading);
FRoot.ReadState(Self);
Exclude(FRoot.FComponentState, csReading);
if GlobalLoaded = nil then
for I := 0 to FLoaded.Count - 1 do TComponent(FLoaded[I]).Loaded;
finally
if GlobalLoaded = nil then FLoaded.Free;
FLoaded := nil;
end;
GlobalFixupReferences;
except
RemoveFixupReferences(Root, '');
if Root = nil then Result.Free;
raise;
end;
finally
GlobalNameSpace.EndWrite;
end;
end;
procedure TComponent.ReadState(Reader: TReader);
begin
Reader.ReadData(Self);
end;
procedure TReader.ReadData(Instance: TComponent);
begin
if FFixups = nil then
begin
FFixups := TList.Create;
try
ReadDataInner(Instance);
DoFixupReferences;
finally
FreeFixups;
end;
end else
ReadDataInner(Instance);
end;
procedure TReader.ReadDataInner(Instance: TComponent);
var
OldParent, OldOwner: TComponent;
begin
while not EndOfList do ReadProperty(Instance);
ReadListEnd;
OldParent := Parent;
OldOwner := Owner;
Parent := Instance.GetChildParent;
try
Owner := Instance.GetChildOwner;
if not Assigned(Owner) then Owner := Root;
while not EndOfList do ReadComponent(nil);
ReadListEnd;
finally
Parent := OldParent;
Owner := OldOwner;
end;
end;
// И, наконец, само создание дочерних компонент
function TReader.ReadComponent(Component: TComponent): TComponent;
var
CompClass, CompName: string;
Flags: TFilerFlags;
Position: Integer;
OldParent, OldLookupRoot: TComponent;
function ComponentCreated: Boolean;
begin
Result := not (ffInherited in Flags) and (Component = nil);
end;
function Recover(var Component: TComponent): Boolean;
begin
Result := False;
if not (ExceptObject is Exception) then Exit;
if ComponentCreated then Component.Free;
Component := nil;
SkipComponent(False);
Result := Error(Exception(ExceptObject).Message);
end;
procedure CreateComponent;
var
ComponentClass: TComponentClass;
begin
try
ComponentClass := FindComponentClass(CompClass);
Result := nil;
if Assigned(FOnCreateComponent) then
FOnCreateComponent(Self, ComponentClass, Result);
if Result = nil then
begin
Result := TComponent(ComponentClass.NewInstance);
if ffInline in Flags then
begin
Include(Result.FComponentState, csLoading);
Include(Result.FComponentState, csInline);
end;
try
Result.Create(Owner);
except
Result := nil;
raise;
end;
end;
Include(Result.FComponentState, csLoading);
except
if not Recover(Result) then raise;
end;
end;
procedure SetCompName;
begin
try
Result.SetParentComponent(Parent);
SetName(Result, CompName);
if Assigned(FindGlobalComponent) and
(FindGlobalComponent(CompName) = Result) then
Include(Result.FComponentState, csInline);
except
if not Recover(Result) then raise;
end;
end;
procedure FindExistingComponent;
begin
try
Result := FindAncestorComponent(CompName, FindComponentClass(CompClass));
Parent := Result.GetParentComponent;
if Parent = nil then Parent := Root;
except
if not Recover(Result) then raise;
end;
end;
begin
ReadPrefix(Flags, Position);
CompClass := ReadStr;
CompName := ReadStr;
OldParent := Parent;
OldLookupRoot := FLookupRoot;
try
Result := Component;
if Result = nil then
if ffInherited in Flags then
FindExistingComponent else
CreateComponent;
if Result <> nil then
try
Include(Result.FComponentState, csLoading);
if not (ffInherited in Flags) then SetCompName;
if Result = nil then Exit;
if csInline in Result.ComponentState then
FLookupRoot := Result;
Include(Result.FComponentState, csReading);
Result.ReadState(Self);
Exclude(Result.FComponentState, csReading);
if ffChildPos in Flags then Parent.SetChildOrder(Result, Position);
if (ffInherited in Flags) or (csInline in Result.ComponentState) then
begin
if FLoaded.IndexOf(Result) < 0 then
FLoaded.Add(Result)
end
else
FLoaded.Add(Result);
except
if ComponentCreated then Result.Free;
raise;
end;
finally
Parent := OldParent;
FLookupRoot := OldLookupRoot;
end;
end;
//////////////////////////////////////////////////////////////////////////////////////////
Уничтожение:
destructor TComponent.Destroy;
var
I: Integer;
begin
Destroying;
if FFreeNotifies <> nil then
begin
for I := FFreeNotifies.Count - 1 downto 0 do
begin
TComponent(FFreeNotifies[I]).Notification(Self, opRemove);
if FFreeNotifies = nil then Break;
end;
FFreeNotifies.Free;
FFreeNotifies := nil;
end;
DestroyComponents;
if FOwner <> nil then FOwner.RemoveComponent(Self);
inherited Destroy;
end;
procedure TComponent.DestroyComponents;
var
Instance: TComponent;
begin
while FComponents <> nil do
begin
Instance := FComponents.Last;
if (csFreeNotification in Instance.FComponentState)
or (FComponentState * [csDesigning, csInline] = [csDesigning, csInline]) then
RemoveComponent(Instance)
else
Remove(Instance);
Instance.Destroy;
end;
end;
Hello, s.ts!
Ты главное забыл:
Project/Options/Compiler/Use Debug DCUs [x]
--
[tip] Fix for Outlook Express quoting:
http://Arioch.nm.ru/FL/Fidolook_SL.png
E-mail is faked because of spam. the_Arioch@NM.falseDomain.ru
Posted via RSDN NNTP Server 1.8 beta