AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Control suchen

Ein Thema von HomerGER · begonnen am 28. Mai 2005 · letzter Beitrag vom 28. Mai 2005
Antwort Antwort
Benutzerbild von HomerGER
HomerGER

Registriert seit: 9. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#1

Control suchen

  Alt 28. Mai 2005, 13:53
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Control suchen

  Alt 28. Mai 2005, 14:13
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
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 9. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#3

Re: Control suchen

  Alt 28. Mai 2005, 14:37
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Control suchen

  Alt 28. Mai 2005, 15:24
Hallo Homer,

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

marabu
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 9. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#5

Re: Control suchen

  Alt 28. Mai 2005, 15:30
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
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Control suchen

  Alt 28. Mai 2005, 15:50
Zitat von HomerGER:
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;
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Control suchen

  Alt 28. Mai 2005, 15:53
Hallo Homer,

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

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...
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 9. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#8

Re: Control suchen

  Alt 28. Mai 2005, 16:00
nein, der fehler war wirklich wir ihr gesagt habt
das rekursive Result

das habe ich komplett übersehen



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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:29 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