![]() |
Punkte auf Bild
Hallo, ich bin neu hier :)
Und zwar habe ich folgendes Problem: Ich möchte (bzw. ich tue es) ein Bild anzeigen (dazu verwende ich die Picture-Komponente). Jetzt soll man auf eine bestimme Stelle dieses Bildes (es ist eine Karte) klicken können, sodass dort ein z.B. roter Punkt erscheint. Dessen Koordinaten sollen dann in einer Textdatei gespeichert werden und er muss anklickbar sein. Das mit dem Anklicken könnte ich eventuell selbst hinkriegen, mein Problem ist viel mehr wie ich sozusagen dynamisch einen roten Punkt auf das jeweilige Bild bekomme. Dabei ist wichtig, dass das Bild ansich nicht geändert wird, sondern beim Start des Programms die Koordinaten von n vielen Punkten ausgelesen werden und dann eben auch n viele Punkte an den jeweiligen Stellen erscheinen (das Auslesen der Koordinaten sollte auch kein Problem sein). Prinzipiell brauche ich also eine Möglichkeit quasi dynamisch beliebig viele Punkte auf diese Picture-Komponente zu legen. Kann sein, dass die Frage ziemlich einfach zu beantworten ist, aber ich habe Delphi noch nicht so lang und kenne mich auch (NOCH) nicht sooo sehr damit aus. Kann man Shape-Komponenten dynamisch erstellen? Dann wäre mein Problem glaub ich gelöst... |
Re: Punkte auf Bild
Delphi-Quellcode:
Edit: Herzlich Willkommen im Forum! :thumb: :hi:
MyShape: TShape;
... MyShape:=TShape.Create(self); with MyShape do begin Parent:=Form1; //Ich kenne keine Picture Kompo, nur die Image Left:=...; Top:=...; Width:=...; Height:=...; Show; ... end; |
Re: Punkte auf Bild
Kuck dir mal das Ereignis OnMouseDown an.
|
Re: Punkte auf Bild
Nimm eine Image-Komponente (TImage) in dein Form.
Lad' über OI/Eigenschaften/Picture ein Bild rein. Und weis OI/Ereignisse/OnMouseDown folgende Procedure zu.
Delphi-Quellcode:
hoffe, jetzt stimmts...
Type TForm1 = Class(TForm)
Image1: TImage; Procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Private Procedure ShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); End; ... Procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Var f: TextFile; MyShape: TShape; Begin MyShape := TShape.Create(self); With MyShape do Begin Parent := Image1; Left := X; Top := Y; Width := 1; Height := 1; Pen.Color := clRed; OnMouseDown := ShapeMouseDown; End; AssignFile(f, 'Dateiname.txt'); If FileExists('Dateiname.txt') Then Append(f) Else Reset(f); Writeln(f, IntToStr(X) + ':' + IntToStr(Y)); CloseFile(f); End; Procedure TForm1.ShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Begin ... End; |
Re: Punkte auf Bild
Oha das ging ja schnell...
Vielen Dank, im Moment kann ich das leider nicht ausprobieren, aber es scheint plausibel :) |
Re: Punkte auf Bild
Liste der Anhänge anzeigen (Anzahl: 1)
Probleme mit Parent und Dateizugriff behoben:
|
Re: Punkte auf Bild
Sender = Image1 in ShapeMouseDown war natürlich falsch gewesen.
Hab's im oberen DL schon geändert. "Sender = Image1" => "TShape(Sender).Parent = Form1" *** Was deine anderen Fragen angeht: -die Position eines Objekts ist relativ zu der des Parent -TImage kann nicht als Parent genommen werden, um die Position relativ zum Image zu setzen Als Parent (übergeordnetes Objekt) können nur Steuerelemente fungieren, die ein Nachkomme von TWinControl sind. Wie z.B. TForm, TPanel. (hatte ja auch erst den Fehler gemacht) -Offset ist hier die Differenz zwischen zwei Punkten. z.B. ist Pixel [10, 20] von Image1 an der selben Stelle wie Pixel [26, 36] von Form1 (Das ist auch einer der Gründe, warum es 2 Images sind) -Objektumwandlung: !Sender(TObject) und Shape(TShape) sind inkompatiebel. Beim Aufruf der EreignisProzedur wird das Objekt (die Komponente), über welches diese Procedure aufgerufen wurde, mit übergeben. Und damit man mit den Eigenschaften des Objektes arbeiten kann muss es noch umgewandelt werden. Da ShapeMouseDown von mehrenen Shapes aufgerufen werden kann, ist es so möglich an dessen Daten zu gelangen. Image1MouseDown wird immer nur von Image1 aufgerufen, daher konnte z.B. Image1.Top verwendet werden, an statt TImage(Sender).Top. -mit "TShape(Sender).Parent = Form1" wird abgefragt ob das gerade angeklickte Shape zu Form1 gehört oder nicht. :?: Fragen schadet ja nicht. Nur wer nicht fragt, schadet sich selbst. :wall: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 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