AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Nicht sichtbaren TPaintBox Inhalt speichern

Ein Thema von cramer · begonnen am 10. Feb 2015 · letzter Beitrag vom 11. Feb 2015
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von cramer
cramer

Registriert seit: 23. Jun 2004
Ort: Velbert (NRW)
108 Beiträge
 
Delphi 2006 Enterprise
 
#11

AW: Nicht sichtbaren TPaintBox Inhalt speichern

  Alt 10. Feb 2015, 17:31
Danke für die Zusatzinfos.
Erfahrung ist etwas, daß man erst bekommt, kurz nachdem man es dringend gebraucht hätte.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: Nicht sichtbaren TPaintBox Inhalt speichern

  Alt 10. Feb 2015, 17:40
Ja, während du schreibst
Delphi-Quellcode:
if not QRsave( ... ) then
begin
  ShowMessage( 'Irgendwas ging da nicht' );
  Exit;
end;
if not FooMe( ... ) then
begin
  ShowMessage( ... );
  exit;
end;
schreibe ich einfach
Delphi-Quellcode:
QRsave( ... );
FooMe( ... );
habe das gleiche Verhalten und kann bei einem Fehler sehr exakt sagen, was genau in die Hose gegangen ist:
  • Der Dateiname ist ungültig
  • Die Instanz aImage ist nil
  • Das Speichern des Bitmaps ist aus dem Grund "..." fehlgeschlagen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (10. Feb 2015 um 17:46 Uhr)
  Mit Zitat antworten Zitat
pelzig
(Gast)

n/a Beiträge
 
#13

AW: Nicht sichtbaren TPaintBox Inhalt speichern

  Alt 10. Feb 2015, 18:16
Antwort eines Pfuschers:

Bei vielen VCL-Elementen kann man Visible auf false setzen ODER Left auf minus Soundsoviel minus Komponentenbreite

Tand ist das Gebuild aus Menschenhand

Man möge mich in der DP bitte nicht deswegen lynchen!

Mogeln gehört zum Handwerk...

MfG
  Mit Zitat antworten Zitat
Benutzerbild von cramer
cramer

Registriert seit: 23. Jun 2004
Ort: Velbert (NRW)
108 Beiträge
 
Delphi 2006 Enterprise
 
#14

AW: Nicht sichtbaren TPaintBox Inhalt speichern

  Alt 11. Feb 2015, 10:39
@ Sir Rufo.
Danke für die Hinweise...

Nur bei den entsprechenden Anwendungen(ca 100000 Zeilen PAS-Code ohne Komponenten, Kommentar- und Leer-Zeilen), die seit 14 Jahren stetig wachsen und an Funktionsumfang zunehmen, bedeutet eine Änderung der bisherigen Fehlerlog und Meldungsstruktur ein Redesign, welches ich mir zeitlich nicht leisten kann und möchte.

Mir graust es schon allein bei dem Gedanken, auf eine aktuelle XE? umzustellen, wenn ich mich nur an den steigenden Zeitaufwand bei jeder Umstellung von TP auf D1 auf D2 auf D5 und auf D2006 erinnere.

Um den zu erwartenden Kommentaren vorzubeugen: Sicherlich liegt einiges vom Aufwand her auch an einer nicht optimalen Programmstruktur.
Erfahrung ist etwas, daß man erst bekommt, kurz nachdem man es dringend gebraucht hätte.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Nicht sichtbaren TPaintBox Inhalt speichern

  Alt 11. Feb 2015, 11:25
Bei vielen VCL-Elementen kann man Visible auf false setzen ODER Left auf minus Soundsoviel minus Komponentenbreite
Das kann man auch bei der PaintBox, aber dann kann man da auch nicht mehr drauf malen.

Grund: TPaintBox und TLabel (PS: das "echte" Windows-Label ist TStaticText) haben keine eigene Zeichenfläche, sondern verwenden die Ausgabe/Canvas des Parents.
Es wird direkt somit direkt in die Ausgabe/Ansicht gemalt, aber da dieses nirgenwo zwischengespeichert ist, kann man es nicht "sicher" wieder auslesen.

Seit Vista benutzt Windows einen zwar Cache, durch den Desktop-Window-Manager, damit er die Transparenzen des Aero berechnen kann, aber es gibt keinen Weg diesen DWM nach einem Bild zu fragen.
In XP kennt man das, wenn man z.B. auf eine TPaintBox oder direkt auf das Form.Canvas malt ... wenn man das Fenster minimiert, aus dem Desktop rausschiebt oder ein anderes Fenster drüber schiebt, dann ist das gemalte weg/übermalt.
$2B or not $2B

