Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#12

AW: Form + DataModule mehrere Instanzen

  Alt 31. Jul 2017, 13:26
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (31. Jul 2017 um 13:42 Uhr)
  Mit Zitat antworten Zitat