Autor Beitrag
noctua
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: Fr 29.04.05 12:24 
ich hab da n kleines problem, ich habe , sagen wir mal 100 buttons auf meiner form, jeder mit einem anderen namen. Ich habe jedem Button auch eine eigene variable zugeordnet.
sagen wir mal das button1 die variable map[1,1] hat und button2 die variable map[1,2].

jetzt möchte ich auf einen dieser buttons klicken und in die dazugehörige variable soll jetzt der wert 'hallo' geschrieben werden. dazu muss ich ja wissen auf welchen button gedrückt wurde, aber wie mache ich das?

soll ich etwa zu jedem button einzelnd eine eigene onklick procedure schreiben?

_________________
Am ende sterben eh alle ................
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: Fr 29.04.05 12:28 
Titel: Re: auf welchen button wurde geklickt
z.B. mit FindComponent, oder Du iterierst über alle Komponenten der Form (Stichwort: TForm.ComponentCount und TForm.Components)
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 29.04.05 12:38 
Beim ButtonClick bekommst du den Sender übergeben.
Mit
ausblenden Delphi-Quelltext
1:
(Sender as TButton).Name					

Kannst du den Namen des auslösenden Buttons feststellen.
Du musst bei allen Button das Click-Ereignis auf die selbe Routine lenken.
Wenn du die numeriert hast, kannst du mit ein paar kleinen String-Operationen das zugehörige map[x,y] feststellen.
Auf diese Weise sollte es eigentlich relativ einfach sein, den Rest durchzuführen.
AG
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 29.04.05 18:02 
Du kannst jedem Button eine id zuordnen (ich glaube, das heißt .tag oder so ähnlich; ich denke mal, daß du die Buttons automatisch erzeugst, oder? Dann kannst du denen dabei gleich die id zuordnen;
Dann übergibst du jedem Button als OnKlick-Routine die gleiche Funktion, in der du
mit TButton(Sender).tag die Nummer des Buttons auslesen kannst
noctua Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: Sa 30.04.05 00:19 
automatisch erzeugen? ne nich das ich wüsste, ich mache alle 300 buttons per hand, wie soll man das den automatisch machen lassen? aber das is ja nicht mein größtes problem.


ich bin voll übervordert, seit heute morgen probiere ich schon rum, aber ich bekomm es einfach nicht hin

ich habe ja nun mein zwei-dimensionales-array und möchte das jedem button ein bestimmtes array zugewisen wird, aber wie schaff ich es das ich auf einen button klicke und nur ein bestimmtes array verändert wird, oder auf dem button nur das steht was in diesem bestimmten array ist.


ich schaff es einfach nicht.

_________________
Am ende sterben eh alle ................
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 30.04.05 11:38 
Moin!

Zitat:
300 buttons


Also in dieser Größenordnung solltest du die Buttons echt besser dynamisch erzeugen (also zur Laufzeit, da sieht man dann in der IDE nix von).

Zitat:
zwei-dimensionales-array und möchte das jedem button ein bestimmtes array


Zunächst mal nehme ich an, dass du mit dem zweiten "Array" eher ein Element des 2d-Arrays meinst, oder? :wink:

Schau dir mal diesen Code hier an, wenn du auf Handarbeit stehst (300 Buttons...), dann könnte das eine Lösung für dein Problem sein.

Zitat:
ich bin voll übervordert, seit heute morgen probiere ich schon rum, aber ich bekomm es einfach nicht hin


Immer wenn ich dieses Gefühl habe, weiß ich genau, dass meine Planung zu dem Projekt "shyce" war... :? Fazit in diesen Fällen: Computer ausschalten, Blatt Papier und Stift in die Hand, an den Schreibtisch und (nochmal) ordentlich die entscheidenden Punkte (was idR die Datenstrukturen sind!) aufzeichnen. Dabei wird dann meistens alles klar.

cu
Narses
noctua Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: Sa 30.04.05 21:02 
hmm ich packs trozdm nicht, mir fehlt die idee.

also, ich habe jetzt diesen code

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
var map: Array[1..41..5of string = (('1','2','3','4','5'),('6','7','8','9','10'),('1','12','13','14','15'),('16','17','18','19','20'));

implementation

{$R *.dfm}

procedure TForm1.Label1Click(Sender: TObject);
begin
  showmessage((Sender as TLabel).Name);
end;

procedure TForm1.Button1Click(Sender: TObject);
  var a,b : integer;
begin
  for a :=1 to 4 do
  begin
    for b :=1 to 5 do
    begin
      TLabel(FindComponent('label'+IntToStr((a-1)*5+(b)))).caption := map[a,b];
    end;
  end;
end;


so weit war ich schon, wenn ich auf ein label klicke dann steht der name des labels da und wenn ich auf den button klicke dann wird jedem Label ein Wert zugewiesen, aber ich schaff es nicht das wenn ich auf das label klicke er NUR den eigenen wert anzeigt :'(

das mit der handarbeit ist mir bei 300 zu viel, wenn es weniger wäre würd ich's ja amchen, aber so nich, aber wie soll ich das authomatisch erkennen lassen?


ich packs nicht alleine, mihr fehlt die idee, vielleicht ast du mehr tips

_________________
Am ende sterben eh alle ................
noctua Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: So 01.05.05 02:08 
fals es noch jemanden interessiert, habe ne kleine funktion dazu geschrieben die einem sagt welches Feld zu dem bestimmten button gehört

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
.....
var map: Array[1..181..20of string ;    // das 2d-array
.....

{$R *.dfm}

function MapLesen(Feld : string) : string;
  var i,a,b : integer;
begin
  i := 1;

    for a:=1 to 18 do
    begin
      for b:=1 to 20 do
      begin

        if Feld = IntToStr(i) then
        begin
          MapLesen := map[a,b];
        end;

        i := i+1;
      end;
      //b := 1;
    end;

end;


und um zu sechen was passt kommt sowas

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Image1Click(Sender: TObject);
  var ImageNr: string;
begin
  //herausfinden der LabelNr
  ImageNr := (Sender as TImage).Name;
  delete(ImageNr,1,5);

  showmessage(MapLesen(ImageNr));
end;


also hier wird der name der Image so umgeändert das man nur noch die nummer sieht , also aus 'image15' wird dann '15' und dieser zahl werden dann ihre array coordinaten zugewisen und der inhalt dieser wird als message ausgegeben.

_________________
Am ende sterben eh alle ................
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 01.05.05 13:28 
Moin!

Naja, da du auf meinen Code-Link (und die dahinterliegende record-basierte Methode) offensichtlich nicht angesprungen bist, hier nochmal ein bereits gemachter Vorschlag etwas präziser: :wink:

Erstmal die Fakten:
- 2d-Array, sagen wir n * m Elemente von 0..(n-1),0..(m-1)
- zu jedem Element einen Button, der was mit dem Elementinhalt tun soll
Soweit richtig?

Du erzeugst in der IDE die Buttons und gibst jedem Button in der Eigenschaft .Tag eine fortlaufende Nummer, so dass jeder Button eindeutig identifizierbar ist. Beispiel:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
+---------------------------------------------> x
|
|  +-------+   +-------+   +-------+   +-------+
|  |   0   |   |   1   |   |   2   |...|  n-1  |
|  +-------+   +-------+   +-------+   +-------+
|
|  +-------+   +-------+   +-------+   +-------+
|  |   n   |   |  n+1  |   |  n+2  |...| n*m-1 |
v  +-------+   +-------+   +-------+   +-------+
y

Natürlich müssen alle OnClick-Events auf die gleiche Prozedur gebogen werden.

Du kannst jetzt aus dem (Sender as TButton).Tag errechnen, welches Arrayelement zu dem Button gehört:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
const
  n,m
var
  a: ARRAY[0..n-1,0..m-1of String;
  x,y: Integer;

x := (Sender as TButton).Tag mod n;
y := (Sender as TButton).Tag div n;
a[x,y] := 'Hallo x='+IntToStr(x)+' y='+IntToStr(y);


Wenn das auch nicht weiterhilft, dann wirst du wohl etwas mehr von deinem Projekt "verraten" müssen, damit man angemessener helfen kann. :wink:

Vielleicht solltest du aber nochmal über die Anzahl Buttons nachdenken. Ich ganz persönlich halte alles oberhalb von 10 Buttons auf einem Formular eher verwirrend für den Benutzer... :?

cu
Narses
noctua Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: So 01.05.05 13:56 
naja, eigentlich soll es ein Map für ein spiel werden und die Buttons sind in wirklichkeit Images :D und jedes Feld hat einen bestimmten inhalt, entweder ist dort ein planet oder es ist lehr und dann noch paar andere infos (wie anzahl der produzierten einheiten pro runde).

Das mit dem "Code-Link (und die dahinterliegende record-basierte Methode)" habe ich nicht ganz verstanden, weil der da ja jedem seiner buttons ne eigene onKlickFunktion gegeben hat, oder ich hab einfach nicht genau gelesen.

das mit dem "1-n ... n*bla" is schon ne gute idee, auch wenn ich sie nicht verstehe, zumindest nicht ganz.


Aber es geht ja auch so, da sind zwar etwas zu viele schleifen, was nicht umbedingt positiv ist, aber es funktioniert.

_________________
Am ende sterben eh alle ................
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 02.05.05 00:43 
Moin!

Interesse daran, irgend etwas von dem von mir Gesagten zu verstehen oder willst du diesen Thread jetzt einfach ad acta legen (wobei mir dann schon unklar ist, wozu du ihn überhaupt aufgemacht hast... wenn ich das richtig sehe, hast du keinen der gemachten Vorschläge in Betracht gezogen, aber statt dessen sehr "bemerkenswerten" Code erzeugt...)? :gruebel:

cu
Narses