![]() |
Arrayelement anklicken
Ich habe folgendes Problem!
Ich habe ein array of TImage und möchte, dass die einzelnen elemnte angeklickt werden können. Karte[1].OnClick funktioniert nicht
Delphi-Quellcode:
Ich habe die Bilder in die Form geladen um "picture.loadfromfile();" nicht zu benutzen, damit ich am Ende nur eine Exedatei habe.
var
Form1: TForm1; var karte : array [1..100] of TImage; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); var j,i,a,b :integer; begin a:=2; b:=2; for j:= 1 to 4 do begin for i:=1 to 5 do begin Karte[i]:=TImage.Create(Self); Karte[i].Parent:= Self; Karte[i].Left:=a; Karte[i].Top:= b; Karte[i].AutoSize:=True; Karte[i].Picture := Image1.picture; a:=a+100; end; a:= 2; b:= b+ 100; end; end; Ich möchte das Spiel Memory machen. Vielen Dank im Voraus! |
Re: Arrayelement anklicken
Du musst dem OnClieck-Event auch eine Prozedur zuweisen :wink:
Oder was genau funktioniert nicht ? Gruß |
Re: Arrayelement anklicken
Ja, aber ich kann ja mit einem Array keine OnClick procedur machen!
Ich möchte, dass wenn ich auf das element karte[1] klicke dann folgendes passiert karte[1].picture := Image2.picture; Aber das klappt nur, wenn sich dieses Element auch anklicken lässt, nur weiss ich nicht, wie ich es dazu bringen soll, anklickbar zu sein! |
Re: Arrayelement anklicken
Sotov,
Zitat:
Delphi-Quellcode:
TForm1 = class(TForm)
//... procedure Image1Click(Sender: TObject); //... procedure TForm1.Image1Click(Sender: TObject); begin //... end; //... Karte[i].OnClick := Image1Click; |
Re: Arrayelement anklicken
Deine OnClick Prozedur müsste dann ungefair so aussehen:
Delphi-Quellcode:
Gruß
procedure TForm1.OnMyClick(Sender: TObject);
begin (Sender as TImage).picture := Image2.picture; end; |
Re: Arrayelement anklicken
Hmm, so hatte ich es mir am Anfang auch gedacht, aber irgendwie klappt es nicht!
Delphi-Quellcode:
Es passiert absolut nichts, wenn ich das objekt karte[1] anklicke!
procedure TForm1.Image1Click(Sender: TObject);
begin Karte[1].OnClick := Image1Click; showmessage('hi'); end; Zitat:
|
Re: Arrayelement anklicken
Dieser Teil muss in deine Schleife, dass jedes Image, diese Prozedur zugewiesen bekommt.
Delphi-Quellcode:
[Add]
Karte[1].OnClick := Image1Click;
Zitat:
Delphi-Quellcode:
schreibst du in dein Image1Click.
(Sender as TImage).picture := Image2.picture;
Zur Erklärung: Durch Sender "weis" die Prozedur, welches TImage angeklickt wurde und in das läd er dann das Bild aus Picture2. Gruß |
Re: Arrayelement anklicken
Super! Klappt alles!
Vielen dank! |
Re: Arrayelement anklicken
bist du sicher, daß alles richtig funktioniert?
Delphi-Quellcode:
for j := 1 to 4 do begin
for i := 1 to 5 do begin Karte[i] so wäre es wohl etwas besser
Delphi-Quellcode:
oder 0-basierend
for j := 1 to 4 do begin
for i := 1 to 5 do begin Karte[(j - 1) * 5 + i]
Delphi-Quellcode:
var karte : array [0..99] of TImage;
for j := 0 to 3 do begin for i := 0 to 4 do begin Karte[j * 5 + i] |
Re: Arrayelement anklicken
Hmm, ich weiss nicht was es geändert haben soll, denn es hat sich absolut nichts verändert!
Aber trotzdem vielen dank! |
Re: Arrayelement anklicken
Schau dir mal deine Schleifen genau an, wenn du die äußere Schleife zum zweiten mal durchläufst, dann erstellst du wieder die TImage mit dem Index [1] - [5]
Gruß |
Re: Arrayelement anklicken
Uuups! das ist mir ja noch garnicht aufgefallen :oops:
Dankeschön! |
Re: Arrayelement anklicken
Und vergiss bitte nicht die Images, am Ende (am besten im OnDestroy von Form1), wieder freizugeben.
Delphi-Quellcode:
Gruß
for j := 0 to 3 do
for i := 0 to 4 do Karte[j * 5 + i].free; |
Re: Arrayelement anklicken
Ja, muss ich, sonst kann ich keine levels machen!
|
Re: Arrayelement anklicken
Noch eine Frage:
Mit dem Ereignis OnClick möchte ich die Anzahl der Clicks zählen und je nachdem ob es klick1 oder klick2 ist, möchte ich das bild einer variable karte1 oder karte2 zuordnen, die vom typ TImage sind. So sieht es aus bei mir:
Delphi-Quellcode:
klick ist globaldeklariert und von typ integer
procedure TForm1.Image1Click(Sender: TObject);
var karte1,karte2: TImage; begin (Sender as TImage).picture := Image2.picture; klick:=klick+1; if klick = 1 then karte1.OnClick := Karte[(j - 1) * x + k]; else if klick = 2 then karte2.OnClick:= Karte[(j - 1) * x + k]; if Karte2 =Karte1 then showmessage('hallo'); end; das problem ist, ich weiss nicht wie man auf die gerade angeklickte karte zugreift. Ich habe versucht die variablen j,x,k global zu deklarieren und sie hier in deiser procedure zu benutzen, aber das klappt nicht.Vielleicht hat jemadnd eine lösung für mich. Der Überlegung nach, sollte nach dem zweiten Klick diese Message kommen, es passiert aber nichts! |
Re: Arrayelement anklicken
Na mit (Sender as TImage) so wie du es bereits machst.
Gruß |
Re: Arrayelement anklicken
entweder du gehst das Array durch und vergleichst
Delphi-Quellcode:
oder du speicherst den Index im Bild:
for j := 1 to 4 do
for i := 1 to 5 do if Sender = Karte[(j - 1) * 5 + i] Then .. // oder for i := 1 to 20 do if Sender = Karte[i] Then ..
Code:
Abrufen dann z.B. so
for j := 1 to 4 do
for i := 1 to 5 do begin Karte[(j - 1) * 5 + i]:=TImage.Create(Self); Karte[(j - 1) * 5 + i].Parent := Self; Karte[(j - 1) * 5 + i].Left := a; Karte[(j - 1) * 5 + i].Top := b; Karte[(j - 1) * 5 + i].AutoSize := True; [color=#ff0000][b] Karte[(j - 1) * 5 + i].Tag := (j - 1) * 5 + i; [/b][/color] Karte[(j - 1) * 5 + i].Picture := Image1.picture; Karte[(j - 1) * 5 + i].OnClick := Image1Click; end;
Delphi-Quellcode:
Index := Sender.Tag;
//oder Index := TImage(Sender).Tag; //oder Index := (Sender as TImage).Tag; PS: mal ein bissl Code ... wenn du Lust hat, dann schau ihn dir mal an ... is so'n kleiner Vorschlag, wie man es auch machen könnte :angel:
Delphi-Quellcode:
var karte : array [0..19] of TImage;
procedure TForm1.FormCreate(Sender: TObject); var i: integer; begin for i := 0 to 19 do begin Karte[i] := TImage.Create(Self); Karte[i].Parent := Self; Karte[i].Left := (i mod 5) * 100 + 2; Karte[i].Top := (i div 5) * 100 + 2; Karte[i].AutoSize := True; Karte[i].Tag := i; Karte[i].Picture := Image1.picture; Karte[i].OnClick := Image1Click; end; end; procedure TForm1.FormCreate(Sender: TObject); var i: integer; begin for i := 0 to 19 do Karte[i].free; end; procedure TForm1.Image1Click(Sender: TObject); begin Karte[TImage(Sender).Tag] // diese Karte wurde angeklickt end; |
Re: Arrayelement anklicken
Großartig!
Hat geklappt! Danke schön! Noch eine kleine Frage: Karte[k].Picture := Image1.picture; wie kann man diese 1 zu einer variable machen? |
Re: Arrayelement anklicken
Mit FindComponent. Das ist aber unperfomant. Was genau willst du denn machen?
|
Re: Arrayelement anklicken
Zitat:
Die Bilder kannst du dann zur Laufzeit mit Picture.LoadFromFile laden. Gruß |
Re: Arrayelement anklicken
Zitat:
|
Re: Arrayelement anklicken
Probier mal folgendes:
Delphi-Quellcode:
Nun solltest du mit img[1] auf das Image1 zugeifen können.
var
img[1..2]: array of TImage; ... img[1] := Image1; img[2] := Image2; Andernfalls könntest du auch deine Bilder (Bitmaps ?) als Ressource einbinden und zur Laufzeit aus dieser laden. Gruß |
Re: Arrayelement anklicken
Zitat:
Wie macht man das? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz