Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Imagearry wird direkt ausgegeben (https://www.delphipraxis.net/198830-imagearry-wird-direkt-ausgegeben.html)

Janninger 3. Dez 2018 16:22

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:
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;
Vielen Dank im voraus.

Grüße vom Janninger

KodeZwerg 3. Dez 2018 16:56

AW: Imagearry wird direkt ausgegeben
 
PatBildAr[].Visible := true; vielleicht überdenken?

DieDolly 3. Dez 2018 17:00

AW: Imagearry wird direkt ausgegeben
 
Vielleicht solltest du auch an Ressourcenschutzblöcke denken.

Delphi.Narium 3. Dez 2018 17:11

AW: Imagearry wird direkt ausgegeben
 
Delphi-Quellcode:
  PatBildAr[i] := timage.Create(self); // Damit wird das Image auf Self (ermutlich ein Formular?)
  PatBildAr[i].Parent := PanelTop; // und das PanelTop gelegt.
eventuell:
Delphi-Quellcode:
  PatBildAr[i] := timage.Create(nil);
  PatBildAr[i].Parent := nil;
In dem Fall darf aber (zu einem späteren Zeitpunkt, bei Programmende ...) die Freigabe der Bilder im Array nicht vergessen werden.

Eventuell aber auch
Delphi-Quellcode:
PatBildAr[i].Visible := false;
Visible erst dann auf True setzen, wenn die Anzeige erfolgen soll und wieder auf False, wenn keine Anzeige mehr erfolgen soll.

Janninger 3. Dez 2018 17:16

AW: Imagearry wird direkt ausgegeben
 
Das array gebe ich über Form.Destroy frei.

Delphi-Quellcode:
procedure TForm6.FormDestroy(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to high(PatBildAr) do
    PatBildAr[i].Free;
  SetLength(PatBildAr, 0);
end;
Mein Gedanke war, das die Images nur ins Array geladen werden und bei Bedarf von dort über assign wieder geladen werden.
Deshalb wunderte ich mich über das direkte erstellen auf dem PanelTop.

DieDolly 3. Dez 2018 17:18

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);

Janninger 3. Dez 2018 17:21

AW: Imagearry wird direkt ausgegeben
 
Zitat:

Zitat von DieDolly (Beitrag 1420002)
Ist es so nicht korrekter oder irgendwie besser?
Delphi-Quellcode:
 for i := high(PatBildAr) downto low(PatBildAr) do
  PatBildAr[i].Free;
 
 SetLength(PatBildAr, 0);

Definitiv besser.

Delphi.Narium 3. Dez 2018 17:24

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?

Janninger 3. Dez 2018 17:30

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?

DieDolly 3. Dez 2018 17:32

AW: Imagearry wird direkt ausgegeben
 
Denk an die Ressourenschutzblöcke :thumb:

Vielleicht so?
Delphi-Quellcode:
img.Picture.Graphic := PatBildAr[x];
Habe aber keine Ahnung. Nur eine Vermutung.

Delphi.Narium 3. Dez 2018 17:52

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:
img.Assign(PatBildAr[x])
könnte gehen.
Delphi-Quellcode:
img.Picture.Assign(PatBildAr[x].Picture)
eventuell auch.

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:
img.Picture.Graphic := PatBildAr[x];
nutzen und sparst Dir das setzen der übrigen Attribute und die Frage: Warum werden die überhaupt angezeigt?

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.

Redeemer 3. Dez 2018 17:58

AW: Imagearry wird direkt ausgegeben
 
Zitat:

Zitat von DieDolly (Beitrag 1419998)
Vielleicht solltest du auch an Ressourcenschutzblöcke denken.

Was fürn Ding?

Janninger 3. Dez 2018 17:58

AW: Imagearry wird direkt ausgegeben
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1420008)
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:
img.Assign(PatBildAr[x])
könnte gehen.
Delphi-Quellcode:
img.Picture.Assign(PatBildAr[x].Picture)
eventuell auch.

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:
img.Picture.Graphic := PatBildAr[x];
nutzen und sparst Dir das setzen der übrigen Attribute und die Frage: Warum werden die überhaupt angezeigt?

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.