Geändert von himitsu (11. Feb 2015 um 11:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von cramer
cramer

Registriert seit: 23. Jun 2004
Ort: Velbert (NRW)
108 Beiträge
 
Delphi 2006 Enterprise
 
#16

AW: Nicht sichtbaren TPaintBox Inhalt speichern

  Alt 11. Feb 2015, 12:55
Grund: TPaintBox und TLabel (PS: das "echte" Windows-Label ist TStaticText) haben keine eigene Zeichenfläche, sondern verwenden die Ausgabe/Canvas des Parents.
Es wird direkt somit direkt in die Ausgabe/Ansicht gemalt, aber da dieses nirgenwo zwischengespeichert ist, kann man es nicht "sicher" wieder auslesen.
Ja, das ist jetzt klar.

Kleine Analyse, so wie ich das jetzt sehe.

In meinem Fall lag die PaintBox auf einem Panel1 auf Tabsheet1 und wenn man auf ein anderes Tabsheet2 wechselt und wieder zurück bleibt der Inhalt der Paintbox scheinbar erhalten.

Weil vermutlich auf das darunterliegende Panel1 gemalt wurde, und dieses erhalten bleibt.

Beim Speichern war aber TabSheet2 aktiv und es wurde die Region der Paintbox mit den Inhalten des TabSheet2 gespeichert.

Ich habe den Vorschlag aufgenommen und es wird alles in den Bitmap gehandelt und fürs Anzeigen gibts ne Show.
Code:
function QRCodeShowImage( aImage : Timage; aSize : integer ) : boolean;
var scale : double;
begin
   result := false;
   try
      if ( ( QRCodeBitmap.Width > 0 ) and ( QRCodeBitmap.Height > 0 ) ) then begin
         aImage.Width := aSize;
         aImage.Height := aSize;
         Scale := aImage.Height / QRCodeBitmap.Height;
         aImage.Canvas.StretchDraw( Rect( 0, 0, Trunc( Scale * QRCodeBitmap.Width ),
                                                Trunc( Scale * QRCodeBitmap.Height ) ),
                                                QRCodeBitmap );
         result := true;
      end;
   except
      on e:exception do begin
         FehlerOk( 'QRCodeShow Fehler : ' + e.Message );
      end;
   end;
end;

function QRCodeSave( aFileName : string; aSize : integer ) : boolean;
var xBitmap : Graphics.TBitmap;
    scale : double;
Begin
   result := false;
   if fileDirOk( aFileName ) then begin
      try
         xBitmap := Graphics.TBitmap.Create;
         try
            if ( ( QRCodeBitmap.Width > 0 ) and ( QRCodeBitmap.Height > 0 ) ) then begin
               xBitmap.Width := aSize;
               xBitmap.Height := aSize;
               Scale := xBitmap.Height / QRCodeBitmap.Height;
               xBitmap.Canvas.StretchDraw( Rect( 0, 0, Trunc( Scale * QRCodeBitmap.Width ),
                                                       Trunc( Scale * QRCodeBitmap.Height ) ),
                                                       QRCodeBitmap );
               xBitmap.SaveToFile( aFileName );
               result := true;
            end;
         except
            on e:exception do begin
               FehlerOk( 'QR-Code Fehler : ' + e.Message );
            end;
         end;
      finally
         xBitmap.Free;
      end;
   end;
end;
Erfahrung ist etwas, daß man erst bekommt, kurz nachdem man es dringend gebraucht hätte.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Nicht sichtbaren TPaintBox Inhalt speichern

  Alt 11. Feb 2015, 14:16
Die Fehlerbehandlung ist aber wieder nicht "benutzbar". (siehe vorherrige Kommentare dazu)

Delphi-Quellcode:
   except
      on e:exception do begin
         FehlerOk( 'QRCodeShow Fehler : ' + e.Message );
      end;
   end;
Ruf diese Funktion mal auf und versuch beim Aufrufer den Fehler abzufangen (z.B. Try-Except) ... das geht natürlich nicht und du müsstest deiner Funktion wieder ein sinnloses "zeige Fehler nicht an"-Property mit geben.

Grade durch solche unnötigen Abhängigkeiten und Fehler-Dialoge verbaut man sich, daß ein Code einfach wiederverwendbar ist.
Durch Weglassen wird der Code wiederverwendbar, leichter wartbar, ist leichter zu debuggen, man kann leichter eine Fehlerlogging (z.B. Eurekalog) anbinden und der Code wird kürzer, übersicher und leichter verständlich.

Und wie man sieht, hast du auch noch doppelten Code.
Delphi-Quellcode:
procedure QRCodeShowImage( aBitmap : Graphics.TBitmap; aSize : integer );
var scale : double;
begin
   if ( ( QRCodeBitmap.Width > 0 ) and ( QRCodeBitmap.Height > 0 ) ) then begin
      aBitmap.Width := aSize;
      aBitmap.Height := aSize;
      Scale := aBitmap.Height / QRCodeBitmap.Height;
      aBitmap.Canvas.StretchDraw( Rect( 0, 0, Trunc( Scale * QRCodeBitmap.Width ),
                                              Trunc( Scale * QRCodeBitmap.Height ) ),
                                              QRCodeBitmap );
   end;
end;

procedure QRCodeSave( aFileName : string; aSize : integer );
var xBitmap : Graphics.TBitmap;
Begin
   CheckFileDir( aFileName );
   xBitmap := Graphics.TBitmap.Create;
   try
      QRCodeShowImage( xBitmap, aSize );
      xBitmap.SaveToFile( aFileName );
   finally
      xBitmap.Free;
   end;
end;
Alles was hier schief laufen kann, kann nur ein schwerer Fehler sein und sowas gehört als Exception.
$2B or not $2B

Geändert von himitsu (11. Feb 2015 um 14:27 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

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 05:09 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