Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi D7 FindComponent über .tag und Caption (https://www.delphipraxis.net/189354-d7-findcomponent-ueber-tag-und-caption.html)

beanbear6 3. Jun 2016 17:16

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

Helmi 3. Jun 2016 17:42

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;

nahpets 3. Jun 2016 17:46

AW: D7 FindComponent über .tag und Caption
 
Oder alternativ sowas?
(nur hingedaddelt und nicht getestet)
Delphi-Quellcode:
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;
oder
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;

beanbear6 3. Jun 2016 17:46

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

Helmi 3. Jun 2016 17:49

AW: D7 FindComponent über .tag und Caption
 
Zitat:

Zitat von beanbear6 (Beitrag 1339489)
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...

Dann zeig doch mal deinen Code, wenn wir dich falsch verstanden haben

beanbear6 3. Jun 2016 17:53

AW: D7 FindComponent über .tag und Caption
 
Hallo,
ich versuche das mal so darzustellen:

Delphi-Quellcode:
  for x := 1 to 10 do begin
   // If TPanel(Findcomponent('Panel'+IntToStr(x))).Tag = x then
   // TPanel[x].Caption = 'bla bla';
    end;
  end;
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?
Gruß Reiner

Helmi 3. Jun 2016 18:00

AW: D7 FindComponent über .tag und Caption
 
So etwa?

Delphi-Quellcode:
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;
oder:
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;

beanbear6 3. Jun 2016 18:24

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

Helmi 3. Jun 2016 18:28

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

beanbear6 3. Jun 2016 18:30

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

nahpets 3. Jun 2016 18:33

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:
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;
Das Beispiel von Helmi müsste funktionieren, ändere es bitte mal so ab:
Delphi-Quellcode:
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;
Und dann überprüfe, ob die Werte von Name und Tag mit dem von Dir Erwarteten übereinstimmen.

DeddyH 3. Jun 2016 18:36

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.

Helmi 3. Jun 2016 18:37

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:

Zitat von DeddyH (Beitrag 1339498)
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.

An so was hab ich auch schon gedacht, aber irgendwie wissen wir nicht wirklich was gewollt ist

beanbear6 3. Jun 2016 18:39

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

Helmi 3. Jun 2016 18:52

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;

nahpets 3. Jun 2016 18:53

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;

beanbear6 3. Jun 2016 18:58

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

beanbear6 3. Jun 2016 19:08

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:
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
Wenn ich das hinkriege dann schaff ich den Rest mit der Datenbank auch. Und gleich nochmal ein Dankeschön!! :-)
Gruß beanbear

Helmi 3. Jun 2016 19:11

AW: D7 FindComponent über .tag und Caption
 
Zitat:

Zitat von beanbear6 (Beitrag 1339504)
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:
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
Wenn ich das hinkriege dann schaff ich den Rest mit der Datenbank auch. Und gleich nochmal ein Dankeschön!! :-)
Gruß beanbear

Die Lösung steht schon da - einfach mal die Codes verstehen versuchen und schon kommst auf die Lösung

nahpets 3. Jun 2016 19:16

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;

beanbear6 4. Jun 2016 06:02

AW: D7 FindComponent über .tag und Caption
 
Hallo zusammen,
vieelen vieelen Dank für Eure Hilfe, es klappt jetzt :-)
Gruß Reiner

markus5766h 4. Jun 2016 18:22

AW: D7 FindComponent über .tag und Caption
 
nur der Vollständigkeit halber :

http://www.delphipraxis.net/147151-c...erstellen.html
:)

DeddyH 4. Jun 2016 18:54

AW: D7 FindComponent über .tag und Caption
 
Siehe #12 ;)

haentschman 4. Jun 2016 19:06

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:

TRomano 6. Jun 2016 08:22

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.

himitsu 6. Jun 2016 12:07

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:

TRomano 6. Jun 2016 13:01

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 !

Helmi 6. Jun 2016 17:02

AW: D7 FindComponent über .tag und Caption
 
Zitat:

Zitat von himitsu (Beitrag 1339578)
Wurde For-In schon erwähnt?
Nur der Vollständigkeit halber. :angle:

Ging das bei D7 schon?
war mir nicht sicher

TRomano 6. Jun 2016 17:35

AW: D7 FindComponent über .tag und Caption
 
Gibt es in D7 noch nicht ...

himitsu 7. Jun 2016 10:51

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)

TRomano 7. Jun 2016 11:36

AW: D7 FindComponent über .tag und Caption
 
Danke Himitsu ! Das mit dem Pre-Processor wusste ich nicht ... wieder was dazu gelernt !

himitsu 7. Jun 2016 12:05

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)
http://www.delphipraxis.net/59965-so...tml#post406571

http://php.net/manual/de/language.co...predefined.php
https://de.wikipedia.org/wiki/C-Pr%C3%A4prozessor
http://www2.informatik.uni-halle.de/.../c_define.html
https://msdn.microsoft.com/de-de/library/503x3e3s.aspx

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:
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>;
Als Unicode-Ersatz für den ShortString
Delphi-Quellcode:
String[123]
, welchen man dann z.B. in Records oder zur binären Datenspeicherung/-übertragung nutzen hätte können.

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