Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Prism Image (https://www.delphipraxis.net/45045-image.html)

Stefan_w 28. Apr 2005 15:36


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

Kroko1999 28. Apr 2005 15:38

Re: Image
 
OnMouseMove sollte dassein, was Du suchst

Waldteufel 28. Apr 2005 15:39

Re: Image
 
Hi.

Zitat:

Zitat von Kroko1999
OnMouseMove sollte dassein, was Du suchst

Nicht eher OnClick? :gruebel:

Kroko1999 28. Apr 2005 15:40

Re: Image
 
Zitat:

Zitat von Waldteufel
Hi.

Zitat:

Zitat von Kroko1999
OnMouseMove sollte dassein, was Du suchst

Nicht eher OnClick? :gruebel:

Dann fehlen ihm aber die X- und Y-Koodinate!

leddl 28. Apr 2005 15:52

Re: Image
 
Wie wärs mit OnMouseDown bzw OnMouseUp? :lol: Damit ham wir dann ja bald fast alles durch.

Waldteufel 28. Apr 2005 15:59

Re: Image
 
Hi.

Zitat:

Zitat von Kroko1999
Zitat:

Zitat von Waldteufel
Hi.

Zitat:

Zitat von Kroko1999
OnMouseMove sollte dassein, was Du suchst

Nicht eher OnClick? :gruebel:

Dann fehlen ihm aber die X- und Y-Koodinate!

Sicher? ;-)

Delphi-Quellcode:
procedure TForm1.Image1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Mouse.CursorPos.X));
  ShowMessage(IntToStr(Mouse.CursorPos.Y));
end;

Stefan_w 28. Apr 2005 16:00

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

Waldteufel 28. Apr 2005 16:04

Re: Image
 
Hi.

Zitat:

Zitat von Stefan_w
tuts aber leider nicht :-(. der meint inkompatible typen bei shift=ssleft. warum das denn in der hilfe stand das doch so.

TShiftState ist ein set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble)... Du musst also prüfen:

Delphi-Quellcode:
if ssLeft in ShiftState then {...}

Stefan_w 28. Apr 2005 16:09

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?

leddl 28. Apr 2005 16:20

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:

atreju2oo0 28. Apr 2005 16:48

Re: Image
 
Oder du nimmst onmouseup von dem Image...

Stefan_w 28. Apr 2005 16:50

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.

leddl 28. Apr 2005 18:24

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.

Airblader 28. Apr 2005 18:38

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.

Kroko1999 28. Apr 2005 18:41

Re: Image
 
Jede Komponente hat
ClientToScreen
und
ScreenToClient zum Umrechnen!

Khabarakh 28. Apr 2005 18:45

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]

Stefan_w 1. Mai 2005 20:36

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

DGL-luke 1. Mai 2005 20:44

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