![]() |
Image
Hi sorry falls ich euch nerve aber ich bin ein Programmieranfänger und hätte da ne wohl ganz einfache Frage für euch:
hab bisher so nen Funktionsplotter programmiert. der zeichnet nach angabe von nen paar koordinaten ne kurve auf ein image. jetzt würde ich gerne dazu programmieren, dass ich bsp. wie bei paint ein dreiecksymbol in der funktionsleiste wähle, dann auf das image klicke und der das als eckpunkt festsetzt und durch nochmaliges und nochmaliges klicken die anderen eckpunkte festgelegt wird. jetzt ist meine frage wie ich mir die koordinaten von dem punkt auf der paintbox wo ich hingeklickt habe ausgeben lassen kann. freu mich schon auf eure hilfe stefan |
Re: Image
OnMouseMove sollte dassein, was Du suchst
|
Re: Image
Hi.
Zitat:
|
Re: Image
Zitat:
|
Re: Image
Wie wärs mit OnMouseDown bzw OnMouseUp? :lol: Damit ham wir dann ja bald fast alles durch.
|
Re: Image
Hi.
Zitat:
Delphi-Quellcode:
procedure TForm1.Image1Click(Sender: TObject);
begin ShowMessage(IntToStr(Mouse.CursorPos.X)); ShowMessage(IntToStr(Mouse.CursorPos.Y)); end; |
Re: Image
hab da mal so nen konstrukt gebastelt wie ich gedacht hab das es funktioniert:
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var eckpunkte,startx,starty:integer; begin eckpunkte:=0; if Shift=ssleft then begin case eckpunkte of 0:begin image1.canvas.moveto(x,y); startx:=x; starty:=starty; end; 4:begin image1.canvas.lineto(x,y); image1.canvas.lineto(startx,starty); end; else image1.canvas.lineto(x,y); end; eckpunkte:=eckpunkte+1; end; end; tuts aber leider nicht :-(. der meint inkompatible typen bei shift=ssleft. warum das denn in der hilfe stand das doch so. gruß stefan |
Re: Image
Hi.
Zitat:
Delphi-Quellcode:
if ssLeft in ShiftState then {...}
|
Re: Image
wenn ich das mit dem cursor machen will. wie bekomm ich denn dann die koordinaten von dem cursor auf dem image und nicht auf dem form?
|
Re: Image
Naja, du hast die Koordinaten der Maus auf der Form, du hast die Left- und Top-Koordinaten des Images auf dem Form. Was lässt sich damit wohl machen? :gruebel: :zwinker:
|
Re: Image
Oder du nimmst onmouseup von dem Image...
|
Re: Image
tja das is mir auch klar. ganz doof bin ich ja auch nicht. aber ich wollte halt wissen obs nicht nen befehl gibt der mir die position von der mouse auf dem image gibt. waren übrigens die koordinaten von der mouse auf dem desktop und nicht auf dem form.
|
Re: Image
Ähm, also die Koordinaten die du über Mouse.CursorPos bekommst sind natürlich auf den Bildschirm bezogen. Die x und y, die aber als Parameter an die OnMouseMove, OnMouseUp, OnMouseDown, etc übergeben werden, geben dir direkt die Koordinaten auf dem Form an.
Das gilt aber auch nur für die Events des Forms. Wie aber atreju2oo0 bereits festgestellt hat, besitzt auch das Image an sich diese Events. |
Re: Image
In deiner Beispielprozedur ist eckpunkte lokal definiert, d.h. die variable wird immer wieder gelöscht.
Du musst die Variable entsprechend im public/privat Abschnitt deklarieren (oder halt ganz global - das mögen hier einige aber nicht :) ) Edit: Mal ein schneller Test. Ok, nun gehts (Nachteil ist noch, dass nach dem Zeichnen eines Dreiecks ein Mausklick "leer" ist und dann erst 3 neue folgen. Und dass man das Fenster nicht minimieren sollte ;)) Aber nur zu Testzwecken
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) PaintBox1: TPaintBox; procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); private // Variable für Ecken ecke: integer; // Variable für Array d. Punkte points: array[0..2] of TPoint; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin points[ecke-1].X := X; points[ecke-1].Y := Y; Inc(ecke); if ecke = 4 then begin with Form1.PaintBox1 do begin Canvas.MoveTo(points[0].X, points[0].Y); Canvas.LineTo(points[1].X, points[1].Y); Canvas.MoveTo(points[1].X, points[1].Y); Canvas.LineTo(points[2].X, points[2].Y); Canvas.MoveTo(points[2].X, points[2].Y); Canvas.LineTo(points[0].X, points[0].Y); end; ecke := 1; end; end; procedure TForm1.FormCreate(Sender: TObject); begin ecke := 1; end; end. |
Re: Image
Jede Komponente hat
ClientToScreen und ScreenToClient zum Umrechnen! |
Re: Image
Nur zur Vollständigkeit:
Die Daten von Mouse.CursorPos (also global) kannst du mittels TControl.ScreenToClient in lokale Koordinaten umrechnen. [edit] @Kroko1999: Jedes Control :wink: [/edit] |
Re: Image
vielen dank schonmal für den quelltext. wie würde ich das denn jetzt beispielsweise machen wenn ich sowas wie bei paint haben wollte, dass ich bspw. auf einen punkt eines images drücke, die mouse gedrückt lasse irgendwohin den cursor bewege und der mir immer die gerade von dem drückpunkt bis zu dem aktuellen cursorpunkt macht. also praktisch wie die strichversion bei paint. hab da schon dran rumprobiert ohne hilfe. aber da ich nicht so wirklich viel kann kam da auch nicht wirklich viel bei rum :-(. ich hoffe da mal stark auf eure hilfe. schonmal danke dafür
gruß stefan |
Re: Image
diese methode heisst "gummiband" und ist in der delphi7-pe OH ausführlich beschrieben.
genial oder? ob es beim d2005 auch noch drin ist, weiss ich nicht. EDIT: ebenso. einfach Suche->Gummiband EDIT: ich will ja nicht so sein: Die Grundmethode: 1.das aktuelle Bild in einen Puffer speichern 2.im onmousedown die koords speichern 3.im onmousemove zuerst das bild zeichnen und dann eine linie von den gespeicherten koords zu der aktuellen ziehen 4.im onmouseup die linie auch in den puffer zu speichern. 5.fertig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:51 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