AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Indiziert auf Panels zugreifen

Ein Thema von Mirjam88 · begonnen am 1. Aug 2009 · letzter Beitrag vom 1. Aug 2009
Antwort Antwort
Mirjam88

Registriert seit: 1. Aug 2009
4 Beiträge
 
#1

Indiziert auf Panels zugreifen

  Alt 1. Aug 2009, 14:00
Hallo zusammen,

bin blutige Anfängerin also bitte um Rücksicht

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?
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#2

Re: Indiziert auf Panels zugreifen

  Alt 1. Aug 2009, 14:21
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.

Panel.OnClick:= DeineMethode; //Deine Methode, muss hier wirklich eine Methode (des Forms) sein
Man kann einen Barbier definieren als einen, der alle diejenigen rasiert, und nur diejenigen, die sich nicht selbst rasieren.
Rasiert sich der Barbier?
  Mit Zitat antworten Zitat
Mirjam88

Registriert seit: 1. Aug 2009
4 Beiträge
 
#3

Re: Indiziert auf Panels zugreifen

  Alt 1. Aug 2009, 14:26
Verstehe leider nicht was Du meinst
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?
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#4

Re: Indiziert auf Panels zugreifen

  Alt 1. Aug 2009, 15:07
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.
Angehängte Dateien
Dateityp: zip panellaufzeitbeispiel_553.zip (5,7 KB, 12x aufgerufen)
Man kann einen Barbier definieren als einen, der alle diejenigen rasiert, und nur diejenigen, die sich nicht selbst rasieren.
Rasiert sich der Barbier?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Indiziert auf Panels zugreifen

  Alt 1. Aug 2009, 15:09
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.
fork me on Github
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#6

Re: Indiziert auf Panels zugreifen

  Alt 1. Aug 2009, 15:16
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.
Man kann einen Barbier definieren als einen, der alle diejenigen rasiert, und nur diejenigen, die sich nicht selbst rasieren.
Rasiert sich der Barbier?
  Mit Zitat antworten Zitat
Mirjam88

Registriert seit: 1. Aug 2009
4 Beiträge
 
#7

Re: Indiziert auf Panels zugreifen

  Alt 1. Aug 2009, 15:36
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

@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
  Mit Zitat antworten Zitat
Mirjam88

Registriert seit: 1. Aug 2009
4 Beiträge
 
#8

Re: Indiziert auf Panels zugreifen

  Alt 1. Aug 2009, 15:51
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
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:20 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