Mehrere Bilder gleichzeitig darstellen



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

    greets, Mc



  • Original erstellt von Clip:
    **Mensch B@sti, wo Du Dich überall rumtreibst 😃
    Ab ins DavidM 1337 Forum mit Dir 😛

    greets, Mc**

    ?



  • Hi B@sti

    Hilft Dir das:

    class PACKAGE TMultiImageScroller : public TScrollBox
    {
    private:
      int Column,Row;
      TList* FImagePanelList;
      void __fastcall SetRow(int Rows);
      void __fastcall SetColumn(int Cols);
    protected:
      TStringList* Files;
    public:
                   __fastcall TMultiImageScroller(TComponent* Owner);
                   __fastcall ~TMultiImageScroller(void);
      virtual void __fastcall LoadFromFileList(TStringList* Names, Boolean Add);
      virtual void __fastcall Clear(void);
      virtual void __fastcall ArrangeImage(void);
    __published:
      __property int Rows={read=Row,write=SetRow,nodefault} ;
      __property int Cols={read=Column,write=SetColumn,nodefault} ;
    };
    

    Im CTor erzeugste 'ne leere TList fuer *FImagePanelList
    Im DTor deleten.

    in LoadFromFileList erzeugste fuer jeden Dateinamen der uebergebenen Liste
    ein ImagePanel (aus Teil 1) und addest das in die Liste

    Groesse des ImagePanel aus Boxgroesse, Row und Column berechnen.

    In Parameter Names uebergibst Du ne StringList mit allen dateinamen

    Falls Add=false ist wird FImagePanelList geleert vor dem Laden der Bilder - Alle ImagePanels aus der Liste deleten und Listeneintrag loeschen!.

    PS: Probier's mal 😉



  • Hi,
    danke nochmal für die Hilfe. Ich habe es jetzt so gemacht das ich für jedes Bild ein Pannel habe. Anstelle IP->... hab ich jetzt in einer Schleife IP[i]->... So muss ich auch keine ImageList benutzen. D.h. ich komme ohne die abgeleitete Klasse davon 😉

    MfG
    Basti



  • Siehste, 's geht doch! 😉

    Aber ne Kompo ist besser zu handhaben!

    Kannst ja mal folgendes probieren:

    //Ist ne Kompo / Klasse als ScrollBox fuer die TImagePanels!
    //Kannste mit dem Header zu der anderen (Teil 1) hinzufuegen!

    static inline void ValidCtrCheck(TMultiImageScroller *)
    { new TMultiImageScroller(NULL);
    }
    //---------------------------------------------------------------------------
    __fastcall TMultiImageScroller::TMultiImageScroller(TComponent* Owner)
            : TScrollBox(Owner)
    { FImagePanelList=new TList;
      Files=NULL;
      Column=2;
      Row=1;
    }
    //---------------------------------------------------------------------------
    __fastcall TMultiImageScroller::~TMultiImageScroller(void)
    { if (Files!=NULL)
        delete Files;
      delete FImagePanelList;
    }
    //---------------------------------------------------------------------------
    void __fastcall TMultiImageScroller::LoadFromFileList(TStringList* Names, Boolean Add)
    { int i;
      int j=0;
      int PanelWidth;
      int PanelHeight;
      TImagePanel* ImagePanel;
      if (Files!=NULL)
      { if (!Add)
        { delete Files;
          Files=new TStringList;
        }
      }
      else
      { Files=new TStringList;
      }
      j=Files->Count;
      for (i=0;i<Names->Count;i++)
        if (Files->IndexOf(Names->Strings[i])<0)
          Files->Add(Names->Strings[i]);
      if (j>0)
      { PanelWidth=((TImagePanel*) (FImagePanelList->Items[0]))->Width;
        PanelHeight=((TImagePanel*) (FImagePanelList->Items[0]))->Height;
      }
      else
      { PanelWidth=(ClientWidth) / Column;
        PanelHeight=(ClientHeight) / Row;
      }
      for (i=j;i<Files->Count;i++)
      { if (i<FImagePanelList->Count)
        { ImagePanel=(TImagePanel*) (FImagePanelList->Items[i]);
        }
        else
        { ImagePanel=new TImagePanel(this);
          FImagePanelList->Add(ImagePanel);
        }
        ImagePanel ->Enabled=false;
        ImagePanel->Width=PanelWidth;
        ImagePanel->Height=PanelHeight;
        ImagePanel->Left=(i%Column) * PanelWidth-HorzScrollBar->Position;
        ImagePanel->Top=(i / Column) * PanelHeight-VertScrollBar->Position;
        ImagePanel->ShowHint=true;
        ImagePanel->Hint=Files->Strings[i];
        ImagePanel->Parent=this;
      }
      while(FImagePanelList->Count>Files->Count)
      { delete (TImagePanel*) (FImagePanelList->Items[FImagePanelList->Count-1]);
        FImagePanelList->Delete(FImagePanelList->Count-1);
      }
      VertScrollBar->Smooth=false;
      VertScrollBar->Increment=(short) PanelHeight;
      HorzScrollBar->Smooth=false;
      HorzScrollBar->Increment=(short) PanelWidth;
      for (i=j;i<Files->Count;i++)
      { ImagePanel=(TImagePanel*) (FImagePanelList->Items[i]);
        ImagePanel->LoadFromFile(Files->Strings[i]);
        ImagePanel->Refresh();
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall TMultiImageScroller::Clear(void)
    { if (FImagePanelList->Count>0)
        Files->Clear();
      while (FImagePanelList->Count>0)
      { delete (TImagePanel*) (FImagePanelList->Items[0]);
        FImagePanelList->Delete(0);
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall TMultiImageScroller::SetRow(int Rows)
    { Row=Rows;
    }
    //---------------------------------------------------------------------------
    void __fastcall TMultiImageScroller::SetColumn(int Cols)
    { Column=Cols;
    }
    //---------------------------------------------------------------------------
    void __fastcall TMultiImageScroller::ArrangeImage(void)
    { int i;
      int PanelWidth;
      int PanelHeight;
      TImagePanel* ImagePanel;
      PanelWidth=(ClientWidth) / Column;
      PanelHeight=(ClientHeight) / Row;
      for (i=0;i<FImagePanelList->Count;i++)
      {
        ImagePanel=(TImagePanel*) (FImagePanelList->Items[i]);
        ImagePanel->Width=PanelWidth;
        ImagePanel->Height=PanelHeight;
        ImagePanel->Left=(i%Column) * PanelWidth-HorzScrollBar->Position;
        ImagePanel->Top=(i / Column) * PanelHeight-VertScrollBar->Position;
        ImagePanel->LoadFromFile(ImagePanel->FName);
      }
    }
    //---------------------------------------------------------------------------
    


  • Und wie mach ich das jetzt wenn ich beim klick auf eines der vielen dargestllten Bilder eine MessageBox anzeigen will mit einer Bildspezifischen Information? Ich hab ja nirgends ein onKlick Ereignis?

    MfG
    Basti



  • Hi B@sti

    Wenn Du aus der Unit ne Komponente machst (in IDE eingebunden), kannste die Property OnClick ansprechen wie bei allen anderen Komponenten der IDE!

    Oder Du deklarierst ne Funktion genau so wie OnClick der TScrollBox (in BCB- Hilfe guggen). Die Funktion kannste der Property OnClick von MultiImageScroller zur Laufzeit zuweisen.

    Die Deklaration muss im Hauptmodul erfolgen!

    Koennte so aussehen:

    //Handler fuer OnClick der Scrollbox (Namens MISB)
    //nach erzeugen von MISB:
    //MISB->OnClick=MISBClick;
    
    void __fastcall TForm1::MISBClick(TObject *Sender)
    {
      TImagePanel *IP=NULL;
      TPoint Pt;
      Pt=MISB->ScreenToClient(Mouse->CursorPos);
      for (int i=0;i<MISB->ControlCount;i++)
      {
        if ((MISB->Controls[i]->Left<Pt.x)&&
            ((MISB->Controls[i]->Left+MISB->Controls[i]->Width)>Pt.x)&&
            (MISB->Controls[i]->Top<Pt.y)&&
            ((MISB->Controls[i]->Top+MISB->Controls[i]->Height)>Pt.y))
        {
          IP=(TImagePanel*)MISB->Controls[i];
          break;
        }
      }
      if (IP!=NULL)
      {
        SelFile->Caption=IP->FName;//Dateinamen in Label anzeigen!
      }
    }
    

    [ Dieser Beitrag wurde am 27.05.2003 um 18:28 Uhr von DerAltenburger editiert. ]



  • hallo

    die kombo ist echt gut und ich würde diese gerne verwenden.

    kann man sie so modifzieren das man auch jpg verarbeiten kann?

    ich würdet mir sehr helfen.

    danke und gruß
    samson



  • includire mal :

    #include <jpeg.hpp>

    in Headerfile.



  • ist es schon drin?? 😉

    so einfach, danke dir


Anmelden zum Antworten