Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Eigenschaften von Objekten setzen

Frage Entwicklung Pascal und Delphi

Mitglied: AnkhMorpork

AnkhMorpork (Level 2) - Jetzt verbinden

12.08.2014, aktualisiert 02.09.2014, 1553 Aufrufe, 3 Kommentare

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):
01.
FOR i:=1 TO 109 DO 
02.
	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
Mitglied: Friemler
LÖSUNG 01.09.2014, aktualisiert 02.09.2014
Hallo Ankh,

zwar etwas spät, aber besser als nie.

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.

Wenn Deine TStaticText-Objekte alle direkte Child-Objekte des Formulars sind, könntest Du folgende Schleife verwenden:
01.
procedure SetTextColor(AParent: TWinControl; AColor: TColor); 
02.
var 
03.
  Cnt: integer; 
04.
 
05.
begin 
06.
  for Cnt := 0 to Pred(AParent.ControlCount) do 
07.
    if AParent.Controls[Cnt] is TStaticText then 
08.
      AParent.Controls[Cnt].Color := AColor; 
09.
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:
01.
var 
02.
  AText: TStaticText; 
03.
 
04.
begin 
05.
  for i := 1 to 109 do 
06.
  begin 
07.
    AText := TStaticText(Form1.FindChildControl('StaticText' + IntToStr(i))); 
08.
    if Assigned(AText) then AText.Color := clYellow; 
09.
  end; 
10.
end;
Das ist aber nicht sehr performant.

Gruß
Friemler
Bitte warten ..
Mitglied: AnkhMorpork
01.09.2014 um 19:37 Uhr
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
Bitte warten ..
Mitglied: AnkhMorpork
02.09.2014, aktualisiert 03.09.2014
Hallo,

so, bin soweit. Einerseits tut es genau das, was ich wollte. Andererseits verstehe da etwas elementares nicht:
Ich wende deine Prozedur an
01.
procedure SetTextColor(AParent: TWinControl; AColor: TColor); 
02.
var 
03.
  Cnt: integer; 
04.
 
05.
begin 
06.
  for Cnt := 0 to Pred(AParent.ControlCount) do 
07.
    if AParent.Controls[Cnt] is TStaticText then 
08.
      AParent.Controls[Cnt].Color := AColor; 
09.
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:
01.
PROCEDURE TUmrechnung.SetStatTextColors(AParent: TWinControl; AColor: TColor; TextPosition: INTEGER; WantBkGrd: BOOLEAN); 
02.
var 
03.
  Cnt,i: integer; 
04.
BEGIN 
05.
  for Cnt := 0 to Pred(AParent.ControlCount) do 
06.
    if AParent.Controls[Cnt] is TStaticText then 
07.
         FOR i:=1 TO 7 DO //Anzahl der Positionen in Zeile 
08.
             IF Cnt = PosArray[TextPosition,i] THEN 
09.
                IF WantBkGrd THEN 
10.
                   AParent.Controls[Cnt].Color := AColor 
11.
                ELSE AParent.Controls[Cnt].Font.Color := AColor; 
12.
END;
Muss nur noch das Feld PosArray erstellt werden. Es sollen jeweils Blöcke von TStaticText bearbeitet werden.
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst Powershell: Lokaler DTC Eigenschaften setzen? (2)

Frage von Andoreasu zum Thema Batch & Shell ...

Batch & Shell
Variable setzen können während timeout (3)

Frage von DontFlameMeITryMyBest zum Thema Batch & Shell ...

Exchange Server
Powershell Abwesenheitsnotiz für Gruppe setzen (3)

Frage von 124611 zum Thema Exchange Server ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...