Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi label farbe verändern (https://www.delphipraxis.net/78822-label-farbe-veraendern.html)

TylerDurden 11. Okt 2006 15:39


label farbe verändern
 
Hallo,

bin ganz neu hier und hoffe das ich alles so richtig mache!

Kann mir evtl. jemand helfen folgenden Quellcode zu vereinfachen bzw. zu verkürzen???
Delphi-Quellcode:
procedure TForm1.Label11Klick(Sender: TObject);
begin
  LabelKlick(Sender);
  if Label11.Color = clWindow then Label11.Color:= clRed else Label11.Color:= clWindow;
  if Label10.Color = clWindow then Label10.Color:= clRed else Label10.Color:= clWindow;
  if Label12.Color = clWindow then Label12.Color:= clRed else Label12.Color:= clWindow;
  if Label7.Color = clWindow then Label7.Color:= clRed else Label7.Color:= clWindow;
  if Label15.Color = clWindow then Label15.Color:= clRed else Label15.Color:= clWindow;
  WinGame;
end;

procedure TForm1.Label12Klick(Sender: TObject);
begin
  LabelKlick(Sender);
  if Label12.Color = clWindow then Label12.Color:= clRed else Label12.Color:= clWindow;
  if Label11.Color = clWindow then Label11.Color:= clRed else Label11.Color:= clWindow;
  if Label8.Color = clWindow then Label8.Color:= clRed else Label8.Color:= clWindow;
  if Label16.Color = clWindow then Label16.Color:= clRed else Label16.Color:= clWindow;
  WinGame;
end;
geht so weiter bis Label16 soll aber wenn möglich noch weiter gehen!

Schon mal vielen Dank im voraus!

P.S.: Hab es übrigens schon mit einem Array of TLabel probiert komm aber nicht wirklich weiter

[edit=sakura] [delphi]-Tags Mfg, sakura[/edit]

ste_ett 11. Okt 2006 15:43

Re: label farbe verändern
 
Mit FindComponent() alle Komponenten auf deinem Formular durchgehen.

Beispiele gibts's zu Hauf hier per Suchfunktion. :)

sakura 11. Okt 2006 15:47

Re: label farbe verändern
 
Zitat:

Zitat von TylerDurden
bin ganz neu hier und hoffe das ich alles so richtig mache!

Fast, aber wir helfen gerne. Ich habe für Dich mal die [delphi]-Tags eingefügt, um Deinen Code zu formatieren ;)

...:cat:...

TylerDurden 12. Okt 2006 06:59

Re: label farbe verändern
 
Erstmal vielen Dank für die Unterstützung!

Werde das mal so versuchen!
Aber noch ne Frage: funktioniert das mit Arrays nicht???
Wenn doch wie ???

Über weitere Hilfe wäre ich dankbar!

Tormentor32 12. Okt 2006 07:18

Re: label farbe verändern
 
Delphi-Quellcode:

var
  MyArray: Array[1..16] {oder wieviele du brauchst} of TLabel;

// ins Form1.Create
for i := 1 to 16 do
  begin
    MyArray[i] := Tlabel.Create(Form1);
    MyArray[i].show;
    //Diverse Einstellungen Wie Farbe Größe etc...
   
  end;

// ins Form1.close

for i := 1 to 16 do
  MyArray[i].free;

TylerDurden 12. Okt 2006 10:41

Re: label farbe verändern
 
Liste der Anhänge anzeigen (Anzahl: 2)
Weiß nicht evtl. ne dumme Frage aber ich kapiers nicht!!!

erstellt es mir die Labels so automatisch (16 Stück) oder muss ich die Labels selbst noch einfügen???

Wenn es mir die Labels automatisch erstellt, welche Eigenschaften muss ich denn mindestens angeben ???

Außerdem soll die Farbe nur bei einem Klick aufs Label verändert werden und zusätzlich die Farbe der Labels drüber drunter und daneben (wie ein Kreuz sozusagen)

Tormentor32 8. Jan 2007 09:35

Re: label farbe verändern
 
Also in diesem Fall würde ich folgendermaßen vorgehen:

Als erstes solltest du einen 2-Dimensionalen Array Typ verwenden

Delphi-Quellcode:
type
  TMy2DArray = Array[0..3,0..3] of boolean;
  // Der Inhalt des Feldes ist entweder Rot oder nicht rot, also sollte Boolean genügen
{ ... }

var // und noch eine Variable, die das Feld darstellt
  My2DArray: TMy2DArray;
