Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Indiziert auf Panels zugreifen (https://www.delphipraxis.net/137984-indiziert-auf-panels-zugreifen.html)

Mirjam88 1. Aug 2009 14:00


Indiziert auf Panels zugreifen
 
Hallo zusammen,

bin blutige Anfängerin also bitte um Rücksicht :cat:

ich habe 400 kleine Panels in meinem Programm.
Alle sollen per Click ihre Farbe ändern.
Nun habe ich keine Lust, 400 OnClick Ereignisse zu schreiben.

Wie würde das am einfachsten gehen?

Ich habe mir gedacht, dass ale 400 Panels per onClick Ereignis in eine gleiche procedure laufen und dann per
TPanel(Components[i]).Color:= CLBlack;
ihre Farbe ändern, da jedes Panel einen anderen TAG hat.
Aber wie kann ich unterscheiden, welches Panel gedrückt wurde, also welches i vorliegt? :gruebel:

Cyf 1. Aug 2009 14:21

Re: Indiziert auf Panels zugreifen
 
Du kannst auch mehreren Panels, die selbe OnClick-Prozedur zuweißen und dann die Änderungen mit dem Sender Parameter vornehmen. Wenn du jetzt keine Lust hast 400 mal, den Namen dieser Prozedur in deine (hoffentlich nicht alle manuell erstellten?) einzutragen, dann kannst du OnCklick ebenfalls zu Beginn zur Laufzeit zuweißen.

Delphi-Quellcode:
Panel.OnClick:= DeineMethode; //Deine Methode, muss hier wirklich eine Methode (des Forms) sein

Mirjam88 1. Aug 2009 14:26

Re: Indiziert auf Panels zugreifen
 
Verstehe leider nicht was Du meinst :roll:
Kannst Du mir ein Beispiel zeigen mit dem Sender Parameter ?

Die 400 Panels wollte ich schon selber ziehen, da sie alle die gleiche Größe haben ... einfach per Copy/Paste Funktion ...
Aber ich bin ganz offen ... wie geht das manuel?

Cyf 1. Aug 2009 15:07

Re: Indiziert auf Panels zugreifen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mal schnell ein kleines Beispiel zusammengetippt, solche Sachen wie das Verhalten, falls die Formgröße angepasst wird oder an welcher Seite die Panels sich dabei orientieren, könnte man dann ebenfalls noch hinzufügen (Anchors, etc.). Grundsätzlich lassen sich alle Eigenschaften der Standardcontrols auch zur Laufzeit setzen.
Ich denke das Beispiel ist ganz überschaubar, aber sollten Fragen bleiben, stell sie ruhig.

sx2008 1. Aug 2009 15:09

Re: Indiziert auf Panels zugreifen
 
Zitat:

Zitat von Mirjam88
ich habe 400 kleine Panels in meinem Programm.

Kennst du schon das TDrawGrid ?
Das ist eine rechteckige Zeichenfläche das viele Rechtecke (z.B. 20 * 20) enthält, wobei jedes Unterrechteck
einen beliebigen Inhalt anzeigen kann.
Damit kann man z.B. solche Dinge wie Schachbrett (mit Figuren), Memoryspiel, ... umsetzen.

Cyf 1. Aug 2009 15:16

Re: Indiziert auf Panels zugreifen
 
Das (oder manuell auf eine PaintBox zeichnen) ist natürlich besser, wenn es darum geht, viele kleine Symbole in einer Tabelle darzustellen und nicht zwingend für alles ein eigenes Control (mit Handle und Ereignissen) benötigt wird.
Dann müsste man allerdings selbst berechnen, wo ein Klick hingeht und kann nicht direkt Ereignisse zur Lösung benutzen, sondern man muss erst noch über die Clickkoordinaten berechnen, was den nun getroffen wurde (was auch nicht viel schwerer ist). Kommt auf den Anwendungszweck an.

Mirjam88 1. Aug 2009 15:36

Re: Indiziert auf Panels zugreifen
 
Vielen Dank für die vielen Ratschläge,

das TDrawGrid sieht nicht schlecht aus, kannte ich bisher nicht werde ich mir aber noch einmal anschauen ... ich denke damit wird es gehen :thumb:

@Cyf
Verstehe wie Dein Programm gemeint ist. Leider prangert er bei mir das const über nPanels = 9; an und sagt er würde ein end erwarten :wall:

Mirjam88 1. Aug 2009 15:51

Re: Indiziert auf Panels zugreifen
 
Ich habe den Code mal umgeschrieben weil der irgendwie die Deklaration mit den Globalen Vairablen nicht mochte ... keine Ahnung ob das jetzt so erlaubt ist wie ich es mache, bin eben kein Programmierer ... aber es klappt :oops:
Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure OnPanelClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  const
    nPanels = 9;

  var
    Form1: TForm1;
    FPanels: array[0..nPanels-1] of TPanel;

  implementation

  {$R *.DFM}

//******************************************************************************

procedure TForm1.FormCreate(Sender: TObject);
const
  PanelsPerRow = 3;
  PanelsPerCol = 3;
var
  i, j: Cardinal;
  Top, Left, Height, Width: Cardinal;
begin
  Top:= 0;
  Left:= 0;
  Height:= Self.ClientHeight div PanelsPerCol;
  Width:= Self.ClientWidth div PanelsPerRow;

  for i := 0 to PanelsPerCol-1 do
  begin
    for j := 0 to PanelsPerRow - 1 do
    begin
      FPanels[i]:= TPanel.Create(Self); //Formular ist Owner
      //hier das Control, das den Panel enthält (hier auch das Formular)
      FPanels[i].Parent:= Self;
      FPanels[i].OnClick:= OnPanelClick;
      FPanels[i].Top:= Top;
      FPanels[i].Left:= Left;
      FPanels[i].Height:= Height;
      FPanels[i].Width:= Width;
      FPanels[i].Color:= clBlue;
      Left:= Left + Width;
    end;
    Top:= Top + Height;
    Left:= 0;
  end;
end;



procedure TForm1.OnPanelClick(Sender: TObject);
begin
  //Farbe invertieren
  TPanel(Sender).Color:= TPanel(Sender).Color xor clWhite;
end;

end.


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