Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi TnTImage -> Welche Bildformate unterstützt? (https://www.delphipraxis.net/193164-tntimage-welche-bildformate-unterstuetzt.html)

DualCoreCpu 28. Jun 2017 20:27

TnTImage -> Welche Bildformate unterstützt?
 
Hallo,

ich will mit einen Bildbetrachter bauen, wo ich die Reihenfolge der Bilder vorher durch Verschieben in eine TListView festlege. Ich habe dazu als Imagekomponente die TntImage ausgewählt, weil die Delphi-Timage Komponente nur Bitmaps unterstützt, zumindest in meinem Turbo Delphi 2006. Ich weiß zwar vom Download der kostenlosen Delphi Starter Edition, die habe ich auch runter geladen, nur noch nicht installiert.

Welche bildformate unterstützt nun die TntImage-Komponente. Ich brauche .jpg

Ich erhalte aber beim Verschieben vom Windows Exploerer in meine TListview eine Exception mit der Meldung unbekanntes Datenformat.

Ich nehme keine Typumwandlungen vor. Ich übergebe mein TntImage an Listview.Items.Item[Listview.Items.Count-1] := MyTntImage;

Ist das vielleicht auch die Ursache.

Wenn ja, wie muss ich den Quellcode formulieren, damit ich in der Listview mein Bild erhalte?

Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  ShellAPI, Dialogs, ExtCtrls, StdCtrls, Menus, ExtDlgs, ComCtrls, TntExtCtrls;

type
  TForm1 = class(TForm)
    PictureDialog: TOpenPictureDialog;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Bildladen1: TMenuItem;
    Beenden1: TMenuItem;
    PictureList: TListView;
    Memo: TMemo;
    Image: TTntImage;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Bildladen1Click(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure MemoDragDrop(Sender, Source: TObject; X, Y: Integer);
  protected
    procedure WMDROPFILES (var Msg: TMessage); message WM_DROPFILES;
  private
    { Private-Deklarationen }
    FFileName: String;
    FFileList: TStrings;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Beenden1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.Bildladen1Click(Sender: TObject);
var Picture: TBitmap;
begin
  //Zusätzlich zum Verschieben mit Maus normales Laden per Dateidialog
  if PictureDialog.Execute then
  begin
    FFileName := PictureDialog.FileName;
    {
    Picture := TBitmap.Create;
    Picture.LoadFromFile(FFileName);
    }
    Image.Picture.LoadFromFile(FFileName);
    FFileList.AddObject(FFileName,Image);
    Memo.Lines.Add(FFilename);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FFileList := TStringList.Create;
  DragAcceptFiles(Form1.Handle, true);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FFileList.Free;
end;

procedure TForm1.MemoDragDrop(Sender, Source: TObject; X, Y: Integer);
var Msg: TMessage;
begin
{
  Msg.WParamLo := X;
  Msg.WParamHi := y;
  WmDropFiles(Msg);
  }
end;

procedure TForm1.WMDROPFILES(var Msg: TMessage);
var
  Picture   : TBitmap;
  size,i    : integer;
  Dateiname : PChar;
var
  Img       : TTntImage;
  Item      : TListItem;
begin
    size := DragQueryFile(Msg.WParam, i , nil, 0) + 1;
    Dateiname:= StrAlloc(size);
    DragQueryFile(Msg.WParam,i , Dateiname, size);
    //ShowMessage(StrPas(Dateiname));
    //DragQueryFile übernimmt den Dateinamen
    //Datei wird dann in Picture Objekt übernommen
    //Picture := TBitmap.Create;
    //Picture.LoadFromFile(StrPas(Dateiname));

    Image.Picture.LoadFromFile(FFileName);

    FFileList.AddObject(StrPas(Dateiname),Image);
    Memo.Lines.Add(FFileList.Strings[FFileList.Count-1]);

    Item := PictureList.Items.Add;
    Item.Data := Image.Picture;
    PictureList.Items.Item[PictureList.Items.Count-1].Data := Item.Data;

// Muss ich evtl noch Typumwandlungen vornehmen, wenn ja wie?
// oder wird das .jpg Format auch von TntImage einfach nicht unterstützt?

    StrDispose(Dateiname);

    DragFinish(Msg.WParam);
end;

end.

Pfaffe 29. Jun 2017 06:48

AW: TnTImage -> Welche Bildformate unterstützt?
 
Unit jpeg fehlt in uses
Probiere mal Listview.Items.Item[Listview.Items.Count-1].assign(MyTntImage);

Bernhard Geyer 29. Jun 2017 07:51

AW: TnTImage -> Welche Bildformate unterstützt?
 
Zitat:

Zitat von DualCoreCpu (Beitrag 1375566)
... weil die Delphi-Timage Komponente nur Bitmaps unterstützt

Die Delphi Image-Componente unterstützt alle Formate die sich als Zeichenformat registrieren.
Sind keine Units (z.B. jpeg) eingebunden dann nur BMP. Ansonsten unterstützt Delphi JPEG, PNG, GIF und BMP.
Es gibt auch Zusatzkomponenten welche diese Liste auf "Exotische" Bildformate erweitern.

DualCoreCpu 30. Jun 2017 10:04

AW: TnTImage -> Welche Bildformate unterstützt?
 
Zitat:

Zitat von Pfaffe (Beitrag 1375582)
Unit jpeg fehlt in uses
Probiere mal Listview.Items.Item[Listview.Items.Count-1].assign(MyTntImage);

Danke, dieses Konstrukt funktioniert! :-D

DualCoreCpu 1. Jul 2017 08:21

AW: TnTImage -> Welche Bildformate unterstützt?
 
Leider muss ich noch mal nerven. Ich erhalte beim Drag eine EAccessViolation an dieser Stelle:

Delphi-Quellcode:
    FFileName := String(Dateiname);
    Image.Picture.LoadFromFile(FFileName); //Hier Knallt es! Warum????
Bin mir gar nicht mehr so sicher, ob sich die Installation der, wenn auch kostenlosen, Delphi Starter wirklich lohnt. Exceptions dieser Art bekomme ich ja wohl dort genauso.

Das wäre ein Feature Request. Der Compiler möge in solcher oder ähnlicher Situation den Code so erzeugen, dass er läuft. Heißt, die nötigen Datenformatanpassungen erkennen und vornehmen.

nahpets 1. Jul 2017 11:16

AW: TnTImage -> Welche Bildformate unterstützt?
 
Könntest Du uns bitte die Fehlermeldung "spendieren".

Einfach im Fehlerdialog Strg+C drücken und dann hier per STRG+V zwischen Code-Tags einfügen.

So ist die Fehlerbeschreibung etwas dürftig.

Die erste Vermutung wäre mal, das Image nicht inizialisiert ist. Dann käme ein EAccessViolation.

Ansonsten poste bitte mal etwas mehr vom Quelltext vor der Fehlerstelle.

Oder BreakPoint vor die fehlerhafte Stelle und dann schrittweise durchgehen, bis zur konkreten Fehlerstelle. Eventuell kann man dann da etwas besser erkennen, wo die Fehlerursache liegen könnte.

hoika 1. Jul 2017 12:14

AW: TnTImage -> Welche Bildformate unterstützt?
 
Hallo,
Delphi-Quellcode:
Ich erhalte beim Drag eine EAccessViolation an dieser Stelle:
Die zwei Zeilen sind zu wenig.
Poste die ganze OnAccept-Methode.
Der TypeCast auf String sieht schon sehr verdächtig aus.

DualCoreCpu 1. Jul 2017 15:58

AW: TnTImage -> Welche Bildformate unterstützt?
 
Zitat:

Zitat von hoika (Beitrag 1375766)
Hallo,
Delphi-Quellcode:
Ich erhalte beim Drag eine EAccessViolation an dieser Stelle:
Die zwei Zeilen sind zu wenig.
Poste die ganze OnAccept-Methode.
Der TypeCast auf String sieht schon sehr verdächtig aus.

Oh, das hab ich noch gar nicht. Nur wie oben im Ersten Post zu sehen, die WMDROPFILES Methode, die letzlich eine Windows Message absetzt.

Wie sähe der Quellcode innerhalb der DragAccept Methode aus? Wäre der so viel anders?

DualCoreCpu 1. Jul 2017 20:31

AW: TnTImage -> Welche Bildformate unterstützt?
 
Zitat:

Zitat von nahpets (Beitrag 1375765)
Könntest Du uns bitte die Fehlermeldung "spendieren".

Up's, wie kann ich detailliertere Fehlermeldungen in Turbo Delphi 2006 einstellen? Ich habe alles auf Standard.

Zitat:

Zitat von nahpets (Beitrag 1375765)
Einfach im Fehlerdialog Strg+C drücken und dann hier per STRG+V zwischen Code-Tags einfügen.

Das weiß ich.

Zitat:

Zitat von nahpets (Beitrag 1375765)
So ist die Fehlerbeschreibung etwas dürftig.

Wenn ich bloß wüsste, wie ich eine datailliertere Fehlermeldung erhalte. Kann ich das in der IDE irgendwo einstellen. (Turbo Delphi 2006) Portable Version.
Kann Windows 10 .NET in der von Turbo Delphi verlangten Version, ohne dazu die Preregs mit installieren zu müssen? (Falls die detaillierteren Fehlermeldungen nur in der zusammen mit .NET installierten Version verfügbar sein sollten, wie das auch mit der integrierten Hilfe der Fall ist. Hätte aber noch Delphi 7 Personal.

Zitat:

Zitat von nahpets (Beitrag 1375765)
Die erste Vermutung wäre mal, das Image nicht inizialisiert ist. Dann käme ein EAccessViolation.

Dachte ich auch gerade, aber Image ist per FormDesigner und Komponentenpalette auf das Formular geklickt. Kann es denn da immer noch sein, dass die Kompo dann nicht korrekt initialisiert ist?

Welche Kompos betrifft das generell, wenn es das ist?

Zitat:

Zitat von nahpets (Beitrag 1375765)
Ansonsten poste bitte mal etwas mehr vom Quelltext vor der Fehlerstelle.

Oben im ersten Post ist der gesamte Quelltext. Ein angepasstes Drag/Drop Beispiel aus dem Delphi Kochbuch von Elmar Warken. Image und ListView habe ich dann hinzugefügt. Auch das TMemo. Habe mir faktisch das Beispiel aus dem Buch für meine Zwecke angepasst.

Zitat:

Zitat von nahpets (Beitrag 1375765)
Oder BreakPoint vor die fehlerhafte Stelle und dann schrittweise durchgehen, bis zur konkreten Fehlerstelle. Eventuell kann man dann da etwas besser erkennen, wo die Fehlerursache liegen könnte.

Das ist zumindest ein Versuch Wert.

nahpets 1. Jul 2017 20:39

AW: TnTImage -> Welche Bildformate unterstützt?
 
Mir würde eigentlich erstmal die Fehlermeldung reichen, die Du bekommst, wenn Du das Programm einfach mal so startest, egal, ob die nun detailreich ist oder nicht. Nur das, was auch der Anwender zu sehen bekommen würde, wenn er das Programm startet und dann der Fehler auftritt.

DualCoreCpu 2. Jul 2017 11:22

AW: TnTImage -> Welche Bildformate unterstützt?
 
Zitat:

Zitat von nahpets (Beitrag 1375778)
Mir würde eigentlich erstmal die Fehlermeldung reichen, die Du bekommst, wenn Du das Programm einfach mal so startest, egal, ob die nun detailreich ist oder nicht. Nur das, was auch der Anwender zu sehen bekommen würde, wenn er das Programm startet und dann der Fehler auftritt.

Erste Gelegenheit für Exception bei $75C0A9F2. Exception-Klasse EInvalidGraphic mit Meldung 'Unbekannte Bilddateierweiterung (.)'. Prozess imgdrag.exe (924)

Dies, nachdem ich den Quelltextabschnitt meines ersten Post wie folgt geändert habe:

Delphi-Quellcode:
    [B]if not Assigned(Image) then Image := TImage.Create(self);
[/B]  
//So bleibt die vorherige EAccessViolation fern.
//Hatte vorausgesetzt, dass eine Komponente, die auf das Formular
//geklickt wurde, auch automatisch erzeugt wird
//Die Fehlermeldung sagt da nur "Lesen von Adresse .... "
    FFileName := String(Dateiname);
    Image.Picture.LoadFromFile(FFileName);
//In der darunter stehenden Zeile kommt nun die oben genannte Exception
    FFileList.AddObject(StrPas(Dateiname),Image);
//---------------------------------------------------------------------
    Memo.Lines.Add(FFileList.Strings[FFileList.Count-1]);

    PictureList.Items.Item[PictureList.Items.Count-1].assign(Image);
    //PictureList.Items.Item[PictureList.Items.Count-1].Data := Item.Data;
sonstiger Quellcode, siehe oben, erster Post!

Ich dachte, die Image-Komponente unterstütze ALLE Bildformate. Die Exception kommt auch bei .bmp Dateien. Habe zum Test eine .bmp Datei verwendet, von der ein in .jpg umgewandeltes Pendant existiert. Habe alles auf die Verwendung ausschließlich der Image Komponente zurück geändert.

Die Unit jpeg ist eingebunden.

nahpets 2. Jul 2017 12:04

AW: TnTImage -> Welche Bildformate unterstützt?
 
In der Fehlermeldung steht
Code:
'Unbekannte Bilddateierweiterung (.)'
Hier würde ich zuerst einmal den Dateinamen überprüfen, es scheint so, als könnte die Dateiendung, die zur Erkennung des Bildtypes herangezogen wird, nicht korrekt erkannt werden.

Eine Komponente, die man in der IDE auf ein Formular pappt, wird automatisch erstellt.

Wenn Image eine derartige Komponente ist, sollte diese Abfrage nicht erforderlich sein.

Delphi-Quellcode:
if not Assigned(Image) then Image := TImage.Create(self);


Wenn aber doch, so wird die Komponente auf dem Formular irgendwo (irrtümlich?) freigegeben.

Aus dem bisher bekannten Quelltext lässt sich das aber nicht erkennen.

Schau bitte zuerst mal nach, was hier
Delphi-Quellcode:
FFileName := String(Dateiname);
herauskommt. Ist das ein gültiger Dateiname mit vollständigem Pfad und Dateiendung?

DualCoreCpu 2. Jul 2017 16:49

AW: TnTImage -> Welche Bildformate unterstützt?
 
Danke @nahpets, Der Dateiname war die Ursache der Exception.

Ein Teilproblem ist somit gelöst! :love:

Ein Fall für DUnit! Das aber wird ein gesonderter Strang.

Nun aber macht diese Zeile Schwierigkeiten. Warum das nun wieder?

Delphi-Quellcode:
PictureList.Items.Item[PictureList.Items.Count-1].assign(Image);
Diese Zeile bringt dieselbe Exception:

EAccessViolation -> Zugriffsverletzung bei Adresse ...

Delphi-Quellcode:
PictureList.Items.Item[PictureList.Items.Count-1].Data := Image.Picture
Wie also muss ich das Bild zuweisen? :wall:

Picturelist ist meine TListView.

nahpets 2. Jul 2017 18:33

AW: TnTImage -> Welche Bildformate unterstützt?
 
Erste Frage: Gibt es das?
Delphi-Quellcode:
PictureList.Items.Item[PictureList.Items.Count-1]
Vor der Zuweisung prüfen, ob PictureList.Items.Count größer 0 ist.

DualCoreCpu 3. Jul 2017 08:58

AW: TnTImage -> Welche Bildformate unterstützt?
 
Zitat:

Zitat von nahpets (Beitrag 1375817)
Erste Frage: Gibt es das?
Delphi-Quellcode:
PictureList.Items.Item[PictureList.Items.Count-1]
Vor der Zuweisung prüfen, ob PictureList.Items.Count größer 0 ist.

Ok, danke. War nicht größer als 0.

Wenn ich aber stattdessen den Index auf PictureList.Items.Count setze, erhalte ich die gleiche Exception. Warum das, Ich sollte doch an das Nullte Element zuweisen können.

Habe außerdem folgendes getestet:


Delphi-Quellcode:
PictureList.Items.Item.assign(Image.Picture.bitmap);
Hier wird der Index wird jedoch vom Compiler verlangt

Delphi-Quellcode:
    PictureList.Items.assign(Image.Picture.bitmap);
Hier wird eine EConvertError-Exception geworfen. Meldung:

TBitmap kann nicht zu TlistItems zugewiesen werden

Wie kriege ich denn da ein Bild in die ListView??? :wall:

haentschman 3. Jul 2017 09:22

AW: TnTImage -> Welche Bildformate unterstützt?
 
Hallöle...:P
Ich zeige dir mal ein Beispiel wie ich Icons in die Liste bekomme. Du mußt es auf deine Gegebenheiten anpassen. :zwinker:
1. das SubItem muß bestehen auch wenn es leer = '' ist
2. Im CustomDrawSubItem zeichnest du es.
Hinweis: Um die Freigabe des Images mußt du dich eventuell selbst kümmern. (OnDeletion)
Delphi-Quellcode:
procedure TfrPreferences.ShowList(aList: TListEmployee);
var
  Item: TListItem;
  Employee: TEmployee;
  LastIndex: Integer;
begin
  lvEmployees.BeginUpdate;
  try
    lvEmployees.Items.Clear;
    for Employee in aList do
    begin
      if Employee.State <> ddsDeleted then
      begin
        Item := lvEmployees.Items.Add;
        Item.Data := Employee;
        Item.SubItems.Add(Employee.Name);
        Item.SubItems.Add(Employee.FirstName);
        Item.SubItems.Add(Employee.PersonalNumber);
        Item.SubItems.Add(IntToStr(Integer(Employee.Active)));
        Item.ImageIndex := dmSmall.GetIconDataState(Employee.State); // Standard Image der ersten Spalte
      end;
    end;
  finally
    lvEmployees.Sort;
    lvEmployees.EndUpdate;
  end;
end;

procedure TfrPreferences.lvEmployeesCustomDrawSubItem(Sender: TCustomListView; Item: TListItem; SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  aRect: TRect;
  aIcon: TIcon;
begin
  if SubItem > 3 then
  begin
    aIcon := TIcon.Create;
    try
      DefaultDraw := False;
      ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @aRect);
      case SubItem of // 4.SubItem
        4:
          begin
            dmCommon.GetIconActive(TEmployee(Item.Data).Active, aIcon); // Laden Icon => aIcon hält das Bild
          end;
      end;
      Sender.Canvas.Draw(aRect.Left + ((aRect.Right - aRect.Left - aIcon.Width) div 2), aRect.Top, aIcon); // anzeigen
    finally
      aIcon.Free;
    end;
  end;
end;

DualCoreCpu 3. Jul 2017 15:06

AW: TnTImage -> Welche Bildformate unterstützt?
 
Danke, @haentschman, ich werde mich damit auseinandersetzen und melde mich dann wieder. Hoffentlich mit einer Erfolgsmeldung.

Vielleicht ergeben sich ja auch Fragen zu diesem Quelltext.

DualCoreCpu 4. Jul 2017 19:39

AW: TnTImage -> Welche Bildformate unterstützt?
 
Danke @nahpets und @haentschman wie verrückt. So funktioniert das nun so wie ich es haben wollte.

:hello:

DualCoreCpu 5. Jul 2017 09:48

AW: TnTImage -> Welche Bildformate unterstützt?
 
Moderatoren: Bitte Beitrag #17 löschen! Doppelposting + nicht alle Helfer zum Dank angesprochen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 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