Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Panels alle gleichfarbig machen (https://www.delphipraxis.net/83870-panels-alle-gleichfarbig-machen.html)

Christian18 7. Jan 2007 18:25


Panels alle gleichfarbig machen
 
Hallo,

ich habe 20 Panels in einer ScrollBox. Die Panels haben alle verschiedene Farben. Jetzt möchte ich die Panels alle in der selben Farbe haben. Damit ich nicht jedes Panel einzeln ansprechen muss, habe ich mir folgendes überlegt.

Delphi-Quellcode:
for j:=0 to Form1.ComponentCount do
  begin
    p:=FindComponent('P' + IntToStr(j + 1)) as TPanel;
    if p is TPanel then
      begin
        p.Color:=clBtnFace;
      end;
  end;
Leider funktioniert es mal wieder nicht. Was habe ich falsch gemacht??? Die Panels erzeuge ich Dynamisch und gebe den Panels auch bei der erzeugung Namen. Die Panels heißen P1, P2, ..., P20

Vielen Dank im vorraus

MFG Christian18

oki 7. Jan 2007 18:33

Re: Panels alle gleichfarbig machen
 
Hi,
Delphi-Quellcode:
begin
  for j:=0 to Form1.ComponentCount do begin
    if Form1.Components[j] is TPanel then begin
      (Form1.Components[j] as TPanel).Color:=clBtnFace;
    end;
  end;
end;
ich bin mir jetzt nur nicht ganz sicher, ob du nicht in ScrollBox.Components suchen mußt.

Gruß oki

Bernhard Geyer 7. Jan 2007 18:34

Re: Panels alle gleichfarbig machen
 
Hast Du evtl. XP-Theming für deine Anwendung aktiv. Dort gelten andere Spielregeln.

mkinzler 7. Jan 2007 18:35

Re: Panels alle gleichfarbig machen
 
Abgesehen davon, stimmt die obere Grenze wieder nicht.

MrKnogge 7. Jan 2007 18:37

Re: Panels alle gleichfarbig machen
 
Das sollte funktionieren:

Delphi-Quellcode:
for j:=0 to 19 do // das -1 bitte nicht vergessen
  with TPanel(FindComponent(P + IntToStr(i+1))) do
        p.Color:=clBtnFace;
Gruß

Hawkeye219 7. Jan 2007 18:38

Re: Panels alle gleichfarbig machen
 
Hallo,

du mußt die Methode FindComponent des Owners deiner Panels aufrufen. Ist dies wirklich das Formular?

Noch einfacher wäre es, beim Erzeugen der Panels die Referenzen in einer Liste oder einem dynamischen Array abzulegen. Damit ersparst du dir die aufwendige Suche mittels FindComponent.

Gruß Hawkeye

oki 7. Jan 2007 18:44

Re: Panels alle gleichfarbig machen
 
Zitat:

Zitat von mkinzler
Abgesehen davon, stimmt die obere Grenze wieder nicht.

Sorry,
Delphi-Quellcode:
  for j:=0 to ScrollBox1.ComponentCount - do begin
@MrKnogge: dann aber so
Delphi-Quellcode:
with TPanel(FindComponent(P + IntToStr(i+1))) do
        Color:=clBtnFace;

Zitat:

Zitat von Hawkeye219
Hallo,

du mußt die Methode FindComponent des Owners deiner Panels aufrufen. Ist dies wirklich das Formular?

Ich denke das auf jeden Fall!

Delphi-Quellcode:
  for j:=0 to ScrollBox1.ComponentCount - do begin
    if ScrollBox1.Components[j] is TPanel then begin
      (ScrollBox1.Components[j] as TPanel).Color:=clBtnFace;
    end;
  end;


Zitat:

Zitat von Hawkeye219
HNoch einfacher wäre es, beim Erzeugen der Panels die Referenzen in einer Liste oder einem dynamischen Array abzulegen. Damit ersparst du dir die aufwendige Suche mittels FindComponent.

Und genau das ist die Eigenschaft Components.

Gruß

mkinzler 7. Jan 2007 18:45

Re: Panels alle gleichfarbig machen
 
Er meint, das du einen eigenen Array anlegen sollst.

MrKnogge 7. Jan 2007 18:50

Re: Panels alle gleichfarbig machen
 
Zitat:

Zitat von oki
@MrKnogge: dann aber so
Delphi-Quellcode:
with TPanel(FindComponent(P + IntToStr(i+1))) do
        Color:=clBtnFace;

Da hat mich wohl einer bei copy & paste erwischt. :mrgreen:

Was das array angeht, er meint wenn du deine Panels so deklarieren würdest:

Delphi-Quellcode:
P[1..20]: array pf TPanel:
Könntest du sie geütlich in einer Schlaife durchlaufen um die Farbe zu ändern.

Delphi-Quellcode:
for i := 0 to 19 do
  P[i+1].Color := ...

Christian18 7. Jan 2007 19:09

Re: Panels alle gleichfarbig machen
 
Hi,

ich habe gerade noch eine andere Idee,

auf meinen Panels habe ich Images!!! Ist es möglich zu erkennen aus welchen Panel das Image drauf liegt???

oki 7. Jan 2007 19:22

Re: Panels alle gleichfarbig machen
 
ja ist möglich. Aber was ist nun mit deinem Problem? Mach bitte für eine neue Frage einen neuen Thread auf.

Christian18 7. Jan 2007 19:26

Re: Panels alle gleichfarbig machen
 
Zu meinem Problem, hat bis jetzt keine Variante funktioniert. --> Also bei mir nicht.

oki 7. Jan 2007 19:30

Re: Panels alle gleichfarbig machen
 
Sind die Panels da und sichtbar?

Was hast du als Parent beim Create gesetzt?

Hast du mal geprüft, ob er die Panels nicht findet, oder ob das Setzen der Farbe nicht funzt?

Liegt es eventuell do´ch an den Themes?

Hast du nach den Ändern der Farbe das Fenster neu zeichnen lassen (Invalidate, Repaint ...)?

Gruß oki

Christian18 7. Jan 2007 19:40

Re: Panels alle gleichfarbig machen
 
Hallo oki,

das sind ja gleich viele Frage auf einmal. Nagut ich versuch es mal!!!

Zitat:

Sind die Panels da und sichtbar?
- Ja ich kann die Panels sehen und auch die Bilder (Images) die ich auf den Panels habe.

Zitat:

Was hast du als Parent beim Create gesetzt?
- Ich habe es so gemacht:

var p : Array of TPanel;
...
p[j - 1].Parent:=ScrollBox1;

Zitat:

Hast du mal geprüft, ob er die Panels nicht findet, oder ob das Setzen der Farbe nicht funzt?
- Ich habe die ganze Routine mal getestet und mir auch mal über ShowMessage ein paar werte ausspucke lassen. Dabei habe ich interessanterweise festgestellt, das die Schleife bis 0 geht. Also die Ermittlung der Anzahl der Panels funktioniert nicht richtig.

Zitat:

Hast du nach den Ändern der Farbe das Fenster neu zeichnen lassen (Invalidate, Repaint ...)?
- Nein habe ich nicht gemacht.

oki 7. Jan 2007 19:45

Re: Panels alle gleichfarbig machen
 
Und dein Owner bei Create?


Zitat:

Zitat von Christian18
- Ich habe die ganze Routine mal getestet und mir auch mal über ShowMessage ein paar werte ausspucke lassen. Dabei habe ich interessanterweise festgestellt, das die Schleife bis 0 geht. Also die Ermittlung der Anzahl der Panels funktioniert nicht richtig.

Soll das heißen, das ComponentCount = 0 ist?

Wenn das so ist, dann sind deine Panels bei einem anderen Owner.

Gruß oki

Hawkeye219 7. Jan 2007 19:46

Re: Panels alle gleichfarbig machen
 
Dann benutzt du also weiterhin deinen Code. Weil du dort alle Panels mit Owner=NIL erzeugst, wirst du mit der FindComponent-Variante keinen Erfolg haben. Du benötigst ein zusätzliches Array zum Speichern der Panel-Referenzen. marabu benutzt in seinem Code das Formular als Owner. Hier hast du die freie Auswahl aus den vorgestellten Möglichkeiten.

Gruß Hawkeye

MrKnogge 7. Jan 2007 19:49

Re: Panels alle gleichfarbig machen
 
Zitat:

Zitat von Christian18
- Ich habe die ganze Routine mal getestet und mir auch mal über ShowMessage ein paar werte ausspucke lassen. Dabei habe ich interessanterweise festgestellt, das die Schleife bis 0 geht. Also die Ermittlung der Anzahl der Panels funktioniert nicht richtig.

Und wo startet sie ?
Es könnte sein, dass der Compiler die Schleife rumdreht (der performance wegen)

Zitat:

Zitat von Christian18
Zitat:

Hast du nach den Ändern der Farbe das Fenster neu zeichnen lassen (Invalidate, Repaint ...)?
- Nein habe ich nicht gemacht.

[/quote]
Dann probier es mal damit.

Und zu guter letzt bleibt die Frage mit den XP-Themes.

Christian18 7. Jan 2007 19:53

Re: Panels alle gleichfarbig machen
 
wie kann ich denn herrausfinden wer der owner ist??? das hör ich jetzt zum erstem mal.

oki 7. Jan 2007 19:54

Re: Panels alle gleichfarbig machen
 
Hi,


Zitat:

Zitat von Hawkeye219
Dann benutzt du also weiterhin deinen Code.

Das mit dem Link hätte ich auch gern gewußt. :?

Damit ist alles klar, wie in meiner letzten Frage; der Owner ist schult. Kein Owner, kein Eintrag in eine Liste Components (logisch).

Gruß oki

MrKnogge 7. Jan 2007 19:55

Re: Panels alle gleichfarbig machen
 
Sorry, hab da was verwechselt.

oki 7. Jan 2007 19:57

Re: Panels alle gleichfarbig machen
 
Der Owner ist der, den du als Owner beim Create angibst.

Delphi-Quellcode:
MyPanel := TPanel.Create(ScrollBox1);
Hier ist Scrollbox1 der Owner (Besitzer).

Gruß oki

Christian18 7. Jan 2007 20:05

Re: Panels alle gleichfarbig machen
 
Hey jetzt funktioniert es vielen vielen dank.

Eine Frage habe ich noch. Die Images die ich auf den Panels drau habe, welchen owner haben die denn??? Also ich habe pro Panel ein Image drauf.

MrKnogge 7. Jan 2007 20:07

Re: Panels alle gleichfarbig machen
 
Das dass du bei dem Create des Images angiebst.
Delphi-Quellcode:
Image := TImage.Create({hier steht der Owner});

oki 7. Jan 2007 20:08

Re: Panels alle gleichfarbig machen
 
so du beim Create nichts anderes angegeben hast (nil :wink: ) das Panel.
Delphi-Quellcode:
myImage := TImage.create(mypanel);
MyImage.Parent := MyPanel;
Gruß

Christian18 7. Jan 2007 20:11

Re: Panels alle gleichfarbig machen
 
ok dann habe ich das mit den Owner jetzt kapiert. Man lernt wirklich nie aus. naja nochmals vielen dank für eure Hilfe.

oki 7. Jan 2007 20:13

Re: Panels alle gleichfarbig machen
 
gern geschehen!

Gruß oki


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