Mehrere Bilder gleichzeitig darstellen



  • Servus Leute,
    ich will mehrere Bilder gleichzeitig darstellen. Die Bilder liegen in verschiedenen Verzeichnissen. Es sollte im Endefekt so ähnlich aussehen wie bei Windows die "Miniaturansicht", auch mit mehreren Spalten. So das ich, wenn es relativ viele Bilder sind, durchscrollen kann. Wenn ein Bild angeklickt wird sollte ich den Pfad ermitteln können. So, ich weis aber nicht wie das angehen soll, welche Komponenten benötige ich dafür?
    Bin fürjeden Tip dankbar.

    MfG
    Basti

    P.S.
    Borland C++ Builder 5 Professional
    Windows 2000



  • Hi Basti,

    wenn ich dich richtig verstanden habe, willst du eine Ansicht von Bilddateien eines Ordners haben, jedoch sollen auch Unterordner mit berücksichtigt werden.

    Mit FindFirstFile und FindNextFile kannst du Rekursiv einen Ordner und seine Unterordnung nach bestimmten Dateien durchsuchen. Diese Dateien kannst du dann wie gewohnt in dein Image Feld anzeigen lassen, bzw. bei Dateiformaten die TImage nicht unterstützt auf eine andere Komponente verweisen.

    Die Image Felder würde ich dynamisch auf der TScrollBox ablegen, bzw. eine ListView nehmen.

    Viel Erfolg.

    Philipp



  • wenn ich dich richtig verstanden habe, willst du eine Ansicht von Bilddateien eines Ordners haben, jedoch sollen auch Unterordner mit berücksichtigt werden.

    Nein, ich gebe eine Liste von Bildern vor.

    Meinst du mit ImageFeld die TImage Kompo? D.h. ich muss für jedes Bild ein TImage erstellen und das dann in einem TListView abelgen? Geht das? Gibt es da nicht ne andere Lösung?

    MfG
    Basti



  • OK, ich habe es jetzt mit einer ImageList und ListView soweit gelöst das ich Bitmaps darstellen kann. Wenn ich nun aber jpgs darstellen will, wie mach ich das?



  • Hallo Basti,

    bei einer ImageList können die Bilder meines Wissens nicht beliebig groß sein. Bin mir da nicht ganz sicher.

    Soweit ich weiß gibt es beim C++ Builder zumindest eine Klasse die man einbinden kann um GIF Dateien anzuzeigen.

    Bei JGP bin ich mir nicht sicher ob das geht, da kann man im Notfall auch ne andere Klasse nutzen.

    Ich würde jedoch TImage nehmen und keine ImageList.

    Philipp



  • Wenn ich das mit TImage und ScrollBox mache dann muss ich halt die Bilder selber anordnen... Das macht mir ListView automatisch. Aber wenns nicht anderst geht, naja.

    Danke

    Basti



  • Hi Basti,

    das ist eigentlich egal ob du Scrollbox oder ListView nimmst. Bei ScrollBox ist es nur eine kleine Berechnung, mit dem Anlegen der Objekte.

    Du schaffst das schon.

    Philipp



  • Hi B@asti

    Du willst sowas wie 'ne Thumbnail- Uebersicht - beliebig viele Bilder in gleicher Groese darstellen mit Scrollfunktion?

    Das mach ich so:

    1: von TPanel ne Kompo (Klasse) ableiten = TImagePanel
    -- In der Kompo liegt (dynamisch in CTor erzeugt) ein TImage
    -- Funktion definieren LoadFromFile, womit 'ne Bilddatei in das Image
    -- geladen wird in TImage. Skalierung proportional berechnet!!!
    -- Das TImage wird passend zu Bildproportionen in Panel 'eingepasst'
    -- Der komplette Dateinamen wird in Property von TImagePanel gespeichert.

    2: von TScrollBox ne Kompo ableiten = TMultiImageScroller
    -- Property fuer Zeilen und Spaltenanzahl (int)
    -- Funktion definieren LoadFromFileList mit Parameter TSringList fuer
    -- die Dateinamen!
    -- Fuer jede Datei (Namen) wird ein TImagePanel erzeugt, Groese berechnet
    -- und in ScrollBox positioniert
    -- LoadFromFile des TImagePanel ausfuehren fuer Anzeige.
    -- Die Anordnung Zeilen / Spaltenweise gemaess Property Zeile / Spaltenanzahl

    Mit den zwei gekoppelten Kompos haste ne Flexible, scrollbare Anzeige fuer beliebig viele Bilder (je nach RAM). geht bei mir mit hunderten Bildern.

    Kritisch ist nur die Skalierung im TImagePanel (Sch****- Rechnerei!)



  • Danke, 🙂
    gute Antwort. Ob ich das hin bekomme?
    Mal sehen.

    MfG
    Basti



  • Hmm, ich bekomm das irgendwie nicht hin. Ich weis ehrlich nicht mal wie ich das richtig angehen soll. Hast du mir vielleicht ein kleines Bsp. oder so?

    MfG
    Basti



  • Hi B@asti

    Wo klemmt's genau?

    Beim TImagePanel oder TMultiImageScroller?

    PS: Ich such mal was 'raus. Kann etwas dauern, ist 'ne grosse Kompo- Sammlung.



  • Probier mal das aus:

    Klasse TImagePanel zum Laden und Anzegen EINES Bitmap- Bildes aus Datei (.BMP)

    Header- Datei:
    
    //---------------------------------------------------------------------------
    class PACKAGE TImagePanel : public TCustomPanel
    {
    private:
    protected:
      AnsiString FFName;
    public:
      TImage *FImage;
                   __fastcall TImagePanel(TComponent* Owner);
                   __fastcall ~TImagePanel(void);
            void __fastcall LoadFromFile(AnsiString FName);
      __property AnsiString FName={read=FFName,nodefault} ;
    __published:
    };
    //---------------------------------------------------------------------------
    
    CPP- Datei:
    //---------------------------------------------------------------------------
    // ValidCtrCheck wird benutzt, um sicherzustellen, daß die erzeugten Komponenten keine
    // rein virtuellen Funktionen haben.
    //
    static inline void ValidCtrCheck(TImagePanel *)
    { new TImagePanel(NULL);
    }
    //---------------------------------------------------------------------------
    __fastcall TImagePanel::TImagePanel(TComponent* Owner)
            : TCustomPanel(Owner)
    { FImage=new TImage(this);
      FImage->Parent=this;
      FImage->Enabled=false;
      FImage->AutoSize=true;
    }
    //---------------------------------------------------------------------------
    __fastcall TImagePanel::~TImagePanel(void)
    { delete FImage;
    }
    //---------------------------------------------------------------------------
    void __fastcall TImagePanel::LoadFromFile(AnsiString FName)
    { Graphics::TPicture *Pic;
      float Zoom;
      FFName=FName;
      {
        FImage->AutoSize=false;
        FImage->Stretch=true;
        try
        {
          Pic=new Graphics::TPicture;
          try
          {
            Pic->LoadFromFile(FName);
            FImage->Hint="";
            if ((float (ClientWidth-2) / float (Pic->Width))<(float (ClientHeight-2) / float (Pic->Height)))
            {
              Zoom=float (ClientWidth-2) / float (Pic->Width);
            }
            else
            {
              Zoom=float (ClientHeight-2) / float (Pic->Height);
            }
            FImage->Width=Pic->Width * Zoom;
            FImage->Height=Pic->Height * Zoom;
            FImage->Left=(ClientWidth-FImage->Width) / 2;
            FImage->Top=(ClientHeight-FImage->Height) / 2;
            FImage->Picture->Assign(0);
            FImage->Canvas->StretchDraw(FImage->ClientRect,Pic->Graphic);
            FImage->Left=(ClientWidth-FImage->Width) / 2;
            FImage->Top=(ClientHeight-FImage->Height) / 2;
          }
          catch(...)
          {
            FFName="";
            Zoom=0;
          }
          delete Pic;
        }
        catch(...)
        {
          FFName="";
          Zoom=0;
        }
      }
    }
    //---------------------------------------------------------------------------
    

    PS: Da koennten 'n paar ueberfluessige Teile d'rin sein! Ist aus einer komplexeren Kompo 'rausgezerrt!



  • Danke schön 🙂 Ich schau es mir mir mal an und hoffe das es was wird. Was muss ich denn noch beachten und wie verwende ich die Klasse/Kompo dann?

    MfG
    Basti



  • Hi B@asti

    Zum Testen:

    Fueg einfach die zwei Teile in die .h und .cpp Datei Der Form des Programms ein.
    (vor den Header der Form!)

    in privat der Form:
    TImagePanel *IP;

    in OnCreate der Form:
    IP=new TImagePanel(this);
    IP->Parent=this;

    in OnDestroy
    delete IP;

    IRGENDWO:

    IP->LoadFromFile("Name der Datei.bmp");

    Voila :p

    PS: Position und Groese des Panel vor Laden einstellen!

    Wenn Du das in richtige Package machst, gehts noch einfacher mit der IDE! Kannste aber spaeter auch noch.



  • Hallo Altenburger,

    ich habe desehen dass du da ein schönes Beispiel gegegeben hast. ich hatte mal mit einem ähnlichen problem zu tun. nun habe ich folgende zeile bei dir gesehen:

    class PACKAGE TImagePanel : public TCustomPanel

    Mir ist aufgefallen, das du PACKAGE verwendest hast. dies hatte ich nicht gemacht. wofür steht das eigentlich, was bringt mir das?

    simon



  • Das Programm lässt sich starten, im Eck habe ich auch das Pannel aber wenn ich dann den Button klicken der "IP->LoadFromFile("IP.bmp");" aufruft bekomme ich eine Zugriffsverletzung im Modul vcl50.bpl. Woran liegt denn das?

    MfG
    Basti



  • @Simon maas

    ka!!!

    Das macht der Compiler 'rein, wenn ich ne Komponente in 'ner Package erstelle!

    Das ist ein Auszug aus 'ner Package!!! Wenn du das so im Projekt machst, brauchste die Angabe nicht

    @B@sti
    Was fuer 'nen Fehler genau? Das angegebene Bild muss gueltig sein - auf Festplatte existieren!

    Lass mal schrittweise ablaufen! Bei welchem Befehl hauts den raus?

    PS: Der Dateiname muss mit kompletten Pfad angegeben sein!!!

    [ Dieser Beitrag wurde am 23.05.2003 um 13:45 Uhr von DerAltenburger editiert. ]



  • Keine Ahnung was ich falsch gemacht hatte, aber jetzt funktioniert es 😉
    Danke

    MfG
    Basti



  • Tja, leider reichen mir meine C++ Kenntnisse incht aus um den Part 2

    2: von TScrollBox ne Kompo ableiten = TMultiImageScroller
    -- Property fuer Zeilen und Spaltenanzahl (int)
    -- Funktion definieren LoadFromFileList mit Parameter TSringList fuer
    -- die Dateinamen!
    -- Fuer jede Datei (Namen) wird ein TImagePanel erzeugt, Groese berechnet
    -- und in ScrollBox positioniert
    -- LoadFromFile des TImagePanel ausfuehren fuer Anzeige.
    -- Die Anordnung Zeilen / Spaltenweise gemaess Property Zeile / Spaltenanzahl

    zu machen, hab es schon mehrfach versucht, finde aber auch irgendwie kein Ansatzpunkt.

    MfG
    Basti



  • Mensch B@sti, wo Du Dich überall rumtreibst 😃
    Ab ins DavidM 1337 Forum mit Dir 😛

    greets, Mc


Anmelden zum Antworten