Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Arrayelement anklicken (https://www.delphipraxis.net/84737-arrayelement-anklicken.html)

Sotov 20. Jan 2007 22:25


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:
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 habe die Bilder in die Form geladen um "picture.loadfromfile();" nicht zu benutzen, damit ich am Ende nur eine Exedatei habe.

Ich möchte das Spiel Memory machen.

Vielen Dank im Voraus!

MrKnogge 20. Jan 2007 22:33

Re: Arrayelement anklicken
 
Du musst dem OnClieck-Event auch eine Prozedur zuweisen :wink:
Oder was genau funktioniert nicht ?

Gruß

Sotov 20. Jan 2007 22:45

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!

Christian Seehase 20. Jan 2007 22:50

Re: Arrayelement anklicken
 
Sotov,

Zitat:

Zitat von Sotov
Ja, aber ich kann ja mit einem Array keine OnClick procedur machen!

Wieso nicht?

Delphi-Quellcode:
TForm1 = class(TForm)
//...
  procedure Image1Click(Sender: TObject);
//...


procedure TForm1.Image1Click(Sender: TObject);
begin
//...
end;

//...

Karte[i].OnClick := Image1Click;

MrKnogge 20. Jan 2007 22:54

Re: Arrayelement anklicken
 
Deine OnClick Prozedur müsste dann ungefair so aussehen:

Delphi-Quellcode:
procedure TForm1.OnMyClick(Sender: TObject);
begin
  (Sender as TImage).picture := Image2.picture;
end;
Gruß

Sotov 20. Jan 2007 22:58

Re: Arrayelement anklicken
 
Hmm, so hatte ich es mir am Anfang auch gedacht, aber irgendwie klappt es nicht!

Delphi-Quellcode:
procedure TForm1.Image1Click(Sender: TObject);
begin
Karte[1].OnClick := Image1Click;
showmessage('hi');
end;
Es passiert absolut nichts, wenn ich das objekt karte[1] anklicke!

Zitat:

Deine OnClick Prozedur müsste dann ungefair so aussehen:
Sorry, ich bin ein Anfänger und den Code habe ich leider nicht verstanden!

MrKnogge 20. Jan 2007 23:01

Re: Arrayelement anklicken
 
Dieser Teil muss in deine Schleife, dass jedes Image, diese Prozedur zugewiesen bekommt.
Delphi-Quellcode:
Karte[1].OnClick := Image1Click;
[Add]
Zitat:

Zitat von Sotov
Sorry, ich bin ein Anfänger und den Code habe ich leider nicht verstanden!

Diesen Code
Delphi-Quellcode:
(Sender as TImage).picture := Image2.picture;
schreibst du in dein Image1Click.
Zur Erklärung:
Durch Sender "weis" die Prozedur, welches TImage angeklickt wurde und in das läd er dann das Bild aus Picture2.

Gruß

Sotov 20. Jan 2007 23:04

Re: Arrayelement anklicken
 
Super! Klappt alles!

Vielen dank!

himitsu 20. Jan 2007 23:16

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:
for j := 1 to 4 do begin
for i := 1 to 5 do begin
  Karte[(j - 1) * 5 + i]
oder 0-basierend
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]

Sotov 20. Jan 2007 23:20

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!

MrKnogge 20. Jan 2007 23:23

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ß

Sotov 20. Jan 2007 23:27

Re: Arrayelement anklicken
 
Uuups! das ist mir ja noch garnicht aufgefallen :oops:
Dankeschön!

MrKnogge 20. Jan 2007 23:31

Re: Arrayelement anklicken
 
Und vergiss bitte nicht die Images, am Ende (am besten im OnDestroy von Form1), wieder freizugeben.
Delphi-Quellcode:
for j := 0 to 3 do
  for i := 0 to 4 do
    Karte[j * 5 + i].free;
Gruß

Sotov 20. Jan 2007 23:38

Re: Arrayelement anklicken
 
Ja, muss ich, sonst kann ich keine levels machen!

Sotov 21. Jan 2007 14:54

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:
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;
klick ist globaldeklariert und von typ integer

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!

MrKnogge 21. Jan 2007 14:57

Re: Arrayelement anklicken
 
Na mit (Sender as TImage) so wie du es bereits machst.

Gruß

himitsu 21. Jan 2007 15:14

Re: Arrayelement anklicken
 
entweder du gehst das Array durch und vergleichst
Delphi-Quellcode:
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 ..
oder du speicherst den Index im Bild:
Code:
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;
Abrufen dann z.B. so
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;

Sotov 21. Jan 2007 15:50

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?

inherited 21. Jan 2007 16:00

Re: Arrayelement anklicken
 
Mit FindComponent. Das ist aber unperfomant. Was genau willst du denn machen?

MrKnogge 21. Jan 2007 16:09

Re: Arrayelement anklicken
 
Zitat:

Zitat von Sotov
Noch eine kleine Frage:
Karte[k].Picture := Image1.picture;
wie kann man diese 1 zu einer variable machen?

Die beste Antwort steht eine Zeile drüber, erstelle Image1 und Image2 genauso wie du Karte erstellt hast.
Die Bilder kannst du dann zur Laufzeit mit Picture.LoadFromFile laden.

Gruß

Sotov 21. Jan 2007 16:12

Re: Arrayelement anklicken
 
Zitat:

Zitat von MrKnogge
Die Bilder kannst du dann zur Laufzeit mit Picture.LoadFromFile laden.

Gruß

Genau das will ich ja vermeiden! Ich möchte am ende nur eine einzige exedatei haben, ohne den ordner mit den bildern...

MrKnogge 21. Jan 2007 16:17

Re: Arrayelement anklicken
 
Probier mal folgendes:

Delphi-Quellcode:
var
  img[1..2]: array of TImage;

...

img[1] := Image1;
img[2] := Image2;
Nun solltest du mit img[1] auf das Image1 zugeifen können.

Andernfalls könntest du auch deine Bilder (Bitmaps ?) als Ressource einbinden und zur Laufzeit aus dieser laden.

Gruß

Sotov 21. Jan 2007 18:18

Re: Arrayelement anklicken
 
Zitat:

Zitat von MrKnogge

Andernfalls könntest du auch deine Bilder (Bitmaps ?) als Ressource einbinden und zur Laufzeit aus dieser laden.

Gruß

So und das ist das Interesanteste!
Wie macht man das?


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