![]() |
Delphi-Version: 2006
Nicht sichtbaren TPaintBox Inhalt speichern
Ich baue mir eine QR-Code-Grafik in einer PaintBox MyPaintBox zusammen.
Diese Paintbox liegt auf einem TabSheet, welches der Benutzer nicht sieht. Das klappt alles, bis auf das Speichern.
Code:
:(
// MyPaintBox speichern ...
if not QRCodeSave( 'c:\temp\test.bmp', MyPaintBox ) then // .. function QRCodeSave( aFileName : string; aPaintBox : TPaintBox ) : boolean; var xBitmap : Graphics.TBitmap; xWidth, xHeight : Integer; Begin result := false; if fileDirOk( aFileName ) then begin try xWidth := aPaintBox.Width; xHeight := aPaintBox.Height; xBitmap := Graphics.TBitmap.Create; xBitmap.Height := xHeight; xBitmap.Width := xWidth; xBitmap.Canvas.CopyRect( Rect( 0, 0, xWidth, xHeight ), aPaintBox.Canvas, Rect( 0, 0, xWidth, xHeight ) ); try xBitmap.SaveToFile( aFileName ); result := true; except on e:exception do begin FehlerOk( 'QR-Code Fehler : ' + e.Message ); end; end; finally xBitmap.Free; end; end else begin // Ups end; end; In der gespeicherten Datei befindet sich dann ein Ausschnitt aus dem gerade sichtbaren Tabsheet der der Position und dem Bereich der PaintBox entspricht. Wenn ich die PaintBox im sichtbaren Bereich unterbringe, was aber nicht so sein soll, wird der richtige Inhalt gespeichert. Die Frage ist nun, wie bekommt man den Inhalt einer nicht sichtbaren PaintBox in eine Datei. Thanks in advance |
AW: Nicht sichtbaren TPaintBox Inhalt speichern
Du könntest ja statt auf den Canvas der PaintBox in eine Offscreen-Bitmap zeichnen. Die lässt sich auf der Paintbox darstellen, lässt sich aber eben auch einfach abspeichern.
|
AW: Nicht sichtbaren TPaintBox Inhalt speichern
Eine PaintBox hat niemals von ihrem Canvas eine "Kopie".
Man kann manchmal maximal noch den Desktop fragen, ob er den aktuellen Inhalt hat/kennt, aber wenn unsichtbar oder außerhalb des sichtbaren Bereichts, bzw. wenn etwas drüber liegt, dann natürlich nicht. Wie bereits erwähnt, entweder sorgst du für den Zwischenspeicher. (z.B. Bitmap dahinter) oder du benutzt etwas, wo das schon drin ist (TImage). |
AW: Nicht sichtbaren TPaintBox Inhalt speichern
:roll:
Das kommt wohl davon, wenn man um Grafiken immer einen großen Bogen gemacht hat.:oops: Ich habs auf ein Timage umgestellt, dieses wird auch richtig gezeichnet nur klappt es wieder mit dem Speichern nicht, AV in:
Code:
function QRCodeSave( aFileName : string; aImage : Timage ) : boolean;
var xBitmap : Graphics.TBitmap; Begin result := false; if fileDirOk( aFileName ) then begin try try xBitmap.Height := aImage.Height; xBitmap.Width := aImage.Width; xBitmap.Canvas.Draw( 0, 0, aImage.Picture.Graphic); xBitmap.SaveToFile( aFileName ); result := true; except on e:exception do begin FehlerOk( 'QR-Code Fehler : ' + e.Message ); end; end; finally xBitmap.Free; end; end; end; |
AW: Nicht sichtbaren TPaintBox Inhalt speichern
Wo ist denn die Zeile
Delphi-Quellcode:
:?:
xBitmap := TBitmap.Create;
|
AW: Nicht sichtbaren TPaintBox Inhalt speichern
Und was soll dir dieses Exception-Handling bringen?
Das sollte dich glücklich(er) machen:
Delphi-Quellcode:
procedure QRCodeSave( aFileName : string; aImage : Timage );
var xBitmap : Graphics.TBitmap; Begin if not fileDirOk( aFileName ) then raise Exception.CreateFmt( '"%s" ist ungültig', [aFileName] ); if not Assigned( aImage ) then raise EArgumentNilException.Create( 'aImage' ); xBitmap := Graphics.TBitmap.Create; try xBitmap.Height := aImage.Height; xBitmap.Width := aImage.Width; xBitmap.Canvas.Draw( 0, 0, aImage.Picture.Graphic); xBitmap.SaveToFile( aFileName ); finally xBitmap.Free; end; end; |
AW: Nicht sichtbaren TPaintBox Inhalt speichern
BTW: wäre es so nicht einfacher?
Delphi-Quellcode:
xBitmap := Graphics.TBitmap.Create;
try xBitmap.Assign(aImage.Picture.Graphic); xBitmap.SaveToFile( aFileName ); finally xBitmap.Free; end; |
AW: Nicht sichtbaren TPaintBox Inhalt speichern
Ja, aber was soll ich denn noch alles machen? :mrgreen:
(Was schreibe ich denn für heute in mein Berichtsheft? :gruebel:) |
AW: Nicht sichtbaren TPaintBox Inhalt speichern
Vielen Dank ihr Beiden. :thumb: :thumb:
Zitat:
Jetzt funktionieren beide Versionen, die "Glücklich Machende" und die "BTW" auch. Zur Frage "Und was soll dir dieses Exception-Handling bringen?" "FileDirOK()" prüft den Pfad und legt ihn ggf an. Wenn das schon nicht geht, liefert QRCodeSave "false" zurück und die übergeordneten Abläufe werten das aus. FehlerOK() speichert einen Eintrag ins Fehlerlog und prüft, ob das Programm im "AutoMode" läuft. Falls nicht, gibts auch noch einen Fehler-Dialog für den Anwender. |
AW: Nicht sichtbaren TPaintBox Inhalt speichern
Und was mir grade noch aufgefallen war:
Du willst also unsichtbar im Hintergrund ein Bild malen, wolltest dafür aber eine "sichtbare" Komponente auf der Form benutzen. Also in dem Fall nimmt man natürlich eine unsichtbare "Komponente", welche man nicht auf das Form liegen hat. -> TBitmap erstellen, drauf malen, speichern und Bitmap wieder freigeben Aber da man den QR-Code eventuell auch mal anzeigen möchte, trennt man den Zeichen-Code komplett von irgendeiner Componente. -> Zeichenfunktion bekommt ein TCanvas, dann noch eine X- und Y-Position und vielleicht noch die Größe Width/Height. Dann ist es auch egal, ob man auf ein Bitmap, Jpeg, PNG oder ein TImage.Bitmap zeichnet. -> TBitmap erstellen, die Funktion drauf malen lassen, speichern und Bitmap wieder freigeben oder -> TImage auf die Form und dann nur noch die Zeichenfunktion auf Image1.Picture.Bitmap.Canvas zeichnen lassen (vorher natürlich noch die Größe der Bitmaps setzen, falls die Größe nicht bereits gesetzt ist) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:07 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