![]() |
Delphi-Version: 5
Imagearry wird direkt ausgegeben
Hallo zusammen,
folgende Zeilen sollten eigentlich nur mein array befüllen, aber die Bilder werden direkt im PanelTop angezeigt, ohne das ich auf das array zugreife. Wo liegt dort mein Denkfehler?
Delphi-Quellcode:
Vielen Dank im voraus.
var
i: integer; jpg: tjpegimage; ms: tmemorystream; ... for i := 0 to 19 do begin jpg := tjpegimage.Create; ms := tmemorystream.Create; TBLobfield(FDQuery1.FieldByName('Bild' + inttostr(i))).SaveToStream(ms); ms.Position := 0; jpg.LoadFromStream(ms); if ms.Position > 50 then begin SetLength(PatBildAr, length(PatBildAr) + 1); PatBildAr[i] := timage.Create(self); PatBildAr[i].Parent := PanelTop; PatBildAr[i].Align := alClient; PatBildAr[i].Center := true; PatBildAr[i].Proportional := true; PatBildAr[i].Stretch := true; PatBildAr[i].Visible := true; PatBildAr[i].Picture.Assign(jpg); jpg.Free; ms.Free; end; end; Grüße vom Janninger |
AW: Imagearry wird direkt ausgegeben
PatBildAr[].Visible := true; vielleicht überdenken?
|
AW: Imagearry wird direkt ausgegeben
Vielleicht solltest du auch an Ressourcenschutzblöcke denken.
|
AW: Imagearry wird direkt ausgegeben
Delphi-Quellcode:
eventuell:
PatBildAr[i] := timage.Create(self); // Damit wird das Image auf Self (ermutlich ein Formular?)
PatBildAr[i].Parent := PanelTop; // und das PanelTop gelegt.
Delphi-Quellcode:
In dem Fall darf aber (zu einem späteren Zeitpunkt, bei Programmende ...) die Freigabe der Bilder im Array nicht vergessen werden.
PatBildAr[i] := timage.Create(nil);
PatBildAr[i].Parent := nil; Eventuell aber auch
Delphi-Quellcode:
Visible erst dann auf True setzen, wenn die Anzeige erfolgen soll und wieder auf False, wenn keine Anzeige mehr erfolgen soll.
PatBildAr[i].Visible := false;
|
AW: Imagearry wird direkt ausgegeben
Das array gebe ich über Form.Destroy frei.
Delphi-Quellcode:
Mein Gedanke war, das die Images nur ins Array geladen werden und bei Bedarf von dort über assign wieder geladen werden.
procedure TForm6.FormDestroy(Sender: TObject);
var i: integer; begin for i := 0 to high(PatBildAr) do PatBildAr[i].Free; SetLength(PatBildAr, 0); end; Deshalb wunderte ich mich über das direkte erstellen auf dem PanelTop. |
AW: Imagearry wird direkt ausgegeben
Ist es so nicht korrekter oder irgendwie besser?
Delphi-Quellcode:
for i := high(PatBildAr) downto low(PatBildAr) do
PatBildAr[i].Free; SetLength(PatBildAr, 0); |
AW: Imagearry wird direkt ausgegeben
Zitat:
|
AW: Imagearry wird direkt ausgegeben
Du erstellst Bilder mit Self im Create als Parameter und setzt das PanelTop als Parent, sowie Visible := True;
Das heißt schlicht und einfach: Die Bilder sollen auf dem PanelTop angezeigt werden. Ob Du da jetzt x einzelne TImages auf das PanelTop setzt oder sie in 'nem Array verwaltest, ist dabei egal. Sollen sie nur ins Array, dann darfst Du ihnen keinen Parent zuweisen. Was passiert denn, wenn Du die von mir weiter oben gemachten Änderungen umsetzt? |
AW: Imagearry wird direkt ausgegeben
Nil war die Lösung, vielen Dank!
Auch für den Hinweis mit dem freigeben. Das bild bekomme ich dann mit img.Picture.Assign(PatBildAr[x]) wieder aus dem array mit den vorher gespeichtern settings? |
AW: Imagearry wird direkt ausgegeben
Denk an die Ressourenschutzblöcke :thumb:
Vielleicht so?
Delphi-Quellcode:
Habe aber keine Ahnung. Nur eine Vermutung.
img.Picture.Graphic := PatBildAr[x];
|
AW: Imagearry wird direkt ausgegeben
Wenn img ein TImage ist, dann entspricht das einem PatBildAr[x].
Du kannst damit kaum ein img.Picture.Assign(PatBildAr[x]) ohne Fehlermeldung hinbekommen.
Delphi-Quellcode:
könnte gehen.
img.Assign(PatBildAr[x])
Delphi-Quellcode:
eventuell auch.
img.Picture.Assign(PatBildAr[x].Picture)
Aber unklar ist eigentlich, was Du genau vorhast. Vermutlich sollen einmal x Bilder geladen werden und diese dann zu gegebener Zeit einzeln im img angezeigt werden. Fraglich ist, ob dazu die übrigen (beim erstellen von PatBildAr[x]) gemachten Einstellungen erforderlich sind, oder hier nicht eher die von img erhalten bleiben sollen. Da bei allen Bildern die gleichen Einstellungen vergeben werden, spricht irgendwie nichts gegen das einmalige Setzen der entsprechenden Werte bei img, es ändert sich doch sowieso nix mehr. Und damit stellt sich dann die Frage, ob es nicht direkt sinnvoller wäre das Array als Array of tjpegimage zu realisieren? Dann kannst Du nachher im Quelltext Deine Zeile
Delphi-Quellcode:
nutzen und sparst Dir das setzen der übrigen Attribute und die Frage: Warum werden die überhaupt angezeigt?
img.Picture.Graphic := PatBildAr[x];
Im Array müssen die Bilder ja nicht in Komponenten liegen, die zur Anzeige dienen, aber unsichtbar gemacht werden, sondern dort reicht es vollkommen aus, wenn nur die Bilder vorliegen und diese einzeln bei Bedarf an eine Anzeigekomponente übergeben werden können. |
AW: Imagearry wird direkt ausgegeben
Zitat:
|
AW: Imagearry wird direkt ausgegeben
Zitat:
Vielen Dank. |
AW: Imagearry wird direkt ausgegeben
Zitat:
|
AW: Imagearry wird direkt ausgegeben
Nein, warum?
Nicht jeder muss sich mit einer, für Dich selbstverständlichen, Vorgehensweise auskennen. Außerdem: Im Eingangspost befinden sich nur zwei Fragmente, es ist also vollkommen offen, ob sie nicht eventuell doch schon vorhanden sind, und nur (neben weiterem Quelltext) zur Verdeutlichung des eigentlichen Problemes, weggelassen wurden. |
AW: Imagearry wird direkt ausgegeben
Zitat:
|
AW: Imagearry wird direkt ausgegeben
Kann man nicht gleich eine TImageList nehmen, bietet sich die nicht dafür an?
|
AW: Imagearry wird direkt ausgegeben
Meines Wissens nach funktionieren jpegs nicht mit der TImageList.
|
AW: Imagearry wird direkt ausgegeben
Kannst du die jpegs nicht in PNG umwandeln oder liegt das nicht in deiner Macht (weil extern oder so).
|
AW: Imagearry wird direkt ausgegeben
Zitat:
|
AW: Imagearry wird direkt ausgegeben
Prinzipiell könnte ich die umwandeln, müsste dann aber wieder zurück zu jpeg wenn ich sie über TSaveDialog abspeichern will.
|
AW: Imagearry wird direkt ausgegeben
Gerade getestet, funktioniert nicht.
Die Dateifilter einer TImageList lassen kein JPEG oder JPG zu. |
AW: Imagearry wird direkt ausgegeben
Habs gerade auch gemerkt, mist... was ich rasch tat war dein vorschlag, der funktioniert.
Delphi-Quellcode:
Fürs speichern, kopiere einfach die jpg-Datei wohin auch immer.
function JPGToBitmap( const FileName: String ): TBitmap;
Var fJPG: TJPEGImage; begin fJPG := TJPEGImage.Create; try fJPG.LoadFromFile( FileName ); Result := TBitmap.Create; Result.Assign( fJPG ); except Result := nil; end; fJPG.Free; end; |
AW: Imagearry wird direkt ausgegeben
Habe das jetzt mal so umgebaut, das die jpegs direkt in ein
Delphi-Quellcode:
geladen werden.
array of TJpegimage
Nur wie bekomme ich die Bilder wieder aus dem Array? mit
Delphi-Quellcode:
funktioniert es jedenfalls nicht.
img.Picture.Graphic := PatBildAr[x];
Ich vermute das er die Größe der jpegs nicht ermitteln kann. |
AW: Imagearry wird direkt ausgegeben
Du schriebst weiter oben
Delphi-Quellcode:
, wie mag das Gegenstück dazu wohl aussehen?
PatBildAr[i].Picture.Assign(jpg);
Warum nicht einfach die gleiche Syntax, nur mit anderen Variabeln? Wenn Du doch dem Array ein Bild mit Assign zuweisen kannst, warum kannst Du dann das dort enthaltene Bild nicht mit Assign an eine andere Variabel, Komponente ..., mit identischen Eigenschaften und Methoden, zuweisen? Für mich ergäbe sich daraus irgendwie sowas:
Delphi-Quellcode:
Kodezwerg schrieb doch
img.Picture.Assign(PatBildAr[x]);
Delphi-Quellcode:
. Result ist ein TBitmap. Hat img ein Attribut vom Type TBitmap? Und hat TJpegimage Deines Arrays auch ein Attribut vom Type TBitmap? Dann sollten dies (z. B. per Assign) zuweisbar sein.
Result.Assign( fJPG );
|
AW: Imagearry wird direkt ausgegeben
Ja, soweit verständlich. Nur bekomme ich mit
Delphi-Quellcode:
den Jpeg-Fehler #42.
img.Picture.Assign(PatBildAr[x]);
|
AW: Imagearry wird direkt ausgegeben
Also in meinem kleinen Feldtest habe ich eine TImageList mit TBitmaps gefüllt die von JPGToBitmap geliefert wurden.
Im nach-hinein nur noch mit der ImageList gespielt ohne Nennenswerte Besonderheiten festgestellt zu haben. |
AW: Imagearry wird direkt ausgegeben
Kann die TImagelist nicht nur gleichgroße Bilder speichern? Oder auch Originalgröße des jpegs resp. bitmaps.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:04 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