![]() |
Control suchen
Hallo
ich versuche eine Control in meiner WinForm zu finden ;-) meine Function
Delphi-Quellcode:
der aufruf dann g_hf ist die Winform
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; die control befindet sich in ein Panel
Delphi-Quellcode:
nur leider macht meine TextBox nix :-(
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; kann mir jemand weiter helfen? Homer |
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:
Dabei suchst du depth-first.
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; Grüße vom marabu |
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:
macht er es
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; nur der aufruf über die Proocedure macht er nicht
Delphi-Quellcode:
wenn ich die Function so ändere
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; das ich explizit die Übergeordnetet Control angebe funktioniert es auch aber ich wollte die Function so das ich nur die Form angebe |
Re: Control suchen
Hallo Homer,
du hast in der Hitze des Gefechts die Zuweisung an Result vergessen. So findet keine rekursive Suche statt. marabu |
Re: Control suchen
Zitat:
Ich bekomme doch die Control über meine Function zurück nur ich kann ihr nicht zuweisen |
Re: Control suchen
Zitat:
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; |
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:
Nur so erhältst du ein Ergebnis, wenn das gesuchte Control einen Abstand größer 1 (im Control-Baum) hat.
Result := Finde(c_ctrl, c_name_s);
(2) Den Testaufruf würde ich so erwarten:
Delphi-Quellcode:
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.
Procedure Test();
var i : Integer; begin for i := 1 to 2 do Finde(g_hf, 'B_Text' + i.ToString).Text := ''; end; marabu @Spider: danke dir, habe zu lange getippt... |
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 20:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz