AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi TImage - warum diese Fehlermeldung
Thema durchsuchen
Ansicht
Themen-Optionen

TImage - warum diese Fehlermeldung

Ein Thema von meisteralex · begonnen am 19. Dez 2005 · letzter Beitrag vom 19. Dez 2005
Antwort Antwort
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#1

TImage - warum diese Fehlermeldung

  Alt 19. Dez 2005, 20:19
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??!!
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: TImage - warum diese Fehlermeldung

  Alt 19. Dez 2005, 20:23
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
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#3

Re: TImage - warum diese Fehlermeldung

  Alt 19. Dez 2005, 20:27
@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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#4

Re: TImage - warum diese Fehlermeldung

  Alt 19. Dez 2005, 20:29
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;
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#5

Re: TImage - warum diese Fehlermeldung

  Alt 19. Dez 2005, 20:30
@Khabarakh



kannst du jmir das irgendwie genauer erklären???
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: TImage - warum diese Fehlermeldung

  Alt 19. Dez 2005, 20:32
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#7

Re: TImage - warum diese Fehlermeldung

  Alt 19. Dez 2005, 20:36
wie übergeb ich denn dann sauber ne eigenschafft ?
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#8

Re: TImage - warum diese Fehlermeldung

  Alt 19. Dez 2005, 20:37
Hallo,
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...
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;
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:35 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