Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi TImage - warum diese Fehlermeldung (https://www.delphipraxis.net/59236-timage-warum-diese-fehlermeldung.html)

meisteralex 19. Dez 2005 20:19


TImage - warum diese Fehlermeldung
 
Hallo, habe folgenden Code

Delphi-Quellcode:
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;
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)


warum ??? wenn ich in der prozedur das timageobject mit screenimage.Picture.bitmap.SaveToFile('c:\screen.b mp'); speicher klappt alles wunderbar??!!

xaromz 19. Dez 2005 20:23

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

Khabarakh 19. Dez 2005 20:27

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:
ScreenToFile:=screenimage;
screenimage.Free;
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.
Letzten Endes erschaffst du außerdem ein Speicherleck, weil du das alte Image nicht freigibst.

meisteralex 19. Dez 2005 20:29

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;

meisteralex 19. Dez 2005 20:30

Re: TImage - warum diese Fehlermeldung
 
@Khabarakh



kannst du jmir das irgendwie genauer erklären???

SirThornberry 19. Dez 2005 20:32

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

meisteralex 19. Dez 2005 20:36

Re: TImage - warum diese Fehlermeldung
 
wie übergeb ich denn dann sauber ne eigenschafft ?

xaromz 19. Dez 2005 20:37

Re: TImage - warum diese Fehlermeldung
 
Hallo,
Zitat:

Zitat von Khabarakh
@xaromz: Das stimmt auch, aber _der_ Fehler ist an einer anderen Stelle.

Stimmt. Ich hatte mir den Quelltext nicht so genau angesehen, mir wurde da gleich so anders... :mrgreen:
Aber mal im Ernst. So sollte es funktionieren:
Delphi-Quellcode:
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;
Dann:
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 06:39 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