GetFormImage liefert schwarzes Rechteck

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
wichard
Beiträge: 7
Registriert: Mi 11. Dez 2013, 18:12

GetFormImage liefert schwarzes Rechteck

Beitrag von wichard »

Ich benutze Lazarus 1.0.14 (SVN Revision 43446) unter Win XP.
Der Aufruf von tForm.GetFormImage liefert ein großes schwarzes Rechteck.
Gibt es dafür (oder dagegen) eine Lösung?
Wichard

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2816
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: GetFormImage liefert schwarzes Rechteck

Beitrag von m.fuchs »

Kann ich hier ( allerdings mit 1.0.8 ) nicht nachvollziehen. Zeig doch einmal ein bisschen Code. Vielleicht geht ja woanders etwas schief.
Zuletzt geändert von m.fuchs am So 22. Dez 2013, 12:04, insgesamt 1-mal geändert.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

wichard
Beiträge: 7
Registriert: Mi 11. Dez 2013, 18:12

Re: GetFormImage liefert schwarzes Rechteck

Beitrag von wichard »

Mein Code ist äußerst simpel:

procedure TForm_BMScanline.Button3Click(Sender: TObject);
begin
getformimage.SaveToFile('c:\formimage.bmp');
end;


Der File wird erzeugt. Wenn ich ihn z.B. mit Irfanview öffne, bekomme ich ein schwarzes Rechteck.
Wichard

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: GetFormImage liefert schwarzes Rechteck

Beitrag von theo »

Ja, da ist etwas merkwürdig.
Probier mal so (Nur auf Linux getestet):

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var  fi: TBitmap;
begin
  fi:=GetFormImage;
  fi.Canvas.Changed;
  fi.SaveToFile('c:\formimage.bmp');
  fi.free;
end;
 
Das Bitmap musst du sowieso selber freigeben, also
getformimage.SaveToFile('c:\formimage.bmp');
ist ohnehin fahrlässig, da du so kein Handle mehr darauf hast.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2816
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: GetFormImage liefert schwarzes Rechteck

Beitrag von m.fuchs »

Jetzt habe ich das nochmal auf meinem Notebook unter 1.0.12 ausprobiert und habe das gleiche Problem wie du.
Könnte ein Fehler sein, machst du einen Bugreport auf?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: GetFormImage liefert schwarzes Rechteck

Beitrag von Michl »

Theos Variante funktioniert bei mir:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  with GetFormImage do begin
    Canvas.Changed;
    SaveToFile('c:\01\01.bmp');
    Free;
  end;
end;
Die Variante mit direktem getformimage.SaveToFile('c:\formimage.bmp'); ohne Canvas.Changed funktioniert bei mir ebenfalls nicht.

Lazarus 32bit 1.3 r43538 FPC 2.7.1-Trunc bei Win7 64bit

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: GetFormImage liefert schwarzes Rechteck

Beitrag von theo »

Michl hat geschrieben:Theos Variante funktioniert bei mir
Das ist schön, danke.
Ich möchte aber betonen, dass das "with" keyword in meiner Variante nicht vorkommt.
Ich rate jedem und vor allem Anfängern dringend davon ab, das "with" keyword zu verwenden.
Jedes Debugging von fremdem Code beginnt bei mir mit der "with" Entrümpelung. :wink:

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: GetFormImage liefert schwarzes Rechteck

Beitrag von Michl »

theo hat geschrieben:Ich möchte aber betonen, dass das "with" keyword in meiner Variante nicht vorkommt.
Ich rate jedem und vor allem Anfängern dringend davon ab, das "with" keyword zu verwenden.
Offtopic: kannst Du mir das erklären?! Wegen der Lesbarkeit oder wegen der (noch) vorhandenen Möglichkeit einen Hack zu machen?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2816
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: GetFormImage liefert schwarzes Rechteck

Beitrag von m.fuchs »

Ja, mit .Changed geht es hier jetzt auch. Also doch kein Bug, warum auch immer es unter der anderen Intsallation ohne .Changed ging.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: GetFormImage liefert schwarzes Rechteck

Beitrag von theo »

Michl hat geschrieben:
theo hat geschrieben:Ich möchte aber betonen, dass das "with" keyword in meiner Variante nicht vorkommt.
Ich rate jedem und vor allem Anfängern dringend davon ab, das "with" keyword zu verwenden.
Offtopic: kannst Du mir das erklären?! Wegen der Lesbarkeit oder wegen der (noch) vorhandenen Möglichkeit einen Hack zu machen?
Weil man sich damit einfach nur selber in den Fuß schießt.
Code Completion weiss nicht mehr was gemeint ist, ich weiss nicht mehr was gemeint ist und der Compiler "frisst" den falsch gemeinten Code auch noch ohne zu murren. Es ist einfach eine unnötige Quelle der Verunsicherung und Vernebelung.

Simples Bsp.

Code: Alles auswählen

  TMyObj=class
  private
    FMyWidth: integer;
    procedure SetMyWidth(AValue: integer);
    public
      property MyWidth:integer read FMyWidth write SetMyWidth;
  end;    
...
procedure TForm1.Button1Click(Sender: TObject);
begin
  with TMyObj.Create do
  begin
   Width:=500;
   Free;
  end;
end; 
Welches "Width" setze ich hier? Hier ist schon klar, dass es MyWidth heißen müsste, aber wenn TMyObj in einer anderen Unit deklariert ist, ist es eben nicht mehr so klar. Stattdessen verbreitere ich das Formular und der Compiler findet das in Ordnung.
Mit "MyObj.Width:=500" würde er meckern.
Zuletzt geändert von theo am So 22. Dez 2013, 14:23, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: GetFormImage liefert schwarzes Rechteck

Beitrag von theo »

m.fuchs hat geschrieben:Ja, mit .Changed geht es hier jetzt auch. Also doch kein Bug, warum auch immer es unter der anderen Intsallation ohne .Changed ging.
MMn ist es durchaus ein Bug, wir haben einfach einen Workaround gefunden.
Wer macht den Bugtracker Eintrag? Freiwillige vor! :wink:

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: GetFormImage liefert schwarzes Rechteck

Beitrag von Michl »

theo hat geschrieben:Es ist einfach eine unnötige Quelle der Verunsicherung und Vernebelung.
Das verstehe ich, nutze es eigentlich selber recht selten, eben wegen der schlechteren Lesbarkeit. Als mögliche Fehlerquelle hatte ich das noch nicht betrachtet - danke für die Erleuchtung!

Werde mir sobald ich "with" eingebe selber auf die Finger klopfen - das war jetzt das erste Mal :lol:
theo hat geschrieben:Wer macht den Bugtracker Eintrag? Freiwillige vor! :wink:
Wenn Ihr nicht wollt, mache ich den...

[Edit:] http://bugs.freepascal.org/view.php?id=25448

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten