Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre éprouvé
    Détecter le clic sur la vignette créée en D6
    Bonjour à toutes et à tous,

    J'essaye de faire une petite application afin de créer des vignettes des photos au format .jpg contenues dans un dossier.

    J'utilise ce code qui affiche bien les vignettes depuis mon dossier, mais je n'ai pas trouvé comment lors d'un clic obtenir une autre information soit agrandir cette image soit un message.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    begin
    foundlist:=tstringlist.create;
     
    try
     
    //Voir les fichiers jpg
    if FindFirst(directorylistbox1.Directory +'\*.jpg', faAnyFile, sr) = 0 then
      begin
           foundlist.add(sr.name);
           while FindNext(sr) = 0 do
                 foundlist.add(sr.name);
           FindClose(sr);
      end;
     
    x:=0;
    y:=0;
     
    //création des vignettes
    for i:=0 to FoundList.count-1 do
            begin
                 anewthumb:=tbi_thumb.create(self);
                 buffer_jpeg.loadfromfile(foundlist[i]);
                 with anewthumb do begin
                  pic:=buffer_jpeg;
                  parent:=scrollbox1;
                  left:=x;
                  top:=y;
                  width:=120;
                  height:=90;
                  visible:=true;
                  inc(x,122);
                  if x>244 then
                            begin x:=0; inc(y,100); end;
                  application.processmessages;
                 end;
    end;
     
    finally 
    foundlist.free; 
    end;
     
    end;


    Merci d'avance pour toute aide.

    @+,

    cincap

  2. #2
    Rédacteur/Modérateur

    Bonjour,

    je ne connais pas ce composant tbi_thumb donc la première question est : accepte t'il un évènement onClick ?
    Si oui, il faut créer une procédure "générale" (le nom exact m'échappe) par exemple procedure vignetteclick(Sender : TObject);
    et ensuite affecter cette procédure lors de la création de l'objet
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
                with anewthumb do begin
                  pic:=buffer_jpeg;
                  parent:=scrollbox1;
                  left:=x;
                  top:=y;
                  width:=120;
                  height:=90;
                  visible:=true;
                  inc(x,122);
                  if x>244 then
                            begin x:=0; inc(y,100); end;
                  onClick:=vignetteclick;
                  application.processmessages;
                 end;
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Rédacteur/Modérateur

    plus
    Bon, j'ai eu la curiosité de chercher sur le net ce tbi_thumb et je suis tomber sur http://www.delphipages.com/articles/...r___-9199.html
    votre code y ressemblant à s'y méprendre je présume que c'est de cette page que vous vous êtes inspiré. Donc, pas de bol, il n'y a pas d'évènement OnClick

    au fait je me suis remémoré de nom exact il s'agit d'un TNotifyEvent

    Pour info la bibliothèque JVCL (il y a surement une vieille version D6) fourni un composant jvthumbImage
    attention, il faudra peut-être charger une version ancienne pour être sûr d'avoir les paquets pour D6
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  4. #4
    Membre éprouvé
    Bonjour,

    si tu ajoutes au code du " tbi_thumb"
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      tbi_thumb=class(tcustomcontrol)
        fmypic : tjpegimage;
      private
        procedure getpic(value:tjpegimage);
      public
        procedure paint; override;
        constructor create(aowner:tcomponent); override;
        destructor destroy; override;
      published
        property pic:tjpegimage write getpic;
        property OnClick;  // ceci  <-----------------------------
      end;



    tu devrais pouvoir utiliser le OnClick comme le propose SergioMaster

    Cordialement,

    @+

  5. #5
    Membre éprouvé
    @ Cirec et SergioMaster, merci pour vos suggestions, c'est bien le code de Boern Ischo (d'Allemagne)et les images s'affichent dans un TScrollBox qui lui a la propriété du onclick.

    Ma demande consiste à pouvoir différencier les vignettes en cliquant dessus soit par la propriété tag ou index car chaque image créée n'a pas de propriété.

    Pour le moment elles s'affichent sur 3 colonnes en tenant compte du nombre de photos dans le dossier.

    Je vais aussi vérifier avec la Jvcl.

    @+,

    cincap

  6. #6
    Rédacteur/Modérateur

    Citation Envoyé par cincap Voir le message

    Ma demande consiste à pouvoir différencier les vignettes en cliquant dessus soit par la propriété tag ou index car chaque image créée n'a pas de propriété.
    à ajouter aussi par exemple property tag : string;
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  7. ###raw>post.musername###
    Membre éprouvé
    Ma demande consiste à pouvoir différencier les vignettes en cliquant dessus soit par la propriété tag ou index car chaque image créée n'a pas de propriété.
    justement et tu peux y arriver sans grande modifications
    ci-joint un zip pour illustrer le tout :

    ps: testé avec D7

    Cordialement,

    @+

    [EDIT]
    ne sachant pas si on peut modifier un zip déposé !?
    je poste ici une petite modifications de dernière minute
    pour faciliter le choix de la taille, la marge et le nombre de Thumb par ligne :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    procedure TForm1.DirectoryListBox1Change(Sender: TObject);
    const
      ThumbWidth    = 120;
      ThumbHeight   =  90;
      ThumbMarge    =   8;
      ThumbsPerLine =   5;
    var
      i, x, y      : Integer;
      aNewThumb    : Tbi_Thumb;
      FoundList    : TStringList;
      sr           : TSearchRec;
     
    begin
      FoundList := TStringList.Create;
      try
        // Ajouté
        // suppression des images
        while ScrollBox1.ControlCount > 0 do
          ScrollBox1.Controls[0].Free;
        //look for jpg files
        if FindFirst(Directorylistbox1.Directory + '\*.jpg', faAnyFile, sr) = 0 then
        begin
          FoundList.add(Directorylistbox1.Directory + '\' + sr.name);
          while FindNext(sr) = 0 do
            FoundList.add(Directorylistbox1.Directory + '\' + sr.name);
          FindClose(sr);
        end;
     
        x := ThumbMarge;
        y := ThumbMarge;
     
        //create the thumbnails
        for i := 0 to FoundList.count - 1 do
        begin
          aNewThumb := Tbi_Thumb.create(self);
          Buffer_JPEG.loadfromfile(FoundList[I]);
          with aNewThumb do begin
            Pic := buffer_jpeg;
            Parent := scrollbox1;
            // Ajouté
            FileName := FoundList[I];
            OnClick := ThumbClick;
            //
            Left := x;
            Top := y;
            Width := ThumbWidth;
            Height := ThumbHeight;
            Visible := true;
            Inc(x, ThumbWidth + ThumbMarge);
            if x > (ThumbWidth * ThumbsPerLine) then
            begin
              x := ThumbMarge;
              Inc(y, ThumbHeight + ThumbMarge);
            end;
            Application.Processmessages;
          end;
        end;
      finally
        FoundList.free;
      end;
    end;


    [/EDIT]
      0  0

  8. #8
    Membre éprouvé
    @ Cirec, quel professionnalisme, tout fonctionne correctement sous D6 après la modification naturellement.

    Encore merci Cirec et aussi à ceux qui ont pris un peu sur leur temps pour aider les autres.

    Que des cracks sur ce site !

    Je ferme le topic car amplement résolu.


    @+,

    cincap

  9. #9
    Membre émérite
    Bonjour,

    j'ai complété le programme de Cirec, en affichant les vignettes sans déformer les images originales et en affichant l'image originale par simple Clic (avec zoom à la molette). J'ai aussi ajouté la propriété Tag qui peut servir comme dans cet exemple à stocker le numéro de l'image. Voici le projet modifié :



    A noter aussi l'excellent logiciel pReorg d'affichage de vignettes de Jean Yves Queinec que l'on peut trouver ici

    A+
    Charly

  10. #10
    Membre éprouvé
    @ Charly910,

    Merci pour cette modification surtout le zoom avec la roulette de la souris.

    Pour ma part, j'avais ajouté la propriété du doubleclick pour afficher la photo avec l'aperçu de Windows qui permet aussi plusieurs options.

    J'ai aussi prévu le défilement des vignettes avec la roulette de la souris.

    Comme quoi a partir d'un code de base de l'auteur Monsieur
    Bjoern Ischo tout est permis !

    http://www.delphipages.com/articles/...r___-9199.html

    @+,

    cincap

  11. #11
    Membre émérite
    Ton lien est brisé

    A+
    Charly

  12. #12
    Membre éprouvé
    @ Tous, désolé pour le lien c'est du au copy/coller :

    http://www.delphipages.com/articles/...r___-9199.html

    @ Charly910, après test, le focus n'est pas donné sur le TScrollBox afin de faire défiler les vignettes, je l'ai remédié !

    @+,

    cincap

  13. #13
    Membre émérite
    Merci, je pensais pourtant avoir mis des Scrollbox1.setFocus ?

    A+
    Charly

  14. #14
    Membre éprouvé
    Bonjour à toutes et à tous,

    @ Charly910,

    J'avais remarqué que suivant le système un simple "Scrollbox1.setFocus" ne fonctionnait pas à 100%.

    Avec ton projet voici ce que je te propose :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    procedure TForm1.ScrollBox1MouseWheelDown(Sender: TObject;
      Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
    begin
     
      SendMessage(ScrollBox1.handle,WM_VSCROLL,SB_LINEDOWN,0);
    end;
    { ======================================================================== }
    procedure TForm1.ScrollBox1MouseWheelUp(Sender: TObject;
      Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
    begin
     
      SendMessage(ScrollBox1.Handle, WM_VSCROLL, SB_LINEUP, 0);
    end;
    { ======================================================================== }


    Et dans :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.DirectoryListBox1Change(Sender: TObject);
    ---
    --
    finally
        FoundList.free;
        form1.ActiveControl := Scrollbox1; //Donne le focus
    end;


    Dans mes projets ou j'utilise un TScrollBox et ou se trouve d'autres composants comme un TButton, un TSpinEdit, TRadioButton et autres, je dois chaque fois remettre " form1.ActiveControl := Scrollbox1;"

    Je ne sais pas si c'est faisable de le déclarer une seule fois et qu'il fonctionne avec tous les Tcontrols, à creuser ?

    @+,

    cincap

  15. #15
    Membre émérite
    Ok, merci Cincap je vais tester. Chez moi les SetFocus fonctionnaient bien

    A+
    Charly

###raw>template_hook.ano_emploi###