![]() |
Re: Array im Prozedurnamen ansprechen
dankeschön, das event wird nun ausgelöst. hier nochma der code:
Delphi-Quellcode:
hab das auch nun umgetauscht, wo das bild geladen wird. nich mehr bei active sondern bei create.
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 DefineKarte; procedure NeueKarte; procedure Test(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(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.Test(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin k:=0; MousOverKarte:=False; { while ((MousOverKarte=False) and (k<maxkarten)) do begin if (ArrayBild[k].Left<X) and (X<(ArrayBild[k].Left+breite)) then begin if (ArrayBild[k].Top<Y) and (Y<(ArrayBild[k].Top+Round(breite*1.39))) then begin xdifferenz:=X-ArrayBild[k].Left; ydifferenz:=Y-ArrayBild[k].Top; Down := True; MousOverKarte := True; end; end; if MousOverKarte=False then k := k + 1; end; } Label1.Caption := InttoStr(k)+' '+InttoStr(ArrayBild[k].Left); end; 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].OnMouseDown := Test; end; procedure TForm3.FormCreate(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; JPEG.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. dort wo das event ausgelöst wird, was bei mir "Test" ist, seht ihr kommentierten code. das liegt daran, dass er da rummeckert. es liegt wohl daran wie ich ArrayBild[k] anspreche, wo ich mich aber frage ?warum?, weil das bei stretchdraw genauso auch war und funktioniert hat. ziel des ganzen ist es, dass ich mit onmousedown, die karte ermittel wo die maus drüber is. dann wird mit onmousemove die karte mitgezogen (normalerweise wird dann halt immer ArrayBild[k].Left und .Top mit anepasst) und mit onmouseup wird der boolean-wert Down wieder auf false gesetzt, damit er aufhört die karte mitzuziehen. aber ich kann ArrayBild[k] nich mehr ansprechen ?? |
Re: Array im Prozedurnamen ansprechen
Du prüfst vor der Zuweisung auf Label1.Caption nicht, ob du überhaupt eine Karte gefunden hast. Wenn das nähmlich innerhalb deiner Schleife nicht der Fall ist, hat k den Wert maxKarten und zeigt damit über das Array hinaus. Das gibt im besten Fall eine Indexverletzung, im schlimmsten Fall eine Zugriffsverletzung.
Also weise Label1.Caption abhängig von MousOverKarte entweder den Wert wie bisher zu oder eine leere Zeichenkette. Abgesehen davon ist der Vergleich von X und Y falsch und überflüssig. Die Methode ist dem Ereignis OnMouseDown der Karte zugewiesen. Demzufolge ist Sender das Image, auf das geklickt wurde. X und Y sind Koordinaten innerhalb der Karte mit dem Ursprung der linken oberen Ecke der Karte. Left und Top der Karte haben aber als Ursprung die linke obere Ecke des Formulars(Clientbereich). Beide Werte können deshalb nicht direkt miteinander verglichen werden. Der Vergleich müsste etwa so lauten:
Delphi-Quellcode:
In der Methode NeueKarte wird noch nicht der Fall berücksichtigt, daß bereits 120 Karten erzeugt wurden.
if ArrayBild[k] = Sender then
In diesem Fall gäbe es dort auch einen Fehler wie oben. |
Re: Array im Prozedurnamen ansprechen
danke leute thx :)
das einzige was nun noch genial wäre festzulegen wie weit "oben" ein bild angezeigt wird. in html-programmierung nennt sich das z-index. wenn ich sagen wir 3 bilder hintereinander erstellen lasse durch den button, bildet sich ja ein stapel. schieb ich nun die karte 2 aus der mitte des stapels weiter dem unteren bildrand entgegen, aber so dass sie sich immernoch mit karte 3 überlappt, dann ist es so, dass die karte 2 immernoch unter der karte 3 angezeigt wird. die letzte karte die man also erstellt hat wird immer ÜBER allen anderen karten angezeigt. nun würd ich gern irgendwie einstellen, dass eine zuvor erstellte karte 2 ganz oben angezeigt wird, wenn man sie beispielsweise anklickt, oder bewegt. wisst ihr da auch zufällig was? |
Re: Array im Prozedurnamen ansprechen
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 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