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
FindGlobalComponent, 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.