Als nächstes brauchst du eine Zeichenfläche, die dein Feld darstellt, es ist in diesem fall zwar
möglich, 16 Labels zu nehmen, aber es ist viel schöner, wenn wir das alles auf ein Canvas Objekt zeichnen.
Ein TImage sollte hier genügen. und was Machst du, wenn du nicht 16, sondern 160 Labels hast...

Jetzt sollten wir uns überlegen, wie wir das Ganze zeichnen. Da wir ein zweidimensionales Array haben,
können wir bequem mit zwei For-Schleifen arbeiten.
Delphi-Quellcode:
procedure Zeichne(Arr: TMy2DArray; img: TImage);
var x,
    y, // Das sind die beiden Variablen für die Schleifen
    breite,
    hoehe: integer;
    Buffer: TBitmap; // Zunächst auf den Buffer zeichnen;
begin
  Buffer := TBitmap.Create; // Den Konstruktor des Buffers aufrufen,
    // Damit wir darauf Zeichnen können
  Buffer.Width := img.Width;
  Buffer.Height := img.Height; // Dem Buffer die Richtige Größe zuweisen
  Breite := Buffer.Width div Length(Arr); // Breite und Hoehe eines Feldes
  Hoehe := Buffer.Height div Length(Arr[x]); // ausrechnen
  for x := low(Arr) to high(Arr) do // Die Schleifen
    for y := low(Arr[x]) to high(Arr[x]) do
      begin
        if Arr[x,y] // Wenn das Feld true ist...
          then
            Buffer.Canvas.Brush.Color := clred
          else
            Buffer.Canvas.Brush.Color := clwhite;
        Buffer.Canvas.Rectangle(x*breite,y*hoehe,(x+1)*breite,(y+1)*hoehe);
        //jetzt zeichnen wir an die Dementsprechende Stelle ein Rechteck
      end;
  img.Canvas.Draw(0,0,Buffer); //Den Buffer auf das Image zeichnen
  Buffer.Free; // Den Buffer wieder freigeben
end;
Aber wie können wir durch klicken den Gewünschten effekt erzielen? Ganz einfach:
Im OnMouseDown Ereignis deines TImage werden die Koordinaten mitübergeben, also können
wir daraus die Position errechnen:
Delphi-Quellcode:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var PosX,
    PosY: integer;
begin
  PosX := X div (image1.Width div length(My2DArray));
  PosY := Y div (image1.Height div length(My2DArray[x]));
    // Die Positionen im Array ausrechnen
  if (PosX in [low(My2DArray)..high(My2DArray)]) and
     (PosY in [low(My2DArray[PosX])..high(My2DArray[PosY])])
    then // Liegen die Werte auch wirklich innerhalb des Arrays?
      begin
        My2DArray[PosX,PosY] := not My2DArray[PosX,PosY];
        // Jeweils überprüfen, ob man sich am Rand befindet
        if PosX > low(My2DArray)
          then
            My2DArray[PosX-1,PosY] := not My2DArray[PosX-1,PosY];
        if PosX < high(My2DArray)
          then
            My2DArray[PosX+1,PosY] := not My2DArray[PosX+1,PosY];
        if PosY > low(My2DArray[PosX])
          then
            My2DArray[PosX,PosY-1] := not My2DArray[PosX,PosY-1];
        if PosY < high(My2DArray[PosX])
          then
            My2DArray[PosX,PosY+1] := not My2DArray[PosX,PosY+1];
      end;
  Zeichne(My2DArray,image1); // Jetzt nur noch zeichen
  if AlleTrue(My2DArray) // Siehe unten
    then
      showmessage('Geschafft');
end;
Jetzt müssen wir nur noch überprüfen, ob nach dem Klicken alle Felder Rot sind
Delphi-Quellcode:
function AlleTrue(Arr: TMy2DArray): boolean;
var Bool: boolean; // Hilfsvariable
    x,
    y: integer; // Zählvariablen für die Schleife
begin
  Bool := true;
  for x := low(Arr) to high(Arr) do // Die Schleifen
    for y := low(Arr[x]) to high(Arr[x]) do
      if not Arr[x,y]
        then
          bool := false;
  result := bool;
end;
Und schon haben wir das Spiel fertig! Und das beste daran ist: Das Ganze ist so dynamisch gehalten,
dass du einfach die Werte oben in der Arraydeklaration ändern kannst, und es wird weiterhin funktionieren, z.B.:
Delphi-Quellcode:
  TMy2DArray = Array[0..5,0..9] of boolean;
So viel Spaß damit und ich hoffe, mein Erklärungen waren ausführlich genug :wink:

Gruß Richard

PS: Grob getestet, sollte keine Fehler aufweisen...

Übrigens: Eine Feldgröße von 4*4 würde ich nicht empfehlen, da man in 4 Klicks gewinnen kann...


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz