Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Überprüfen ob ein Objekt existiert aber wie?

  Alt 27. Dez 2020, 21:40
Bei Copy kann man den letzten Parameter weglassen. Per Default geht es dann bis zum Ende.

Die letzte Schleife ist auch nutzlos, denn FindComponent ist zufällig eine Methode.
Form.FindComponent

Und wenn man dann alles rauskürzt, in etwas aktuelleren Delphis der letzten paar Jahre, dann
(das mit dem VAR seit 10.4)
Delphi-Quellcode:
function FindComponentEx(const Name: string): TComponent;
begin
  var Parts := Name.Split(['.']);
  if Length(Parts) <> 2 then
    raise Exception.Create('No valid name given');
  for var i := Screen.FormCount - 1 downto 0 do
    if AnsiSameText(Screen.Forms[i].Name, Parts[0]) then
      Exit(Screen.Forms[i].FindComponent(Parts[1]));
  Result := nil;
end;
Dann noch bissl weitergesucht und man findet Delphi-Referenz durchsuchenFindGlobalComponent, was auch noch die erste Schleife ersetzt.
Delphi-Quellcode:
function FindComponentEx(const Name: string): TComponent;
begin
  var Parts := Name.Split(['.']);
  if Length(Parts) <> 2 then
    raise Exception.Create('No valid name given');
  Result := FindGlobalComponent(Parts[0]); // TForm oder TDataMudule
  if Assigned(Result) then
    Exit(Result.FindComponent(Parts[1]));
  Result := nil;
end;
Und weil mir grad langweilig wurde ... naja
Delphi-Quellcode:
function FindComponentEx(Name: string): TComponent;
begin
  Name := Name.Replace('.', '|');
  Result := FindGlobalComponent(GetShortHint(Name));
  if Assigned(Result) then
    Result := Result.FindComponent(GetLongHint(Name));
end;

// oder
function FindComponentEx(Name: string): TComponent;
begin
  Assert(Name.Contains('.')); // Assert(ContainsStr(Name, '.'));
  Result := FindGlobalComponent(Name.Split(['.'])[0]);
  if Assigned(Result) then
    Result := Result.FindComponent(Name.Split(['.'])[1]);
end;

// oder
tausende andere Lösungswege
GetShortHint/GetLongHint sind Split-Funktionen, die eigentlich für was Anderes gedacht sind, aber die sind einfach zu praktisch,
auch wenn man sie mit einem Copy+Pos nachbauen kann.
GetShortHint(ReplaceStr(Name, '.', '|')) und Copy(Name, 1, Pos('.', Name - 1)) liefern das gleiche Result.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (27. Dez 2020 um 23:36 Uhr)
  Mit Zitat antworten Zitat