Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Komponente suchen und Caption ändern ? (https://www.delphipraxis.net/206528-komponente-suchen-und-caption-aendern.html)

Gandimann 1. Jan 2021 02:38

Komponente suchen und Caption ändern ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hello Friends,
zuerst frohes 2021 wünsche ich allen :)

Mein Problem :
ich mochte gern auf ein Form platzierte mehrere Panels(mehr als 50) per Button-klick suchen und falls auf welche keine Caption vorhanden ist,ein neue caption zuweisen. Ich versuche mit follgende.... aber ohne Erfolg :(
Ich bitte um Hilfe !!

Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
 CNAME, CAP: string;
  i: Integer;
begin
  CNAME := 'pnl';
  CAP := 'LAST CHECK' ;
  for i := 1 to 4 do
  begin
      if (FindComponent((CNAME[i])) as TPanel).caption <> '' then
          (FindComponent((CNAME[i])) as TPanel).caption := CAP ;
  end;
end ;
end.
Ein TestProjekt habe ich hinzugefügt.

hschmid67 1. Jan 2021 06:31

AW: Komponente suchen und Caption ändern ?
 
Guten Morgen,
ich vermute, die Panels heißen pnl1...pnl4 , oder?
Dann müsste es lauten
Delphi-Quellcode:
if (FindComponent(CNAME + i.ToSting) as TPanel).caption <> '' then
...
Viele Grüße und allen ein gutes Neues Jahr
Harald

striderx 1. Jan 2021 06:46

AW: Komponente suchen und Caption ändern ?
 
und nicht <> '' sondern = ''

Delfiano 1. Jan 2021 08:21

AW: Komponente suchen und Caption ändern ?
 
Um das überhaupt mit meinem Delphi 7 testen zu können, musste ich entsetzlich viel Müll entfernen.

Hier die Lösung:
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
 CNAME, CAP: string;
  i: Integer;
begin
  CNAME := 'pnl';
  CAP := 'LAST CHECK' ;
  for i := 1 to 4 do
  begin
      if (FindComponent(CNAME+intToStr(i)) as TPanel).caption = '' then
         (FindComponent(CNAME+intToStr(i)) as TPanel).caption := CAP;
  end;
end;

TKanne 1. Jan 2021 14:10

AW: Komponente suchen und Caption ändern ?
 
Moin,

frohes Neues erst einmal. :)

oder, wenn es etwas flexibler sein soll (bei mir z.B. sind die Panels nicht mimmer nur durchnummeriert):

Code:
procedure TForm1.btn1Click(Sender: TObject);
var
  CAP: string;
  i: Integer;
begin
  CAP := 'LAST CHECK';
  for i := 0 to ComponentCount - 1 do
    if (Components[i] is TPanel) and ((Components[i] as TPanel).Caption = '') then
      (Components[i] as TPanel).Caption := CAP;

end;

EmWieMichael 1. Jan 2021 16:15

AW: Komponente suchen und Caption ändern ?
 
Delphi-Quellcode:
if (FindComponent(CNAME+intToStr(i)) as TPanel).caption = '' then
   (FindComponent(CNAME+intToStr(i)) as TPanel).caption := CAP;
Das funktioniert zwar, allerdings ist der zweimalige Aufruf von FindComponent unnötig, nicht sonderlich elegant und wenig effektiv.

Delfiano 1. Jan 2021 16:19

AW: Komponente suchen und Caption ändern ?
 
Gut gebrüllt, Löwe. Dann mach's doch besser.

Ich hab mich nur an der Vorgabe orientiert und
den/die entsprechenden Fehler behoben.

Aber ich will mal nicht so sein:
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
 CNAME, CAP: string;
 p: TPanel;
 i: Integer;
begin
  CNAME := 'pnl';
  CAP := 'LAST CHECK' ;
  for i := 1 to 4 do
  begin
    p:= (FindComponent(CNAME+intToStr(i)) as TPanel);
    if p.caption = '' then p.caption := CAP ;
  end;
end;

zeras 1. Jan 2021 17:03

AW: Komponente suchen und Caption ändern ?
 
Zitat:

Zitat von Delfiano (Beitrag 1480175)
Gut gebrüllt, Löwe. Dann mach's doch besser.

Ich hab mich nur an der Vorgabe orientiert und
den/die entsprechenden Fehler behoben.

Aber ich will mal nicht so sein:
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
 CNAME, CAP: string;
 p: TPanel;
 i: Integer;
