![]() |
PaintBox in Image
Hallo Zusammen,
auch wenn das Thema an verschiedenen Stellen behandelt wurde, habe ich es dennoch nicht geschafft, mein Problem damit zu lösen. Das Problem ist einfach: Ich muss eine Unterschrift in eine Datenbank bekommen. Mein Lösungsansatz: Ich habe eine PaintBox in welche die Unterschrift geleitet wird. Im MouseUp Ereignis wollte ich dann die "gemalte" Unterschrift an ein DBImage übergeben und von dort aus in ein Blob-Feld in die MySQL-Datenbank. Ich scheitere daran, dass ich die Unterschrift nicht aus der PaintBox [PB_Signature] in das DBImage [DBImage_Signature] bekomme. Mit dem Code Male ich:
Delphi-Quellcode:
Und mit dieser Procedure möchte ich den Inhalt der PaintBox in das DBImage bringen.
procedure TForm1.PB_SignatureMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin SollGezeichnetWerden:= true; ErsterZug:= true; end; procedure TForm1.PB_SignatureMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if (ErsterZug) then begin ErsterZug := False; PB_Signature.Canvas.MoveTo(X, Y); end; if (SollGezeichnetWerden) then PB_Signature.Canvas.LineTo(X, Y); end; procedure TForm1.PB_SignatureMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin SollGezeichnetWerden:= false; end;
Delphi-Quellcode:
Das DBImage wird zwar auf die gleiche Größe wie die PaintBox gebracht, aber es wird kein Bild übertragen.
procedure TForm1.Button1Click(Sender: TObject);
var r: TRect; begin DBImage_Signature.Width:=PB_Signature.Width; DBImage_Signature.Height:=PB_Signature.Height; r:=rect(0,0,DBImage_Signature.Width,DBImage_Signature.Height); DBImage_Signature.Picture.Bitmap.Canvas.CopyRect(r,PB_Signature.Canvas,r); end; Kann mir jemand weiterhelfen? Vielen Dank Patrick |
AW: PaintBox in Image
Eine PaintBox speichert keine Zeichenoperationen. Insbesondere sollte das Zeichnen einer PaintBox ausschließlich im OnPaint erfolgen.
Zeichne stattdessen in eine Bitmap und gib die im OnPaint der PaintBox aus. Das Aktualisieren der Darstellung löst du mit einem PaintBox.Invalidate aus. |
AW: PaintBox in Image
Mmmh, das verstehe ich leider nicht...
Ich habe jetzt ein globales Image: TBitMap erstellt. In der PaintBox spechere ich die Stift-Aktion aus dem MouseMove-Event in dem BitMap:
Delphi-Quellcode:
Aber wie zeichne ich dann das Ergebnis in die PaintBox und wie soll ich es daraus in das DBImage bekommen?
procedure TForm1.PB_SignatureMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); begin if (ErsterZug) then begin ErsterZug := False; Image.Canvas.MoveTo(X, Y); end; if (SollGezeichnetWerden) then Image.Canvas.LineTo(X, Y); end;
Delphi-Quellcode:
Wenn ich das so mache, bekomme ich nichts mehr in der PaintBox zu sehen und bekomme auch nichts in das DBImage übertragen...
procedure TForm1.PB_SignaturePaint(Sender: TObject);
var r: TRect; begin PB_Signature.Canvas.Pen.Color:=clBlack; PB_Signature.Canvas.Pen.Width:=2; r:=rect(0,0,Image.Width,Image.Height); PB_Signature.Canvas.CopyRect(r,Image.Canvas,r); PB_Signature.Invalidate; end; Vielen Dank Patrick |
AW: PaintBox in Image
Das Invalidate gehört ins PB_SignatureMouseMove.
Und das Bild kopierst du anschließend von der Bitmap ins DbImage. |
AW: PaintBox in Image
Delphi-Quellcode:
gehört nichts ins OnPaint.
PB_Signature.Invalidate;
Damit wird ein Neuzeichnen ausgelöst. Das rufst du von Extern auf (z.B. in deinem PB_SignatureMouseMove), wenn sich die Daten / der Inhalt geändert hat, worauf OnPaint ausgeführt wird. Wenn du es im OnPaint machst, dann hast du eine Endlosschleife. Oder du malst doppelt, also in das Bitmap und in die PaintBox. Muß die PaintBox neu gezeichnet werden, dann wird im OnPaint nur das Bitmap neu ausgegeben. Eine PaintBox ist per se nur WriteOnly. Auch wenn "manchmal" der Inhalt ausgelesen werden kann, so ist er nicht fest. Wird durch irgendwas ein Neuzeichnen ausgelöst, dann ist der Inhalt weg. (z.B. weil ein Fenster kurz vor der PaintBox war) Alternativ kannst du auch ein TImage mit einem Bitmap drin verwenden. |
AW: PaintBox in Image
Hallo Zusammen,
ich bin jetzt wieder soweit, dass ich in die PaintBox malen kann, allderings jetzt unter Verwendung eines BitMap.
Delphi-Quellcode:
Jetzt möchte ich das in dem TBitMap [Image] erstellt Bild in das DBImage [DBImage_Signature]bekommen. Das klappt leider noch nicht...
procedure TForm1.PB_SignatureMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); begin if (ErsterZug) then begin ErsterZug := False; Image.Canvas.MoveTo(X, Y); end; if (SollGezeichnetWerden) then Image.Canvas.LineTo(X, Y); PB_Signature.Invalidate; end; procedure TForm1.PB_SignaturePaint(Sender: TObject); var r: TRect; begin PB_Signature.Canvas.Pen.Color:=clBlack; PB_Signature.Canvas.Pen.Width:=2; r:=rect(0,0,Image.Width,Image.Height); PB_Signature.Canvas.CopyRect(r,Image.Canvas,r); end;
Delphi-Quellcode:
Vielen Dank für die Unterstützung
procedure TForm1.Button1Click(Sender: TObject);
var r: TRect; begin DBImage_Signature.Width:=Image.Width; DBImage_Signature.Height:=Image.Height; r:=rect(0,0,Image.Width,Image.Height); DBImage_Signature.Picture.Bitmap.Canvas.CopyRect(r,Image.Canvas,r); end; Patrick |
AW: PaintBox in Image
Setz mal die Größe von DBImage_Signature.Picture.Bitmap.
|
AW: PaintBox in Image
Danke! Das war es...
Vielen Dank - jetzt wühle ich mich weiter dadurch Patrick |
AW: PaintBox in Image
Hmm..
Wenn es eine Windows VCL-Applikation ist, wieso muss dann diese Unterschrift (eventuell sogar mit Handschrifterkennung) immer wieder mit einer Paintbox aufs neue gemacht werden? ![]() Hier ging es zwar um ein Tablet, funktioniert aber auch mit Maus. Da ist ein ein Beispiel enthalten, wie dies funktioniert.. Es kommt ein GIF heraus incl. Strokes, welches auch wieder geladen/Angezeigt werden kann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:27 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 by Thomas Breitkreuz