ankhmorpork
Goto Top

Eigenschaften von Objekten setzen

Hallo Crew,


Gibt es hier noch Pascaler?

Ich arbeite mit:
Laz 1.2.4
fpc 2.6.4
unter Win 7 32 bit / 64 bit

Ich möchte Eigenschaften von TStaticText-Elementen (109 Stück in einem TForm) verändern - TStaticText.Color.
Das Ganze in einer Schleife, welche die einzelnen Elemente via Schleifenvariable ansprechen soll.
Das Erzeugen der Elemente während der Laufzeit bringt es nicht, da eine Reihe von Attributen gesetzt werden müssen (Left, Top, Height, Width, Caption; und latürnich alle unterverschiedlich!).

Die Frage: Wie kann ich die .Color-Eigenschaft per Schleife setzen, wenn ich nur den Index des Elements angeben will?

So ist es als Pseudocode gemeint (geht natürlich nicht):
FOR i:=1 TO 109 DO
	StaticText+IntToStr(i).Color:=clYellow
Aber in dieser Manier ist es gewünscht.

Hat jemand ne Idee? Ich finde es einfach nicht per Google oder Lazarus-Forum.


Gruß

ANKH

Content-ID: 246303

Url: https://administrator.de/contentid/246303

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

Friemler
Lösung Friemler 01.09.2014, aktualisiert am 02.09.2014 um 09:27:44 Uhr
Goto Top
Hallo Ankh,

zwar etwas spät, aber besser als nie. face-wink

Ich bin zwar Delphi-Entwickler, aber die LCL ist der VCL ja sehr ähnlich, Du könntest daher mal folgendes testen:

Jede fensterorientierte Komponente ist in Delphi von TWinControl abgeleitet. Ein TWinControl-Objekt oWC hat die Array-Properties Controls und Components. Controls liefert alle Controls, deren Parent oWC ist (der Index der Property läuft von 0 bis Pred(ControlCount)), Components liefert alle Controls, deren Owner oWC ist (der Index der Property läuft von 0 bis Pred(ComponentCount)). Die Components-Property liefert also sämtliche Child-Objekte von oWC oder ihm untergeordneter Controls, während die Controls-Property nur die unmittelbaren Child-Objekte von oWC liefert. Hört sich kompliziert an, ist es aber nicht, wenn man es zwei- oder dreimal ließt. face-wink

Wenn Deine TStaticText-Objekte alle direkte Child-Objekte des Formulars sind, könntest Du folgende Schleife verwenden:
procedure SetTextColor(AParent: TWinControl; AColor: TColor);
var
  Cnt: integer;

begin
  for Cnt := 0 to Pred(AParent.ControlCount) do
    if AParent.Controls[Cnt] is TStaticText then
      AParent.Controls[Cnt].Color := AColor;
end;

Alternativ könntest Du Dir im FormCreate-Handler des Formulars mit Hilfe der obigen Schleife ein Array erstellen, das garantiert nur die TStaticText-Objekte enthält und im späteren Programmlauf über dieses Array iterieren.


Übrigens: Die Konstruktion
StaticText+IntToStr(i).Color:=clYellow
wird nicht funktionieren. In diesem Ausdruck kann man den Namen eines Objekts nicht zur Laufzeit dynamisch erzeugen.

Was funktionieren würde:
var
  AText: TStaticText;

begin
  for i := 1 to 109 do
  begin
    AText := TStaticText(Form1.FindChildControl('StaticText' + IntToStr(i)));  
    if Assigned(AText) then AText.Color := clYellow;
  end;
end;
Das ist aber nicht sehr performant.

Gruß
Friemler
AnkhMorpork
AnkhMorpork 01.09.2014 um 19:37:51 Uhr
Goto Top
Hi Friemler,

ich hatte schon mal geantwortet, aber das ist wohl irgendwie im Nirvana verschwunden ... ich sehe es jedenfalls nicht.

Auf jeden Fall herzlichen Dank für deine Reaktion - ich muss das sicher noch intensivst verarbeiten - abba dat kieg'n wer spätter ...

Ich werde deine Schnipsel mal verwursteln und schaun was rauskommt. Bin gespannt!

Delphi hatte ich auch mal an der Kandarre, aber die Preispolitik von Borland hat mich dann abserviert. Lazarus kam da ganz recht, hat aber so seine Tücken und Eigenwilligkeiten (Ansi-/Unicode-Zeichenkodierung war ein echer Hänger für mich!). Aber das bekomme ich schon auf die Reihe. Ich sitze hier im Moment bei einer Digitalisierung des Peridensystems der Elemente und einem Fraktaldesigner. Spaß bingt das schon!

Gruß und alles erdenklich Gute

ANKH
AnkhMorpork
AnkhMorpork 02.09.2014, aktualisiert am 03.09.2014 um 08:11:34 Uhr
Goto Top
Hallo,

so, bin soweit. Einerseits tut es genau das, was ich wollte. Andererseits verstehe da etwas elementares nicht:
Ich wende deine Prozedur an
procedure SetTextColor(AParent: TWinControl; AColor: TColor);
var
  Cnt: integer;

begin
  for Cnt := 0 to Pred(AParent.ControlCount) do
    if AParent.Controls[Cnt] is TStaticText then
      AParent.Controls[Cnt].Color := AColor;
end;

Das geht solange gut, wie die TStaticText-Objekte in nahtloser Reihenfolge eingefügt wurden. Sofern ein Objekt dazwischen eingefügt wird, werden die restlichen TStatics einfach ignoriert - trotz der if-Abfrage. Und da komme ich nicht mit. Hast du eine Erklärung für diese Zicken?


Gruß
ANKH

<EDIT:> Rückzug! Alles im Lot (auf dem Riverboot). Hatte die Transparent-Eigenschaft vergessen - sch...

Danke nochmal für deine Hilfe - jetzt flutscht das.

Und sieht so aus:
PROCEDURE TUmrechnung.SetStatTextColors(AParent: TWinControl; AColor: TColor; TextPosition: INTEGER; WantBkGrd: BOOLEAN);
var
  Cnt,i: integer;
BEGIN
  for Cnt := 0 to Pred(AParent.ControlCount) do
    if AParent.Controls[Cnt] is TStaticText then
         FOR i:=1 TO 7 DO //Anzahl der Positionen in Zeile
             IF Cnt = PosArray[TextPosition,i] THEN
                IF WantBkGrd THEN
                   AParent.Controls[Cnt].Color := AColor
                ELSE AParent.Controls[Cnt].Font.Color := AColor;
END;

Muss nur noch das Feld PosArray erstellt werden. Es sollen jeweils Blöcke von TStaticText bearbeitet werden.