begin
  CNAME := 'pnl';
  CAP := 'LAST CHECK' ;
  for i := 1 to 4 do
  begin
    p:= (FindComponent(CNAME+intToStr(i)) as TPanel);
    if p.caption = '' then p.caption := CAP ;
  end;
end;

Man sollte aber noch prüfen, ob es das Panel überhaupt gibt und nicht gleich das Caption zuweisen.

Delfiano 1. Jan 2021 17:19

AW: Komponente suchen und Caption ändern ?
 
Zitat:

Man sollte aber noch prüfen, ob es das Panel überhaupt gibt und nicht gleich das Caption zuweisen.
Prinzipiell korrekt. Aber selbst wenn es nicht existiert, also statt z.B 4 ein höherer Wert benutzt wird, kommt es zu keinem Fehler.

Etwas anderes ist viel problematischer. Der Themenersteller möchte ja die Änderungen nicht nur zur Laufzeit, sondern sie sollen dauerhaft übernommen werden.

Das aber ginge auf diese Weise so oder so nicht, sondern es müsste extern zugegriffen werden.

Zwar dürfte das auch nicht allzu schwierig sein, aber soll das ruhig wer anderes lösen.

Gandimann 1. Jan 2021 22:39

AW: Komponente suchen und Caption ändern ?
 
Thanks Friends for your kind help :)

haentschman 2. Jan 2021 06:28

AW: Komponente suchen und Caption ändern ?
 
Moin...:P
Zitat:

FindComponent
...was ich daran nicht mag...das "Find". :wink: Obwohl es wahrscheinlich zeittechnisch unerheblich ist, das "Find" suggeriert mir eine Suche über die gesamte Menge der Controls. Ich suche aber ungern. :wink: Ich stehe eher auf Listen wo nur die "Einträge" drin sind über die gesucht wird. :thumb:

In diesem Falle wäre das eine TObjectList<TPanel> (dynamisch erzeugte Panels). Diese Liste kannst du immer durchiterieren.
Delphi-Quellcode:
for Panel in PanelList
begin
  // Caption ändern etc.
end;
Wenn du auf ein bestimmtes Panel zugreifen willst würde sich dann auch ein TObjectDicionary<(Key = Integer oder string etc.), TPanel> anbieten.

PS1:
Zitat:

ich mochte gern auf ein Form platzierte mehrere Panels(mehr als 50)
Bei dieser Variante, die scalierbar ist, müssen die Panels dynamisch erzeugt werden und nicht auf die Form geklatscht. :zwinker:

PS2:
Ich würde die Dictionary Variante bevorzugen. Da kann man auch das Panel in eine Klasse packen die dann zusätzliche Informationen hat. Position im Panel "Array"...oder so. So nach dem Motto: Gib mir das Panel von Reihe 2, Spalte 4. :zwinker:

:wink:

Moombas 4. Jan 2021 06:50

AW: Komponente suchen und Caption ändern ?
 
Zitat:

Zitat von haentschman (Beitrag 1480189)
Moin...:P
Zitat:

FindComponent
...was ich daran nicht mag...das "Find". :wink: Obwohl es wahrscheinlich zeittechnisch unerheblich ist, das "Find" suggeriert mir eine Suche über die gesamte Menge der Controls. Ich suche aber ungern. :wink: Ich stehe eher auf Listen wo nur die "Einträge" drin sind über die gesucht wird. :thumb:

In diesem Falle wäre das eine TObjectList<TPanel> (dynamisch erzeugte Panels). Diese Liste kannst du immer durchiterieren.
Delphi-Quellcode:
for Panel in PanelList
begin
  // Caption ändern etc.
end;

Meinst du nicht, das FindComponent eben genau das macht und alle Controls in einer entsprechenden Liste existieren?
Denn du musst ja vorher sagen, was für eine Komponente du suchst z.B.
Delphi-Quellcode:
TEdit(FindComponent(...))
, was für mich darauf schließen lässt, das er auch nur eine Liste der erwarteten Komponente oder den Teilbereich einer kompletten Liste durchsucht und somit 1:1 das ist, was du manuell selber anlegst.

Aber ist halt nur eine Vermutung. Ich selber arbeite auch mit FindComponent und das Einzige, wo eine Solche (manuelle) Liste aus meiner Sicht wirklich Sinnvoll ist, wenn ich diese aus irgendwelchen Gründen komplett durcharbeiten muss.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 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