Dynamische Buttons auslesen

Für Fragen von Einsteigern und Programmieranfängern...
m3zz0m1x
Beiträge: 12
Registriert: Do 25. Feb 2010, 13:50

Dynamische Buttons auslesen

Beitrag von m3zz0m1x »

Ich weiß nicht ob der begriif dynamische buttons ganz zutreffend ist aber ich hoffe es einfach mal^^
also mein problem ist folgendes ich erstelle mit einem array of array of Tbutton (siehe quelltext unten)
ein feld von buttons, diese sind aber, da sie erst beim erstellen der form erstellt werden, nicht im objektinspektor aufgeführt, sprich ich weiß nicht wie ich eine prozedur zu den einzelnen buttons erstelle...
ich bräuchte einene prozedur, die beim klicken auf einem button im feld, mit den jeweiligen zum button gehörigen nummern (also z.B für den button oben rechts, wären es ja feld [1][1]) aufgerufen wird.
wäre für außerst dankbar wenn ihr mir helfen könntet

MFG m3zz0m1x

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1;
  feld: array[1..8] of array[1..8] of TButton;
 
implementation
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
  begin
    form1.close;
  end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
   x: integer;
   y: integer;
begin
   For x:=1 to 8 do
     begin
       For y:=1 to 8 do
         begin
           feld[x][y]:=TButton.Create(NIL);
           with feld[x][y] do
             begin
               parent:=form1;
               Top:=x*75;
               Height:=75;
               left:=y*75;
               width:=75;
               visible:=true;
             end;
         end;
     end;
end;
 
initialization
  {$I unit1.lrs}
 
end.
Zuletzt geändert von m3zz0m1x am Do 25. Feb 2010, 15:30, insgesamt 1-mal geändert.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Dynamische Buttons auslesen

Beitrag von mschnell »

z.B.
in der Erstellungs-Schleife:

feld[x][y].Tag := (y-1) * $10000 + (x-1)

beim für alle Buttons gemeinsamen OnClick-Event:

r := (Sender as TButton).Tag;
x := (r and $FFFF) +1;
y := (r shr 16) + 1;


-Michael

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Dynamische Buttons auslesen

Beitrag von AlterMann »

Du könntest bei der Erstellung der Buttons dem Tag-Feld einen eindeutigen Wert zuweisen (z.B. 10*x+y)

Dann die Adresse einer vorhandenen Procedure übergeben (Button.OnClick := @Auswertungsprocedure

und in Auswertungsprocedure(Sender:TObject) den Tag auswerten: TButton(Sender).Tag

Grüße
Christian
Früher war alles besser. Und aus Holz!

m3zz0m1x
Beiträge: 12
Registriert: Do 25. Feb 2010, 13:50

Re: Dynamische Buttons auslesen

Beitrag von m3zz0m1x »

also erstmal danke für die lösungen :)
aber öhm tut mir leid aber ich versteh irgendwie nicht was ich jetzt kokret machen muss...
vllt sollte ich dazusagen das cih ein totaler lazarus neuling bin :/
was heißt denn "dem tag-feld einen eindeutigen wert zuweisen und die adresse übergeben"?
sind die beiden arrays, mit den zwei variablen als Koordinaten kein eindeutiger wert für die Benennung der Felder oder wie meinst du das?
und wieso grade 10*x+y?
gibt es keine Möglichkeit eine "anklick Feld[x][y]"-Prozedur oder sowas zu schreiben?(sry falls ihr mir versucht habt genau das zu erklären^^)

mfg m3zz0m1x

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Dynamische Buttons auslesen

Beitrag von pluto »

gibt es keine Möglichkeit eine "anklick Feld[x][y]"-Prozedur oder sowas zu schreiben?(sry falls ihr mir versucht habt genau das zu erklären^^)
Ja, die gibt es die ist sogar recht einfach, hier mal ein Beispiel, was du auch auf dein Problem übertragen kannst:

Code: Alles auswählen

var
  myButton:TButton;
begin
  myButton:=TButton.Create(Form1)
  myButton.parent:=Form1;
  myButton.OnClick:=@MyButtonClick
end;
 
procedure TForm1.MyButtonClick(Sender:TObject);
begin
  ShowMessage('Ich wurde angeklickt');
end;
Wenn du ein Array verwendest geht das genau so: Feld[0,0].OnClick:=@myButtonClick;
Für andere Events geht das ebenfalls so.
Du brauchst in deinem Fall zwei Verschachtele Forschleifen:

Code: Alles auswählen

for x:=0 to 8 do begin
  for y:=0 to 8 do begin
    Feld[x,y].onClick:=@myButtonClick;
  end;
end;
Das wird so noch nicht ganz laufen, es ist eine Art Pseude-Code, der aber dem Original sehr Nah kommt. Ich hoffe das hilft dir weiter...

Kleiner TIP:
Achte auf deine Soruce-Code Formatierung. Da gebe ich dir eine glatte 6 und nutzte bitte die Code-Tags. Dann kann man den Code auch besser lesen. Wenn du nicht weißt wie du den Soruce-Code zu Formatieren hast:
http://www.delphi-treff.de/delphi-styleguide/" onclick="window.open(this.href);return false;
da solltest du Antworten finden.
MFG
Michael Springwald

m3zz0m1x
Beiträge: 12
Registriert: Do 25. Feb 2010, 13:50

