![]() |
Delphi-Version: 7
D7 FindComponent über .tag und Caption
Hallo Profis,
ich finde leider keine Lösung - auch nicht in den mir bekannten foren. Ich habe 10 Panels mit den Tags 1 bis 10. Nun möchte ich über einen Zähler (1-10) die Compos (über den tag) finden und dann aber die Caption ändern... Ich krieg das nicht hin.. Wer kann mir helfen? Vielen Dank gleich mal an alle unterstützer. Beanbear |
AW: D7 FindComponent über .tag und Caption
Hallo,
du kannst über ComponentCount die einzelnen TPanels suchen und dann dementsprechend darauf zugreifen. Z. B.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer; MyPanel: TPanel; begin for i := 0 to Pred(ComponentCount) do If Components[i].ClassName = 'TPanel' then begin MyPanel := TPanel(Components[i]); ShowMessage(Format('Panelname: %s, Tag: %d', [MyPanel.Name, MyPanel.Tag])); end; end; |
AW: D7 FindComponent über .tag und Caption
Oder alternativ sowas?
(nur hingedaddelt und nicht getestet)
Delphi-Quellcode:
oder
for i := 0 to ComponentCount - 1 do begin
if Components[i] is TPanel then begin case TPanel(Components[i]).Tag of 1 : TPanel(Components[i]).Caption := '1'; 2 : TPanel(Components[i]).Caption := '2'; ... end; end; end;
Delphi-Quellcode:
for i := 0 to ComponentCount - 1 do begin
if Components[i] is TPanel then begin with Components[i] as TPanel do begin case Tag of 1 : Caption := '1'; 2 : Caption := '2'; ... end; end; end; end; |
AW: D7 FindComponent über .tag und Caption
Hi,
äh also i glaub da ist meine Frage nicht ganz rüber gekommen :-( also ich suche mit einem Zähler x von 1 bis 10 die Komponente TPanel über die Eigenschaft .tag. Wenn z.B. Panel mit tag 3 gefunden wurde, dann möchte ich diese Caption ändern... Gruß Reiner |
AW: D7 FindComponent über .tag und Caption
Zitat:
|
AW: D7 FindComponent über .tag und Caption
Hallo,
ich versuche das mal so darzustellen:
Delphi-Quellcode:
Ich weiß, dass das so nicht geht, es soll nur son Anhaltspunkt sein, wie ich das lösen möchte. Das Problem ist dabei noch, dass sich die Anzahl der Panels eventuell auf 100 erhöhen kann. Wenn ich das mit Case mache muss ich ja 100 cases abfragen oder?
for x := 1 to 10 do begin
// If TPanel(Findcomponent('Panel'+IntToStr(x))).Tag = x then // TPanel[x].Caption = 'bla bla'; end; end; Gruß Reiner |
AW: D7 FindComponent über .tag und Caption
So etwa?
Delphi-Quellcode:
oder:
procedure TForm1.Button2Click(Sender: TObject);
var i: Integer; Component: TComponent; begin for i := 1 to 10 do begin Component := Findcomponent('Panel'+ IntToStr(i)); If Assigned(Component) then If Component.ClassType = TPanel then If TPanel(Component).Tag = i then TPanel(Component).Caption := Format('Ich bin Panel-Nr. %d', [i]); end; end;
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var i: Integer; Component: TComponent; TempPanel: TPanel; begin for i := 1 to 10 do begin Component := Findcomponent('Panel'+ IntToStr(i)); If Assigned(Component) then If Component.ClassType = TPanel then begin TempPanel := TPanel(Component); If TempPanel.Tag = i then TempPanel.Caption := Format('Ich bin Panel-Nr. %d', [i]); end; end; end; |
AW: D7 FindComponent über .tag und Caption
Hi Helmi,
im prinzip gehts, nur macht er das nur beim ersten Panel... (habs mit erstem Beispiel versucht) Gruß Reiner |
AW: D7 FindComponent über .tag und Caption
wie heissen die Panels?
Sind das spezielle Panels die du da finden willst, oder alle Panels die auf der Form liegen? Ansonsten zeig nochmal deinen jetzigen Code |
AW: D7 FindComponent über .tag und Caption
Hi,
es liegen alle 10 Panels auf einer form. Die Namen sind einfach panel1 panel2 usw. Hab den Eindruck, dass der nicht weiterzählt... Gruß Reiner |
AW: D7 FindComponent über .tag und Caption
Nach welchen Kriterien sollen denn die Captions geändert werden.
Was bezweckst Du überhaupt mit der Abfrage von Tag und der Änderung der Caption? 'ne Hitliste für ein Spiel? 'ne Liste von (Programm-)Abläufen? Gib' uns mal eine (möglichst) genaue Beschreibung dessen, was Du umsetzen möchtest. Eventuell können wir dann zielgerichtet antworten und nicht nur so ins Blaue, wie so ein Problem eventuell theoretisch gelöst werden könnte. Statt der Case-Abfrage aus meinen Beispielen oben, könntest Du dort ja auch beliebige If-Abfragen einfügen, Funktionsaufrufe (für was auch immer). Dashier dürfte relativ nahe an Deine Idee kommen:
Delphi-Quellcode:
Das Beispiel von Helmi müsste funktionieren, ändere es bitte mal so ab:
var
myComp : TComponent; x : Integer; begin for x := 1 to 10 do begin myComp := Findcomponent(Format('Panel%d',[x])); if Assigned(myComp) and (myComp is TPanel) then begin TPanel[myComp].Caption = 'bla bla'; end; end; end;
Delphi-Quellcode:
Und dann überprüfe, ob die Werte von Name und Tag mit dem von Dir Erwarteten übereinstimmen.
procedure TForm1.Button2Click(Sender: TObject);
var i: Integer; Component: TComponent; begin for i := 1 to 10 do begin Component := Findcomponent('Panel'+ IntToStr(i)); If Assigned(Component) then If Component.ClassType = TPanel then ShowMessage(Format('Caption: %s, Name: %s, Tag: %d, i = %d', [TPanel(Component).Caption,Component.Name,Component.Tag,i])); end; end; |
AW: D7 FindComponent über .tag und Caption
Ich würde mir das Geraffel vereinfachen, indem ich die betreffenden Panels in einer eigenen Liste (TObjectList/TComponentList) oder einem Array ablege, dann kann ich auch ohne FindComponent indiziert darauf zugreifen.
|
AW: D7 FindComponent über .tag und Caption
Wie nahpets schon richtig erwähnte, wir rätseln mehr...
All unsere Beispiele funktionieren, nur kommt es auf die Anforderung drauf an. Wir prüfen auch die Panels auf 2x das gleiche, die Ziffer im Namen und Tag müssen übereinstimmen Brauchen wir das? Reicht es nicht, wenn wir die Panels finden, die als Tag 1-10 haben? Gibt es mehr als die 10 Panels? - und die anderen sind für was anderes gedacht, haben aber auch einen beschriebenen Tag? Zitat:
|
AW: D7 FindComponent über .tag und Caption
Hi zusammen,
uups... nun ist mir was aufgefallen... ich melde mich dann nochmal... nene es genügt wenn die Panels über i (also tag1, tag2, usw.) gefunden werden und ich dann die caption ändern kann... Also: Ich hab 10 Panels (mit Caption) und möchte die Caption über einen Zähler 1..10 leeren. Wenn das Passiert ist hol ich mir aus einer Datenbank (Spalte1 = Nummer von 1..10 und spalte2 ist Bezeichnung für die Panels) die neue Beschriftung. Ziel des Ganzen ist, dass ich Panels aus einer Datenbank raus beschriften kann. Im OnShow Ergebnis der Form leere ich also die Beschriftungen der 10 Panels und hol mir die neue Beschriftung aus der Datenbank. Is bissl schwierig zu erklären ich hoffe i habs hingekriegt... Gruß Reiner |
AW: D7 FindComponent über .tag und Caption
Dann vielleicht so:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var i: Integer; TempPanel: TPanel; begin for i := 0 to Pred(ComponentCount) do If Components[i].ClassType = TPanel then begin TempPanel := TPanel(Components[i]); If TempPanel.Tag in [1..10] then TempPanel.Caption := Format('Ich bin Panel-Nr. %d!', [TempPanel.Tag]); end; end; |
AW: D7 FindComponent über .tag und Caption
Oder suchst Du sowas? (nicht getestet)
Delphi-Quellcode:
var
myComp : TComponent; begin while not qry.Eof Do begin myComp := FindComponent(Format('Panel%d',[qry.FieldByName('Spalte1').AsInteger])); if Assigned(myComp) and (myComp is TPanel) then begin TPanel(myComp).Caption := qry.FieldByName('Spalte2').AsString; end; qry.Next; end; end; |
AW: D7 FindComponent über .tag und Caption
Hi zusammen,
ich teste das mal ab und melde mich... Gleich aber mal ein großes Dankeschön für Eure Mühe... Gruß Reiner |
AW: D7 FindComponent über .tag und Caption
Hi zusammen,
also ich nochmal... Ich dachte mir schon dass das wenn ich nun noch mit Datenbank ankommen ausartet und ich Eure Geduld sehr strapaziere. Also ich versuch das nochmal mit folgendem Beispiel (z.B. für 100 Panels - die Panels haben die tags von 1 bis 100):
Delphi-Quellcode:
Wenn ich das hinkriege dann schaff ich den Rest mit der Datenbank auch. Und gleich nochmal ein Dankeschön!! :-)
for x = 1 to 100 do
// suche Panels mit den tags 1 bis 100 // Setze auf Panels 1 bis 100 den Text: nicht verfügbar Gruß beanbear |
AW: D7 FindComponent über .tag und Caption
Zitat:
|
AW: D7 FindComponent über .tag und Caption
Delphi-Quellcode:
var
i : Integer; begin while not qry.Eof Do begin for i := 0 to ComponentCount - 1 do begin if not (Component[i] is TPanel) then continue; if TPanel(Component[i]).Tag = qry.FieldByName('Spalte1').AsInteger then begin TPanel(Component[i]).Caption := qry.FieldByName('Spalte2').AsString; end; end; qry.Next; end; end; |
AW: D7 FindComponent über .tag und Caption
Hallo zusammen,
vieelen vieelen Dank für Eure Hilfe, es klappt jetzt :-) Gruß Reiner |
AW: D7 FindComponent über .tag und Caption
|
AW: D7 FindComponent über .tag und Caption
Siehe #12 ;)
|
AW: D7 FindComponent über .tag und Caption
nur der Vollständigkeit halber... :P
Persönlich würde ich eine TObjectlist einem dynamischen Array vorziehen. Bei neueren Delphis die generischen Varianten... rein, raus...fertsch. :thumb: ohne sich um die Array Grenzen kümmern zu müssen. ja, ja #12 nicht vorher gelesen... :wink: |
AW: D7 FindComponent über .tag und Caption
@Haentschman & @DeddyH:
Einige wollen aber ihre CPU´s endlich mal auslasten und rauschen immer wieder per FOR-Schleife durch ihre ComponentList der Form ... :wink: Sie lernen es erst dann, wenn irgendwann die GUI in die Kniee geht. |
AW: D7 FindComponent über .tag und Caption
Wer mit einer Schleife über die Components seine CPU in die Knie zwingt, der hat ganz andere Probleme.
> zu viele Komponenten auf der Form > oder er sollte den 286er langsam upgraden Wurde For-In schon erwähnt? Nur der Vollständigkeit halber. :angle: |
AW: D7 FindComponent über .tag und Caption
@Himitsu: es war ein Spaß, der nur zeigen sollte, dass es andere Möglichkeiten gibt, als immer stumpf über alle Komponenten einer Form zu iterieren ... wenn man diesen Programmier-Stil beibehält kann es sehr wohl passieren, dass irgendwann mal seine CPU in die Knie geht !
|
AW: D7 FindComponent über .tag und Caption
Zitat:
war mir nicht sicher |
AW: D7 FindComponent über .tag und Caption
Gibt es in D7 noch nicht ...
|
AW: D7 FindComponent über .tag und Caption
Es soll auch Leute geben, die sich "Berlin" gekauft haben und diesen Thread eventuell irgendwann mal finden. :stupid:
In D7 konnte man noch einen Preprozessor rein hacken ... also so gesehn könnte es For-In doch geben. :angle: (schade, dass es nicht mehr geht und sowas nicht offiziell unterstützt wird) |
AW: D7 FindComponent über .tag und Caption
Danke Himitsu ! Das mit dem Pre-Processor wusste ich nicht ... wieder was dazu gelernt !
|
AW: D7 FindComponent über .tag und Caption
[bissl OT]
Ist echt schade, dass sowas nicht "mehr" geht. :cry: Da hätte man sich dann selber so Dinge einbauen können, wie z.B. Makros oder "Konstanten" ala __LINE__ und __FILE__, wie man sie aus PHP kennt. (PS: genau Diese hatte es mal von jemandem für D7 gegeben ... ich glaub von jbg oder Andy) ![]() ![]() ![]() ![]() ![]() Auch die Generics unterliegen leider einigen Beschränkungen, womit sich Einige nette Dinge nicht realisieren lassen. :cry: (vorallem, kann man nur Typen und keine Konstanten generisch definieren)
Delphi-Quellcode:
Als Unicode-Ersatz für den ShortString
TUnicodeShortString<len> = record
private FChars: array[0..len] of Char; ... public property Chars[Index: Integer]: Char read GetChar write SetChar; default; end; TUnicodeShortString = TUnicodeShortString<255>;
Delphi-Quellcode:
, welchen man dann z.B. in Records oder zur binären Datenspeicherung/-übertragung nutzen hätte können.
String[123]
Na ja, muß man halt andere Wege nutzen. (sind ja inzwischen eh alle wild auf JSON, XML und Co.) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:42 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