AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

PaintBox in Image

Ein Thema von Ykcim · begonnen am 23. Apr 2018 · letzter Beitrag vom 23. Apr 2018
Antwort Antwort
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
799 Beiträge
 
Delphi 10.4 Sydney
 
#1

PaintBox in Image

  Alt 23. Apr 2018, 11:32
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
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#2

AW: PaintBox in Image

  Alt 23. Apr 2018, 11:45
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
799 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: PaintBox in Image

  Alt 23. Apr 2018, 12:02
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
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
647 Beiträge
 
#4

AW: PaintBox in Image

  Alt 23. Apr 2018, 12:15
Das Invalidate gehört ins PB_SignatureMouseMove.

Und das Bild kopierst du anschließend von der Bitmap ins DbImage.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#5

AW: PaintBox in Image

  Alt 23. Apr 2018, 12:48
   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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Apr 2018 um 12:52 Uhr)
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
799 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: PaintBox in Image

  Alt 23. Apr 2018, 12:56
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
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
647 Beiträge
 
#7

AW: PaintBox in Image

  Alt 23. Apr 2018, 13:02
Setz mal die Größe von DBImage_Signature.Picture.Bitmap.
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
799 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: PaintBox in Image

  Alt 23. Apr 2018, 13:11
Danke! Das war es...

Vielen Dank - jetzt wühle ich mich weiter dadurch

Patrick
Patrick
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#9

AW: PaintBox in Image

  Alt 23. Apr 2018, 13:32
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 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