Re: Dynamische Buttons auslesen

Beitrag von m3zz0m1x »

danke für die hilfe pluto das is glaube ich ziemlich genau das was ich brauche ( werds gleich ausprobieren) :)
zur formatierung: meinst du das einrücken usw?
naja das hab ich alles gemacht das dumme ist nur das zitat formatierungen nicht übernimmt warum auch immer :/

edit: ok weiß jetzt was du meintest, sry^^

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Dynamische Buttons auslesen

Beitrag von pluto »

zur formatierung: meinst du das einrücken usw?
naja das hab ich alles gemacht das dumme ist nur das zitat formatierungen nicht übernimmt warum auch immer :/
Genau, dafür gibt es ja ein einen Entsprechen Tag: Highligter(ComboBox) da kannst du die passende Sprache auswählen... du kannst deinen ersten Beitrag noch bearbeiten...
MFG
Michael Springwald

m3zz0m1x
Beiträge: 12
Registriert: Do 25. Feb 2010, 13:50

Re: Dynamische Buttons auslesen

Beitrag von m3zz0m1x »

ok sry für den doppelpost aber es funktioniert irgendwie nicht, wenn ich jetzt schreibe

Code: Alles auswählen

For x:=1 to 8 do
     begin
       For y:=1 to 8 do
         begin
           feld[x][y].onclick:=@globalclick;
         end;
     end;
bekomme cih als fehlermeldung:

Code: Alles auswählen

unit1.pas(68,32) Error: Incompatible types: got "<procedure variable type of procedure of object;Register>" expected "<procedure variable type of procedure(TObject) of object;Register>"
unit1.pas(82) Fatal: There were 1 errors compiling module, stopping

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Dynamische Buttons auslesen

Beitrag von theo »

Und wie sieht GlobalClick aus? So?

procedure TForm1.GlobalClick(Sender:TObject);

m3zz0m1x
Beiträge: 12
Registriert: Do 25. Feb 2010, 13:50

Re: Dynamische Buttons auslesen

Beitrag von m3zz0m1x »

nein sah es nicht ich hatte nämlich das (sender:Tobject) vergessen^^
auf ejden fall funktioniert es, nur, kann ich mir jetzt in die prozedur globalclick noch rigendwie die nummern des gedrückten buttons eingeben lassen?
also als beispiel, wird z.B der button rechts oeben gedrückt, heißt es ja "feld[1][1].click", kann ich mri diese beiden einsen irgendwie an meine globalclick-prozedur weitergeben lassen?
also das diese irgendwie erfährt, welcher der buttons im feld gedrückt wurde? als normale eingeben fnuktnoiert das ganze ja nicht da onlick nunmal normalerweise nur eine variable ausgibt, oder?

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Dynamische Buttons auslesen

Beitrag von theo »

m3zz0m1x hat geschrieben: also das diese irgendwie erfährt, welcher der buttons im feld gedrückt wurde?
Diese Frage ist weiter oben schon beantwortet. Vielleicht liest du das einfach mal durch? :wink:

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Dynamische Buttons auslesen

Beitrag von pluto »

Das geht auch, nur ist etwas umständlicher. Wenn du nur ein einfachen 1D Array hättest währ es leicht, du könntest die Tag Eigenschaft nutzen.

So musst du eine neue Klasse erstellen von TButton ableiten und dort neue Eigenschaften hinzufügen. Eine andere Möglichkeit währe über den Namen:
B_0_0
0 währe x und die zweite 0 währe y. Denn musst du beim erstellen vergeben und beim Klicken kannst du dann folgendes schreiben:
ShowMessage((Sender as TButton).name));
wobei du hier den namen "Parsen" musst. Stichwort: Pos, PosEXT und Copy.
MFG
Michael Springwald

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: Dynamische Buttons auslesen

Beitrag von hendy »

Hey m3zz0, schick, dich hier zu sehen, wenn du willst erklär ich es dir in skype später, ja?
Danke an alle, die paar Lösungsansätze brauchte ich ^^
Dankt monta !!

Dets
Beiträge: 61
Registriert: Di 11. Sep 2007, 16:59
OS, Lazarus, FPC: Ubuntu Maverick (L 0.9.28.2-10, FPC 2.4.0)
CPU-Target: 32Bit
Wohnort: Lage
Kontaktdaten:

Re: Dynamische Buttons auslesen

Beitrag von Dets »

pluto hat geschrieben:So musst du eine neue Klasse erstellen von TButton ableiten und dort neue Eigenschaften hinzufügen.
Das dürfte doch die einfachste Variante sein: im Interface-Abschnitt eine neue Button-Klasse definieren.

Code: Alles auswählen

TMyButton = class(TButton)
  public
    x: integer;
    y: integer;
end;
Jetzt beim Erzeugen das Button-Array halt mit TMyButton generieren, X und Y zuweisen und im OnClick auswerten.

Viel Spaß, Dets ...

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Dynamische Buttons auslesen

Beitrag von mschnell »

Dets hat geschrieben: im Interface-Abschnitt eine neue Button-Klasse definieren.
Das ist natürlich die "professionelle" Methode !

Jetzt kann man darüber hinaus - wenn das sinnvoll erscheint - noch die OnClick Property direkt im Create auf eine interne Prozedur zuweisen

inherided OnClick := MyButtonClick;

und die x/y-Auswertung in der Klasse machen.

-Michael

Antworten