Genau so hatte ich mir das gedacht. So kann ich einfach im Arrayindex hin und herspringen ohne das Bild immer neu aus dem Blobstream zu laden.
Vielen Dank.

DieDolly 3. Dez 2018 19:06

AW: Imagearry wird direkt ausgegeben
 
Zitat:

Zitat von Redeemer (Beitrag 1420009)
Zitat:

Zitat von DieDolly (Beitrag 1419998)
Vielleicht solltest du auch an Ressourcenschutzblöcke denken.

Was fürn Ding?

Ist das jetzt ironisch gemeint?

Delphi.Narium 3. Dez 2018 19:19

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.

DieDolly 3. Dez 2018 19:21

AW: Imagearry wird direkt ausgegeben
 
Zitat:

Nicht jeder muss sich mit einer, für Dich selbstverständlichen, Vorgehensweise auskennen.
Das ist nicht für mich selbstverständlich. Das sollte aber für jeden selbstverständlich sein. Ist ja nicht so, dass es grundlegend zur Delphilanguage gehört :roll:

KodeZwerg 3. Dez 2018 19:23

AW: Imagearry wird direkt ausgegeben
 
Kann man nicht gleich eine TImageList nehmen, bietet sich die nicht dafür an?

Janninger 3. Dez 2018 19:42

AW: Imagearry wird direkt ausgegeben
 
Meines Wissens nach funktionieren jpegs nicht mit der TImageList.

DieDolly 3. Dez 2018 20:20

AW: Imagearry wird direkt ausgegeben
 
Kannst du die jpegs nicht in PNG umwandeln oder liegt das nicht in deiner Macht (weil extern oder so).

KodeZwerg 3. Dez 2018 20:26

AW: Imagearry wird direkt ausgegeben
 
Zitat:

Zitat von Janninger (Beitrag 1420023)
Meines Wissens nach funktionieren jpegs nicht mit der TImageList.

Binde Unit JPEG ein und es sollte auch dieses Format unterstützt werden soweit ich weiß.

Janninger 3. Dez 2018 20:26

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.

DieDolly 3. Dez 2018 20:29

AW: Imagearry wird direkt ausgegeben
 
Gerade getestet, funktioniert nicht.
Die Dateifilter einer TImageList lassen kein JPEG oder JPG zu.

KodeZwerg 3. Dez 2018 20:35

AW: Imagearry wird direkt ausgegeben
 
Habs gerade auch gemerkt, mist... was ich rasch tat war dein vorschlag, der funktioniert.
Delphi-Quellcode:
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;
Fürs speichern, kopiere einfach die jpg-Datei wohin auch immer.

Janninger 4. Dez 2018 00:26

AW: Imagearry wird direkt ausgegeben
 
Habe das jetzt mal so umgebaut, das die jpegs direkt in ein
Delphi-Quellcode:
array of TJpegimage
geladen werden.
Nur wie bekomme ich die Bilder wieder aus dem Array?

mit
Delphi-Quellcode:
img.Picture.Graphic := PatBildAr[x];
funktioniert es jedenfalls nicht.
Ich vermute das er die Größe der jpegs nicht ermitteln kann.

Delphi.Narium 4. Dez 2018 11:09

AW: Imagearry wird direkt ausgegeben
 
Du schriebst weiter oben
Delphi-Quellcode:
PatBildAr[i].Picture.Assign(jpg);
, wie mag das Gegenstück dazu wohl aussehen?

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:
img.Picture.Assign(PatBildAr[x]);
Kodezwerg schrieb doch
Delphi-Quellcode:
Result.Assign( fJPG );
. 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.

Janninger 4. Dez 2018 12:45

AW: Imagearry wird direkt ausgegeben
 
Ja, soweit verständlich. Nur bekomme ich mit
Delphi-Quellcode:
img.Picture.Assign(PatBildAr[x]);
den Jpeg-Fehler #42.

KodeZwerg 4. Dez 2018 13:44

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.

Janninger 4. Dez 2018 13:55

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:27 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