Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Prism Control suchen (https://www.delphipraxis.net/46624-control-suchen.html)

HomerGER 28. Mai 2005 12:53


Control suchen
 
Hallo
ich versuche eine Control in meiner WinForm zu finden ;-)

meine Function
Delphi-Quellcode:
Function Finde(sender : control; const c_name_s : String) : Control;
var
c_ctrl : Control;
begin
  Result := NIL;
  for c_ctrl in sender.Controls do
  begin
    //Rekursiv
    Finde(c_ctrl, c_name_s);
    if (c_ctrl.Name = c_name_s) then
    begin
      Result := c_ctrl;
      Exit;
    end;
  end;
end;
der aufruf dann g_hf ist die Winform
die control befindet sich in ein Panel
Delphi-Quellcode:
Procedure Test();
var
i : Integer;
c_s : String;
begin
  //Namen TextBoxen
  for i := 1 to 2 do
  begin
    c_s := 'B_Text' + i.ToString;
    if (Finde(g_hf, c_s) is TextBox) then
    begin
      (Finde(g_hf, c_s) as TextBox).Text := '';
    end;
  end;
end;
nur leider macht meine TextBox nix :-(

kann mir jemand weiter helfen?

Homer

marabu 28. Mai 2005 13:13

Re: Control suchen
 
Hallo Homer,

hat ein Control auf einer WinForm keine Methode FindChildControl() mehr?
Wenn nicht, dann würde ich mir deine Such-Routine eher so vorstellen:

Delphi-Quellcode:
Function Finde(sender : control; const c_name_s : String) : Control;
var
  c_ctrl : Control;
begin
  Result := NIL;
  for c_ctrl in sender.Controls do begin
    if (c_ctrl.Name = c_name_s)
      then Result := c_ctrl
      else Result := Finde(c_ctrl, c_name_s);
    if Assigned(Result) then
      Exit;
  end;
end;
Dabei suchst du depth-first.

Grüße vom marabu

HomerGER 28. Mai 2005 13:37

Re: Control suchen
 
hallo marabu

die function gibt ja die control wieder !!!!
wenn ich der function zum testen diesen aufruf starte

(Mit deinen geänderten code)
Delphi-Quellcode:
Function Finde(sender : control; const c_name_s : String) : Control;
var
c_ctrl : Control;
begin
  Result := NIL;
  for c_ctrl in sender.Controls do
  begin
    //Rekursiv
    if (c_ctrl.Name = c_name_s) then
    begin
      Result := c_ctrl;
      (c_ctrl as TextBox).Text := '';  <-------Aufruf
    end
    else
    begin
      Finde(c_ctrl, c_name_s);
    end;
    if Assigned(Result) then
    begin
      Exit;
    end;
  end;
end;
macht er es

nur der aufruf über die Proocedure macht er nicht

Delphi-Quellcode:
Procedure Test();
var
i : Integer;
c_s : String;
begin
  //Namen TextBoxen
  for i := 1 to 2 do
  begin
    c_s := 'B_Text' + i.ToString;
    if (Finde(g_hf, c_s) is TextBox) then
    begin
      (Finde(g_hf, c_s) as TextBox).Text := '';
    end;
  end;
end;
wenn ich die Function so ändere
das ich explizit die Übergeordnetet Control angebe
funktioniert es auch

aber ich wollte die Function so das ich nur die Form angebe

marabu 28. Mai 2005 14:24

Re: Control suchen
 
Hallo Homer,

du hast in der Hitze des Gefechts die Zuweisung an Result vergessen. So findet keine rekursive Suche statt.

marabu

HomerGER 28. Mai 2005 14:30

Re: Control suchen
 
Zitat:

Zitat von marabu
Hallo Homer,

du hast in der Hitze des Gefechts die Zuweisung an Result vergessen. So findet keine rekursive Suche statt.

marabu

????

Ich bekomme doch die Control über meine Function zurück nur ich kann ihr nicht zuweisen

Die Muhkuh 28. Mai 2005 14:50

Re: Control suchen
 
Zitat:

Zitat von HomerGER
Zitat:

Zitat von marabu
Hallo Homer,

du hast in der Hitze des Gefechts die Zuweisung an Result vergessen. So findet keine rekursive Suche statt.

marabu

????

Ich bekomme doch die Control über meine Function zurück nur ich kann ihr nicht zuweisen

Hi,

ich glaube er meint das:

[delphi]Function Finde(sender : control; const c_name_s : String) : Control;
var
c_ctrl : Control;
begin
Result := NIL;
for c_ctrl in sender.Controls do
begin
//Rekursiv
if (c_ctrl.Name = c_name_s) then
begin
Result := c_ctrl;
(c_ctrl as TextBox).Text := '';
end
else
begin
Result := Finde(c_ctrl, c_name_s); <----- Das
end;
if Assigned(Result) then
begin
Exit;
end;
end;
end;

marabu 28. Mai 2005 14:53

Re: Control suchen
 
Hallo Homer,

(1) ich kenne nur Delphi bis Version 7. Bei mir müsste die Suchroutine im Else-Zweig der Iterationsschleife so aussehen:

Delphi-Quellcode:
Result := Finde(c_ctrl, c_name_s);
Nur so erhältst du ein Ergebnis, wenn das gesuchte Control einen Abstand größer 1 (im Control-Baum) hat.

(2) Den Testaufruf würde ich so erwarten:

Delphi-Quellcode:
Procedure Test();
var
  i : Integer;
begin
  for i := 1 to 2 do
    Finde(g_hf, 'B_Text' + i.ToString).Text := '';
end;
Aber wie schon erwähnt bin ich mit den Neuerungen von Delphi nicht genügend vertraut. Vielleicht machst du alles richtig und ich sehe nur weiße Mäuse.

marabu

@Spider: danke dir, habe zu lange getippt...

HomerGER 28. Mai 2005 15:00

Re: Control suchen
 
nein, der fehler war wirklich wir ihr gesagt habt
das rekursive Result

das habe ich komplett übersehen

:oops: :oops: :oops:

Delphi-Quellcode:
Function Finde(sender : control; const c_name_s : String) : Control;
var
c_ctrl : Control;
begin
  Result := NIL;
  for c_ctrl in sender.Controls do
  begin
    //Rekursiv
    if (c_ctrl.Name = c_name_s) then
    begin
      Result := c_ctrl;
    end
    else
    begin
      Result := Finde(c_ctrl, c_name_s);
    end;
    if Assigned(Result) then
    begin
      Exit;
    end;
  end;
end;

ich neige mein Haupt und sage Dankeschön

Homer


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz