Delphi-Quellcode:
dm := TdmFoo.Create(nil);
try
result := TfrmFoo.Create(AOwner);
result.DataModule := dm; // für Zugriffe auf das Datenmodul im Code
dm.Owner := result; // oder result.InsertComponent(dm); mit dm.Owner.RemoveComponent(dm) wenn dm.Owner<>nil
dm.Name := '';
except
dm.Free;
raise;
end;
Ich weiß, das Owner-Property ist ReadOnly, aber eigentlich ist die Owner-Beziehung das nicht.
Delphi-Quellcode:
type
TComponentHelper =
class helper
for TComponent
private
function GetOwner: TComponent;
procedure SetOwner(NewOwner: TComponent);
public
property Owner: TComponent
read GetOwner
write SetOwner;
function SecureOwner: TComponent;
// if Assigned(Self) then Result:=Owner else Result:=nil;
function SecureName:
string;
{$REGION 'Documentation'}
/// <summary>
/// Setzt C.Name für das Error-Logging, wenn das nicht geht, dann wird eine ID angehängt. (z.B. zwei mal
/// DB.LoadBool zur selben Zeit)
/// </summary>
{$ENDREGION}
procedure SetErrorName(NewName:
string);
end;
{ TComponentHelper }
function TComponentHelper.GetOwner: TComponent;
begin
Result :=
inherited Owner;
end;
function TComponentHelper.SecureName:
string;
begin
if not Assigned(Self)
then
Result := '
(nil)'
else
try
Result :=
Name;
except
Result := '
(except)';
end;
end;
function TComponentHelper.SecureOwner: TComponent;
begin
if not Assigned(Self)
then
Result :=
nil
else
try
Result :=
inherited Owner;
except
Result :=
nil;
end;
end;
procedure TComponentHelper.SetErrorName(NewName:
string);
begin
try
if Name = NewName
then
Exit;
if (NewName <> '
')
and Assigned(Owner)
and Assigned(Owner.FindComponent(NewName))
then
Name := NewName + Format('
_%p', [Pointer(Self)])
else
Name := NewName;
except
end;
end;
procedure TComponentHelper.SetOwner(NewOwner: TComponent);
begin
if Assigned(NewOwner)
then
NewOwner.InsertComponent(Self)
else if Assigned(Owner)
then
Owner.RemoveComponent(Self);
end;