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:
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.
NewImage.Picture.Assign(jpg);
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; |
Re: Image soll über einen pointer jpeg anzeigen
Zitat:
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. |
Re: Image soll über einen pointer jpeg anzeigen
Zitat:
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:
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..
jpg := TJpegImage.Create;
jpg.LoadFromStream(tmp); new(pointer); pointer^ := jpg; jpg.Free; |
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.
|
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; |
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.
|
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. |
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.
|
Re: Image soll über einen pointer jpeg anzeigen
hier zeigt der Pointer auf die Variable
Delphi-Quellcode:
und wenn du später auf das Bild zugreifen willst, dann muß diese Variable noch existieren, was sie wohl nicht mehr tut :zwinker:
pointer := @jpg;
wie gesagt, ein Objekt ist im Prinzip auch ein Zeiger, also brauchst du diesen einfach nur umzuwandeln (typcasting)
Delphi-Quellcode:
wenn du nun später wieder das Object haben willst, dann einfach umgekehrt
p := Pointer(jpg);
Delphi-Quellcode:
[add]
jpg := TJpegImage(p);
Zitat:
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_));
|
Re: Image soll über einen pointer jpeg anzeigen
jetzt geht es.
aber ich verstehe nicht wo der unterschied zwischen
Delphi-Quellcode:
und
pointer := @jpg;
Delphi-Quellcode:
ist...
p := Pointer(jpg);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 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