Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Paintbox speichern (https://www.delphipraxis.net/100212-paintbox-speichern.html)

Delphieinsteiger 24. Sep 2007 17:29


Paintbox speichern
 
Hi!

Wollte mal Fragen ob es möglich ist, wenn ich auf einen Button klicke, nur die Paintbox die sich in eine Scrollbox auf meiner Form befindet,mitsamt Inhalt (Koordinatensystem) auf meinem PC abzuspeichern.Habe gelesen das ich es mit SaveToFile lösen könnte, aber kann mir nicht so richtig vorstellen wie das geht.Für Ratschläge wäre ich Dankbar!

torud 24. Sep 2007 18:12

Re: Paintbox speichern
 
Ich nehme an, dass Du den Inhalt des Canvas der Paintbox als Bild speichern willst?

Das geht relativ einfach. Suche einfach mal hier im Forum nach ScrollboxToCanvas...Damit würde Dir der gesamte Inhalt der Scrollbox in einen Canvas Deiner Wahl übergeben. Wenn Du Dir eine TImage creierst, könntest Du diesem den Canvas zuweisen und anschliessend das TImage als Bild speichern. Habe ich auch schon so gemacht...

Delphieinsteiger 25. Sep 2007 17:13

Re: Paintbox speichern
 
Danke für die Antwort Torud!!
Jetzt habe ich Dank der Prozedur von Omata die ich hier im Forum gefunden habe, meinen Scrollboxinhalt in einem Canvas gezeichnet.Jetzt weiß ich nur nicht genau wie ich diesen Canvas einen Timage zuweisen kann.Habe schon ein paar Versuche unternommen, aber die waren leider nicht von Erfolg gekrönt.Bin halt noch nicht solange dabei!

s-off 25. Sep 2007 17:33

Re: Paintbox speichern
 
Hallo,

kopiere den Inhalt vom Canvas Deiner PaintBox auf das Canvas Deines Images mittels
Delphi-Quellcode:
Image.Canvas.CopyRect(Image.Canvas.ClipRect, PaintBox.Canvas, PaintBox.Canvas.ClipRect);
Anschließend speicherst Du das Ganze mit
Delphi-Quellcode:
Image.Picture.SaveToFile

Delphieinsteiger 25. Sep 2007 17:50

Re: Paintbox speichern
 
Das klappt Super!!
Vielen Dank,damit ist ein weiteres Problem gelöst!

s-off 25. Sep 2007 18:07

Re: Paintbox speichern
 
Wenn Du am TRect ein bissel schraubst, kannst Du den Quellbereich (PaintBox.Canvas.ClipRect) auch noch eingrenzen sowie den Zielbereich (Image.Canvas.ClipRect) festlegen.

shmia 25. Sep 2007 18:15

Re: Paintbox speichern
 
Anstatt den Canvas der Paintbox zu kopieren, wäre es sicher besser das Bitmap einfach neu zeichen zu lassen.
Dazu sollte man die Zeichenroutinen in einer Methode (im Beispiel InternalPaint) konzentrieren:
Delphi-Quellcode:
procedure TForm1.InternalPaint(Canvas:TCanvas);
begin
  // hier alle Zeichenfunktionen rein
end;
procedure TForm1.Paintbox1Paint(sender:TObject);
begin
   InternalPaint(PaintBox1.Canvas);
end;
Jetzt ist es ein Klacks die graphische Ausgabe auf ein TBitmap zu leiten.
Das ist viel sauberer, als der Vorschlag mit dem Image.
Delphi-Quellcode:
var
  bmp : TBitmap;
begin
  bmp := TBitmap.Create;
  try
    bmp.Width := Paintbox1.Width;
    bmp.Height := Paintbox1.Height;
    InternalPaint(bmp.Canvas);
    bmp.SaveTofile(...);
  finally
    bmp.Free;
  end;

s-off 25. Sep 2007 19:27

Re: Paintbox speichern
 
Hallo Shmia,
Zitat:

Zitat von shmia
Anstatt den Canvas der Paintbox zu kopieren, wäre es sicher besser das Bitmap einfach neu zeichen zu lassen.

erklärst Du mir bitte, warum das besser ist? Aus meiner Sicht ist es anders, aber nicht unbedingt besser. Kläre mich bitte auf, sollte ich falsch liegen.

Die Unterschiede finde ich ehrlich gesagt nicht so gravierend.
Du zeichnest auf den Canvas einer PaintBox, wenn gespeichert werden soll zusätzlich nochmal das Gleiche auf das Canvas eines Bitmaps.
Ich zeichne auf den Canvas einer PaintBox und kopiere das Ergebnis auf ein Image, sofern gespeichert werden soll. Dabei kann ich zusätzlich die zu kopierenden Bereiche festlegen.

Wo ist der Vorteil Deines Vorgehens?

Apollonius 25. Sep 2007 19:36

Re: Paintbox speichern
 
Ich persönlich hätte es ähnlich wie s-off gemacht, allerdings nur mit einem TBitmap statt mit einem TImage, denn wenn man sowieso nichts anzeigen will, halte ich das verwenden einer visuellen Komponenete für unsinnig.
Und ob ich die Sachen jetzt kopiere oder eben neu zeichne... Ich selbst würde, wie gesagt, fürs Kopieren plädieren, allerdings dürften die Unterschiede minimal sein.
Bezüglich der zu kopierenden Bereiche: Ich denke da ließe sich beim Neuzeichnen etwas über Canvas.Cliprect machen.

s-off 25. Sep 2007 19:42

Re: Paintbox speichern
 
Ja, dass ein TBitmap in diesem Fall, also ohne Bildschirmausgabe besser geeignet wäre, gebe ich zu.
Habe das TImage aus dem ersten Vorschlag aufgegriffen und dummerweise nicht weiter drüber nachgedacht.

Aber schauen wir mal, was shmia noch zu berichten hat - wenn er diesen Aufruf denn überhaupt sieht :-D

Delphieinsteiger 25. Sep 2007 19:49

Re: Paintbox speichern
 
Ich finde beide Lösungen gut!
Danke erstmal dafür,habe mich jetzt aber auch für die von S-Off entschieden.Habe nur noch das Problem das ich nicht die ganze Paintbox speichern kann sondern nur den Teil der innerhalb der Scrollbox zu sehen ist.Hatte ja versucht den ganzen Inhalt der Scrollbox in einem Canvas zu schreiben(Methode hatte ich hier im forum von omata gefunden).kann ich diesen gesamten Canvas dann nicht einfach auf ein TBitmap kopieren und dann abspeichern?Versuche das die ganze Zeit aber will nicht so richtig.Stell mich wohl nicht gerade clever an :wall:

shmia 26. Sep 2007 09:37

Re: Paintbox speichern
 
Zitat:

Zitat von s-off
Zitat:

Zitat von shmia
Anstatt den Canvas der Paintbox zu kopieren, wäre es sicher besser das Bitmap einfach neu zeichen zu lassen.

erklärst Du mir bitte, warum das besser ist?

Angenommen, die Paintbox wäre teilweise durch ein anderes Fenster verdeckt.
Der Benutzer drückt den Button zum Speichern.
Nun verschwindet zufällig das Fenster, dass die Paintbox verdeckt hat.
Die Paint-Message kommt zu spät; das Bild wurde schon verstümmelt gepseichert.

2. Vorteil - Die Farbtiefe
Angenommen die Grafikkarte hat nur 256 Farben.
Beim Kopieren kann das gespeicherte Bitmap dann natürlich auch nicht mehr Farben erhalten.
Bei meiner Methode wäre das aber kein Problem; man könnte 16 Mio. Farben (24bit) speichern.

3. Vorteil - die Druckausgabe
Wenn man eine Methode InternalPaint hat, kann man damit auch einfach auf den Printer.Canvas drucken.

s-off 26. Sep 2007 09:47

Re: Paintbox speichern
 
Danke shmia.

taktaky 5. Nov 2007 10:08

Re: Paintbox speichern
 
Bei mir ist das Icon PaintBox1 nicht zu finden
Wo finde ich das icon ?

sirius 5. Nov 2007 10:10

Re: Paintbox speichern
 
In D7 liegt es im Reiter System, direkt neben dem Timer.

taktaky 5. Nov 2007 10:14

Re: Paintbox speichern
 
Zitat:

Zitat von sirius
In D7 liegt es im Reiter System, direkt neben dem Timer.

Danke!
habe ich nie gedacht, dass es in dem Reiter System liegen kann :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:29 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