![]() |
Array im Prozedurnamen ansprechen
halli hallo,
ich hab vor nich allzu langer zeit mit delphi angefangen. trotz vorkenntnisse in andern sprachen hab ich auch auf delphitreff die anfangstutorials gemacht. ich steh nun aber einem problem gegnüber, dem ich auch nach 2 tägiger suche in google und stöbern in der hilfe nicht abhelfen konnte. zur aufklärung: ich möchte ein kartenspiel programmieren. dazu habe ich unter anderem ein array von Timage erzeugt. je nach bedarf wird während der laufzeit das array belegt und das bild angezeigt. problem ist nun folgendes. wenn ich über delphi (diese schaltflächen oben) ein image einfügen lasse kann ich ja die prozedur TForm3.Image1MouseDown benutzen. da es aber nötig ist (aufgrund von redundanz, dateninkonsistenz, übersichtlichkeit und weniger programmierarbeiten) das array zu benutzen stell ich mir die frage: wie spreche ich das array an? ich habe einige varianten ausprobiert, wie zbsp TForm1.ArrayBild[k]MouseDown oder TForm1.ArrayBild[k].MouseDown ... usw. bitte um hilfe mfg Zenny |
Re: Array im Prozedurnamen ansprechen
Um ehrlich zu sein habe ich (und vermutlich einige andere) dein Problem noch nicht verstanden. Was genau hast du vor? Warum hast du Procedure-namen in ein array gepackt und wie liegen diese in dem Array vor? als Strings? Am besten schilderst du was dein Ziel ist, ich denke dann können wir dir einige Vorschläge machen wie man da hinn kommt.
|
Re: Array im Prozedurnamen ansprechen
Guten Abend,
lade doch nur die Bilder (jpg, bmp) in das Array und lade es bei Bedarf in ein TImage (das kannst Du dann zur Designzeit auf das Formular packen). Alternativ zu dem Array mit Bilder kannst Du natürlich auch eine ImageList benutzen. Aber auch die Bilder aus einer ImageList müssen in ein TImage geladen werden. Grüße Klaus |
Re: Array im Prozedurnamen ansprechen
Zitat:
Das geht iirc so:
Delphi-Quellcode:
Imagearr[4].OnClick := ImageOnClick;
procedure TForm1.ImageOnClick(Sender: Object) begin // ... end; |
Re: Array im Prozedurnamen ansprechen
Eindeutig zu viel mit .NET gearbeitet, Julius. :mrgreen: In Delphi heißt das noch TObject.
|
Re: Array im Prozedurnamen ansprechen
Zitat:
Wichtig ist, dass die Eigenschaft du du suchst "OnMouseDown" heißt. (In der Regel sind solche "Ereignisse" immer mit einem "On" versehen) MfG xZise |
Re: Array im Prozedurnamen ansprechen
Zitat:
Zitat:
Wichtig ist, dass die Methode die man zuweist auch genau die richtigen Parameter hat. Und die Property, der man das dann zuweisen muss, fängt im Normfall mit On... an - also OnMouseMove oder OnKeyPress. |
Re: Array im Prozedurnamen ansprechen
ersteinmal find ich es super wie schnell ihr geantwortet habt und einem hier versucht wird zu helfen. habs in andern beiträgen hier schon oft gelesen, aber in so kurzer zeit so viel. :)
ich weiß leider nicht wirklich wo ich die zeile "Imagearr[4].OnClick := ImageOnClick;" hinsetzten soll. hab zwar n bisl versucht die ma an alle erdenklichen stellen im cod ezu setzten aber nix geht. ich muss ja irgendwas unversucht gelassen haben dann für die, die mein problem noch nicht ganz verstehen werd ich jetzt mal den code einfügen:
Delphi-Quellcode:
nochmal zur erklärung:
unit FensterDeckbuilder;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, IniFiles, jpeg; type TForm3 = class(TForm) ButtonBeenden: TButton; Label1: TLabel; Image1: TImage; Button1: TButton; procedure ButtonBeendenClick(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormActivate(Sender: TObject); procedure DefineKarte; procedure NeueKarte; procedure MouseOverKarte; procedure ImageOnClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form3: TForm3; ini: TIniFile; JPEG: TJpegImage; BMP:TBitmap; MouseStartPos : TPoint; Down : Boolean = False; MousOverKarte: Boolean = False; xdifferenz, ydifferenz: integer; xpos: integer = 200; ypos: integer = 100; breite: integer = 100; k: integer = 0; maxKarten: integer = 120; ArrayExist: array of Boolean; ArrayBild: array of TImage; ArrayBildx: array of integer; ArrayBildy: array of integer; implementation {$R *.dfm} procedure TForm3.ImageOnClick(Sender: TObject); begin Label1.Caption := InttoStr(k); end; { ArrayBild[1].OnClick := ImageOnClick; } procedure TForm3.DefineKarte; begin k := 0; while k<maxKarten do begin ArrayExist[k] := False; k := k + 1; end; end; procedure TForm3.NeueKarte; begin k:=0; repeat k:=k+1; until ArrayExist[k]=False; ArrayExist[k] := True; ArrayBild[k] := timage.Create(Form3); ArrayBild[k].parent := Form3; ArrayBild[k].Stretch := True; ArrayBild[k].Transparent := True; ArrayBild[k].Picture.LoadFromFile(ExtractFilePath(ParamStr(0))+'Bilder\Jareth, der Löwentitan.jpg'); ArrayBild[k].Left := xpos+k*10; ArrayBild[k].Top := ypos+k*10; ArrayBild[k].Width := breite; ArrayBild[k].Height := Round(breite*1.39); ArrayBild[k].Visible := True; end; procedure TForm3.MouseOverKarte; begin k:=0; MousOverKarte:=False; while ((MousOverKarte=False) and (k<maxkarten)) do begin if (ArrayBild[k].Left<MouseStartPos.X) and (MouseStartPos.X<(ArrayBild[k].Left+breite)) then begin if (ArrayBild[k].Top<MouseStartPos.Y) and (MouseStartPos.Y<(ArrayBild[k].Top+Round(breite*1.39))) then begin xdifferenz:=MouseStartPos.X-ArrayBild[k].Left; ydifferenz:=MouseStartPos.Y-ArrayBild[k].Top; Down := True; MousOverKarte := True; end; end; if MousOverKarte=False then k := k + 1; end; end; procedure TForm3.FormActivate(Sender: TObject); begin ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'einstellungen.ini'); try JPEG:=TJpegImage.Create; // JPEG erzeugen BMP:=TBitmap.Create; // BMP erzeugen JPEG.LoadFromFile(ExtractFilePath(ParamStr(0))+'Bilder\'+ini.ReadString('Profil','Thema','Standard')+'\main.jpg'); BMP.Assign(JPEG); Image1.Picture.Bitmap:=BMP; Image1.SendToBack; finally ini.free; end; SetLength(ArrayExist, maxKarten); SetLength(ArrayBild, maxKarten); SetLength(ArrayBildx, maxKarten); SetLength(ArrayBildy, maxKarten); DefineKarte; end; procedure TForm3.Button1Click(Sender: TObject); begin NeueKarte; end; procedure TForm3.ButtonBeendenClick(Sender: TObject); begin Close; end; end. momentan ist es nur so, dass wenn man auf den button klickt die images erzeugt werden und auf der fläche angezeigt werden. der zusatz bei top und left mit k*10 pixel sorgt dafür, dass optisch ein stapel auf der grafischen oberfläche entsteht. geplant war nun, dass wenn ich auf eine karte k (das is meine variable für die karten wie ihr seht) klicke, die prozedur MousOverKarte guckt über welcher karte ich gerade mit der maus bin. k ist ja global und kann dann direkt weiterverwendet werden für das event onmousemove, wo die karte halt mit der maus mitgezogen wird. ich muss dazusagen, dass das hin- und herziehen schon funktioniert hat, aber mit stretchdraw. da muss man aber mit fillrect oder so die schon gezeichneten karten wieder übermalen, was eine graue spur auf der grafischen oberfläche zur folge hat. möglich, dass euch da auch lösungen zu einfallen, aber ich bevorzuge die variante die ich momentan versuche umzusetzten. die events sind mir hierbei sehr wichtig, da ja viel zu programmieren ist in dem event onclik usw. nicht nur für das hin- und herziehen. mfg Zenny |
Re: Array im Prozedurnamen ansprechen
.. Du hast zwar nicht danach gefragt, ich habe aber trotzdem
etwas korregiert.
Delphi-Quellcode:
.. aber warum im onActivate Event und nicht im OnCreate?
procedure TForm3.FormActivate(Sender: TObject);
begin ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'einstellungen.ini'); try JPEG:=TJpegImage.Create; // JPEG erzeugen //BMP:=TBitmap.Create; // BMP erzeugen JPEG.LoadFromFile(ExtractFilePath(ParamStr(0))+'Bilder\'+ini.ReadString('Profil','Thema','Standard')+'\main.jpg'); //BMP.Assign(JPEG); Image1.Picture.Bitmap.assign(JPEG); // sollte auch so funktionieren. Image1.SendToBack; finally ini.free; JPEG.free; // freigeben nicht vergessen end; SetLength(ArrayExist, maxKarten); SetLength(ArrayBild, maxKarten); SetLength(ArrayBildx, maxKarten); SetLength(ArrayBildy, maxKarten); DefineKarte; end; Aus der Hilfe: Zitat:
Klaus |
Re: Array im Prozedurnamen ansprechen
Naja diese Zuweisung sollte man machen, sobald das Objekt da ist. Zum Beispiel in Zeile 84 (da ist so schön Platz :P ). Also auf jedenfall bevor das Ereignis gebraucht wird und nachdem das Bild existiert. Und du darfst natürlich NICHT direkt Imagearr[4].OnClick := ImageOnClick; sondern musst natürlich das entsprechende Image dann nehmen, zu dem du diese Eigenschaft zuweisen willst.
Wenn es dann nicht funktioniert, dann poste doch bitte die Fehlermeldung. Achso ein Problem könnte auch sein, dass Activated (wie bereits beschrieben), nicht gerade passend ist :) Nimm doch OnCreate, weil Activated wird mehrmals aufgerufen. Zudem musst du natürlich die erstellten Karten auch wieder freigeben! MfG xZise |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:47 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-2025 by Thomas Breitkreuz