Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   PaintBox in Image (https://www.delphipraxis.net/196099-paintbox-image.html)

Ykcim 23. Apr 2018 10:32

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:
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;
Und mit dieser Procedure möchte ich den Inhalt der PaintBox in das DBImage bringen.

Delphi-Quellcode:
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;
Das DBImage wird zwar auf die gleiche Größe wie die PaintBox gebracht, aber es wird kein Bild übertragen.

Kann mir jemand weiterhelfen?

Vielen Dank
Patrick

Uwe Raabe 23. Apr 2018 10:45

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.

Ykcim 23. Apr 2018 11:02

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:
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;
Aber wie zeichne ich dann das Ergebnis in die PaintBox und wie soll ich es daraus in das DBImage bekommen?
Delphi-Quellcode:
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;
Wenn ich das so mache, bekomme ich nichts mehr in der PaintBox zu sehen und bekomme auch nichts in das DBImage übertragen...
Vielen Dank
Patrick

Olli73 23. Apr 2018 11:15

AW: PaintBox in Image
 
Das Invalidate gehört ins PB_SignatureMouseMove.

Und das Bild kopierst du anschließend von der Bitmap ins DbImage.

himitsu 23. Apr 2018 11:48

AW: PaintBox in Image
 
Delphi-Quellcode:
   PB_Signature.Invalidate;
gehört nichts ins OnPaint.
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.

Ykcim 23. Apr 2018 11:56

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:
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;
Jetzt möchte ich das in dem TBitMap [Image] erstellt Bild in das DBImage [DBImage_Signature]bekommen. Das klappt leider noch nicht...

Delphi-Quellcode:
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;
Vielen Dank für die Unterstützung
Patrick

Olli73 23. Apr 2018 12:02

AW: PaintBox in Image
 
Setz mal die Größe von DBImage_Signature.Picture.Bitmap.

Ykcim 23. Apr 2018 12:11

AW: PaintBox in Image
 
Danke! Das war es...

Vielen Dank - jetzt wühle ich mich weiter dadurch

Patrick

HolgerX 23. Apr 2018 12:32

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?

https://www.delphipraxis.net/192146-...uf-tablet.html

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 22:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz