Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Image soll über einen pointer jpeg anzeigen (https://www.delphipraxis.net/141400-image-soll-ueber-einen-pointer-jpeg-anzeigen.html)

Hyperspacer 8. Okt 2009 11:39


Image soll über einen pointer jpeg anzeigen
 
Hallo,
Ich möchte in einem TImage ein jpg (TJpegImage) anzeigen lassen. Das fuinktioniert doch mit folgendem Code, oder?
Delphi-Quellcode:
NewImage.Picture.Assign(jpg);
Das Problem ist jetzt, dass ich das jpeg nicht direkt vorliegen habe, sondern als pointer. Und egal wie ich es drehe, ich erhalte am Ende statt des Bildes meine Lieblingsfehlermeldung: Zugriffsverletzung.

Delphi-Quellcode:
Var
  pointer : pJPEG; // pJPEG = ^TJpegImage; Wird als Funktionsparameter übergeben
  jpg : TJpegImage;
  NewImage : TImage;
begin
  // Image erstellen
  NewImage := TImage.Create(TabBilder);  // TabBilder ist ein TTabSheet in einem PageControl
  NewImage.Parent := TabBilder;

  NewImage.Top := 5;
  NewImage.Left := 5;
             
  NewImage.AutoSize := true;

  // Bild laden
  If pointer <> nil
    then jpg := pointer^;

  // Bild anzeigen
  NewImage.Picture.Assign(jpg);
end;

himitsu 8. Okt 2009 11:50

Re: Image soll über einen pointer jpeg anzeigen
 
Zitat:

sondern als pointer.
Wer kommt denn bitte auf soeine (Tschuldschung für die Wortwahl) schwachsinnige Idee?

Ein Objekt ist doch schon ein Zeiger, wozu also nochmal ein Zeiger/Pointer auf diesen Zeiger?


PS: bist du dir mit dem Pointer auch wirklich sicher?

Jedenfalls würde es so funktionieren, wenn es denn wirlich ein Zeiger auf eine Objektvariable und das entspechende Objekt auch OK wäre.

Hyperspacer 8. Okt 2009 18:06

Re: Image soll über einen pointer jpeg anzeigen
 
Zitat:

Zitat von himitsu
Zitat:

sondern als pointer.
Wer kommt denn bitte auf soeine (Tschuldschung für die Wortwahl) schwachsinnige Idee?

weil ichs nicht besser weiß.. :oops:

ich glaube, dass mein problem darin liegt, dass das jpg, auf das der zeiger zeigt, in einer anderen funtkion als lokale variable erzeugt wird. Das sieht so aus:
Delphi-Quellcode:
jpg := TJpegImage.Create;
jpg.LoadFromStream(tmp);

new(pointer);
pointer^ := jpg;

jpg.Free;
Wird dann das jpg aus dem speicher gelöscht und mein pointer zeigt auf eine stelle im speicher, die eigentlich freigegeben ist? Ich dachte das Problem hätte ich mit dem new() umgangen..

Medium 8. Okt 2009 18:17

Re: Image soll über einen pointer jpeg anzeigen
 
Du weist deinem Pointer ja genau die Speicherstelle zu, auf die jpg zeigt, so dass im pointer und in jpg nachher der selbe wert steht (jpg ist auch nur ein pointer). Dann gibst du jpg frei, und es passiert genau das was du beschrieben hast. Das new() hat hier keine Wirkung, da du ja sofort danach etwas anderes zuweist. Du kopierst ja nirgends die Daten auf die jpg zeigt.

Hyperspacer 8. Okt 2009 18:30

Re: Image soll über einen pointer jpeg anzeigen
 
Aber wenn ich die Stele so abänder, bekomme ich immer noch an der gleichen Stelle wie vorher eine Fehlermeldung:
Delphi-Quellcode:
jpg := TJpegImage.Create;
jpg.LoadFromStream(tmp);

pointer := @jpg;

hugo1990 8. Okt 2009 18:37

Re: Image soll über einen pointer jpeg anzeigen
 
Warum machst du das eigentlich so umständlich über einen Pointer, zeig mal die ganze Funktion, vielleicht kann man dir dann ehr helfen, indem man das ganze ein wenig anders löst.

Hyperspacer 8. Okt 2009 18:46

Re: Image soll über einen pointer jpeg anzeigen
 
Es geht letztlich darum:
Ich lade jpegs aus MP3 Tags unbestimmt vieler Dateien. Diese ganzen dateien werden in einer liste (TListView) angezeigt. wenn ich in der liste rechts auf eine datei klicke öffnet sich ein fenster mit den details zu dieser datei. und dort soll dann eben auch das jpeg angezeigt werden.
mit einem pointer löse ich das, da ein eintrag in tlistview als data nunmal gerne einen pointer haben möchte.

hugo1990 8. Okt 2009 18:58

Re: Image soll über einen pointer jpeg anzeigen
 
Dann caste das ganze doch einfach beim Zuweisen auf den ListView-Eintrag als Pointer und beim auslesen wieder zu TJPEGImage, wobei das nicht mal zwingend notwendig sein sollte.

himitsu 8. Okt 2009 18:59

Re: Image soll über einen pointer jpeg anzeigen
 
hier zeigt der Pointer auf die Variable
Delphi-Quellcode:
pointer := @jpg;
und wenn du später auf das Bild zugreifen willst, dann muß diese Variable noch existieren, was sie wohl nicht mehr tut :zwinker:

wie gesagt, ein Objekt ist im Prinzip auch ein Zeiger, also brauchst du diesen einfach nur umzuwandeln (typcasting)
Delphi-Quellcode:
p := Pointer(jpg);
wenn du nun später wieder das Object haben willst, dann einfach umgekehrt
Delphi-Quellcode:
jpg := TJpegImage(p);
[add]
Zitat:

Delphi-Quellcode:
// Bild laden
If pointer <> nil
  then jpg := pointer^;

// Bild anzeigen
NewImage.Picture.Assign(jpg);

PS: Was passiet eigentlich, wenn pointer (es ist etwas unglücklich gewählt, wenn eine Variable wie genauso ein bekannter Typ heißt) NIL ist?
Dann ist nach dem IF das jpg undefiniert und .Assign wird vermutlich mit einer netten exception reagieren :wink:

da wäre dieses schon besser:
Delphi-Quellcode:
NewImage.Picture.Assign(TJpegImage(_pointer_));

Hyperspacer 8. Okt 2009 19:14

Re: Image soll über einen pointer jpeg anzeigen
 
jetzt geht es.
aber ich verstehe nicht wo der unterschied zwischen
Delphi-Quellcode:
pointer := @jpg;
und
Delphi-Quellcode:
p := Pointer(jpg);
ist...


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 Uhr.
Seite 1 von 2  1 2      

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