![]() |
TImage - warum diese Fehlermeldung
Hallo, habe folgenden Code
Delphi-Quellcode:
wie ihr seht, habe ich eine funktion die ein timage zurück gibt (in diesem falle einen screenshot). image1 ist bei mir ein Image - control auf meinem formular. wenn ich nun diesem image den rückgabe wert von screentofile() zuweise und ihn wie im beispiel speichern will, bekomme ich immer einen fehlermeldung (exeption an stelle bla , bla, bla komische hex-zahl bla bla)
function ScreenToFile():timage;
var screenimage:timage; Canvas: TCanvas; begin Canvas := TCanvas.Create; try Canvas.Handle := GetWindowDC(0); try screenimage := timage.Create(nil); try screenimage.Picture.Bitmap.Width := Screen.DesktopWidth; screenimage.Picture.Bitmap.Height:= Screen.DesktopHeight; screenimage.Picture.Bitmap.PixelFormat := pf32bit; BitBlt(screenimage.Picture.Bitmap.Canvas.Handle, 0, 0, Pred(Screen.DesktopWidth), Pred( Screen.DesktopHeight), Canvas.Handle, Screen.DesktopLeft, Screen.DesktopTop, screenimage.Picture.Bitmap.Canvas.CopyMode); //screenimage.Picture.bitmap.SaveToFile('c:\screen.bmp'); finally ScreenToFile:=screenimage; screenimage.Free; end; finally ReleaseDC(0, Canvas.Handle); end; finally Canvas.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin image1 := screentofile(); image1.Picture.Bitmap.SaveToFile('C:\neuertest.bmp'); end; warum ??? wenn ich in der prozedur das timageobject mit screenimage.Picture.bitmap.SaveToFile('c:\screen.b mp'); speicher klappt alles wunderbar??!! |
Re: TImage - warum diese Fehlermeldung
Hallo,
eine Funktion sollte niemals ein Visual Control zurückliefern. Eine solche Komponente braucht immer ein Parent, sonst hagelt's normalerweise AV's. Erstell doch ein TBitmap und liefere dieses zurück. Du brauchst ja kein TImage, oder? Gruß xaromz |
Re: TImage - warum diese Fehlermeldung
@xaromz: Das stimmt auch, aber _der_ Fehler ist an einer anderen Stelle.
@meisteralex: Ich glaube, du hast eine ziemlich wichtige Eigenschaft von Klassen noch nicht verstanden: Es sind immer Referenztypen. Wenn du also eine Variable einer Klasse hast, hast du eigentlich nur einen Zeiger, der auf die echte Instanz irgendwo im Arbeitsspeicher zeigt.
Delphi-Quellcode:
Hier hast du demnach nicht zwei verschiedene Objekte, sondern zwei Zeiger auf dasselbe Objekt. Wenn du dieses nun freigibst, zeigt der andere Zeiger natürlich nur noch auf Datenmüll -> AV.
ScreenToFile:=screenimage;
screenimage.Free; Letzten Endes erschaffst du außerdem ein Speicherleck, weil du das alte Image nicht freigibst. |
Re: TImage - warum diese Fehlermeldung
hab alles timages durch tbitmap ersetzt ,
ergibt gleiche fehlermeldung beim speichern hier nochmal der code
Delphi-Quellcode:
function ScreenToFile():tbitmap;
var screenimage:tbitmap; Canvas: TCanvas; begin Canvas := TCanvas.Create; try Canvas.Handle := GetWindowDC(0); try screenimage := tbitmap.Create(); try screenimage.Width := Screen.DesktopWidth; screenimage.Height:= Screen.DesktopHeight; screenimage.PixelFormat := pf32bit; BitBlt(screenimage.Canvas.Handle, 0, 0, Pred(Screen.DesktopWidth), Pred( Screen.DesktopHeight), Canvas.Handle, Screen.DesktopLeft, Screen.DesktopTop, screenimage.Canvas.CopyMode); //screenimage.Picture.bitmap.SaveToFile('c:\screen.bmp'); finally ScreenToFile:=screenimage; screenimage.Free; end; finally ReleaseDC(0, Canvas.Handle); end; finally Canvas.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin image1.Picture.Bitmap := (screentofile()); image1.Picture.Bitmap.SaveToFile('C:\neuertest.bmp'); end; |
Re: TImage - warum diese Fehlermeldung
@Khabarakh
kannst du jmir das irgendwie genauer erklären??? |
Re: TImage - warum diese Fehlermeldung
liest du überhaupt was andere schreiben?
Delphi-Quellcode:
ScreenToFile:=screenimage; //hier weißt du ScreenToFile die Referenz von Screenimage zu
screenimage.Free; //und hier gibst du die Referenz von ScreenToFile und ScreenImage frei |
Re: TImage - warum diese Fehlermeldung
wie übergeb ich denn dann sauber ne eigenschafft ?
|
Re: TImage - warum diese Fehlermeldung
Hallo,
Zitat:
Aber mal im Ernst. So sollte es funktionieren:
Delphi-Quellcode:
Dann:
function ScreenToBitmap: TBitmap;
var DC: HDC; begin Result := TBitmap.Create; Result.Width := Screen.DesktopWidth; Result.Height := Screen.DesktopHeight; try DC := GetDC(0); BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, DC, 0, 0, SRCCOPY); finally ReleaseDC(0, DC); end; end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Bit: TBitmap; begin Bit := ScreenToBitmap; // Funktion aufrufen image1.Picture.Bitmap.Assign(Bit); // Ergebnis anzeigen Bit.SaveToFile('C:\neuertest.bmp'); // Ergebnis speichern Bit.Free; // Aufräumen, nie vergessen end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 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