IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

 Delphi Discussion :

Avec un TopenDialog, j'ouvre un dossier avec plusieurs photos D6 Win11


Sujet :

Delphi

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 717
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 717
    Par défaut Avec un TopenDialog, j'ouvre un dossier avec plusieurs photos D6 Win11
    Bonjour à toutes et à tous,

    Plutôt que d'utiliser un TSelectDirectory j'utilise un TOpenDialog pour choisir mon dossier et sélectionner toutes les photos ".jpg" puis les afficher.

    Serait t'il possible à l'execution du TOpenDialog de sélectionner la 1ère image automatiquement plutôt que de checker la photo et sans connaitre le nom ?

    Pour le moment dans mes tests j'ai créé dans le dossier une photo avec le nom "Open.jpg" qui me permet d'ouvrir le Dialog puis de le fermer pour afficher toutes les images, mais j'aimerai ne pas placer une image "Open.jpg" dans chaque dossier que je choisirais.

    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
    62
    63
    64
    65
    66
     
    procedure TForm1.BTestClick(Sender: TObject);
    Var
      mydirpath : String;
     
      ImagePath: string;
      Image: Timage;
      TopPos: Integer;
      SearchRec: TSearchRec;
     
    begin
     //Op1.FilterIndex := 1;
     
     Op1.FileName := 'Open';  //Dans le dossier = Open.jpg 1ère image
     
     Op1.Execute;
     
     mydirpath:= ExtractFileDir(op1.FileName);
     
     Ed.Text:= extractfilename(mydirpath);
     
      ImagePath := mydirpath;
     
      TopPos := 10; // Position de départ pour la première image
     
      // Effacer les images précédentes (si nécessaire)
      while ScrollBox1.ControlCount > 0 do
        ScrollBox1.Controls[0].Free;
     
      // Rechercher les fichiers images (par exemple, *.jpg)
      if FindFirst(ImagePath + '\*.jpg', faArchive or faSysFile or faHidden, SearchRec) = 0 then
      begin
        repeat
          // Créer dynamiquement un TImage
          Image := Timage.Create(ScrollBox1); // Le ScrollBox est le Owner
          Image.Parent := ScrollBox1; // Le ScrollBox est le Parent visuel
     
          try
            // Charger l'image depuis le fichier
            Image.Picture.LoadFromFile(ImagePath + '\' + SearchRec.Name);
            Image.Top := TopPos;
            Image.Left := 10;
            Image.AutoSize := false; // Ajuste la taille du TImage à l'image chargée
     
            image.Width := 320;
            image.Height := 240;
            Image.Stretch := true;
            Image.Align := alNone;
     
           // Mettre à jour la position Top pour l'image suivante
            TopPos := TopPos + Image.Height + 10; // Espacement de 10 pixels entre les images
     
          except
            // Gérer les erreurs de chargement d'image si nécessaire
            Image.Free;
          end;
     
        until FindNext(SearchRec) <> 0;
        FindClose(SearchRec);
      end;
     
      // Important pour que le ScrollBox ajuste ses barres de défilement
      // en fonction de la taille totale de son contenu
      ScrollBox1.AutoScroll := True;
     
    end;
    Merci d'avance même si cela me parait impossible.

    @+,

    cincap

  2. #2
    Membre expérimenté
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2014
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Décembre 2014
    Messages : 116
    Par défaut
    Bonjour,
    Tu l'écrits toi-même: "Plutôt que d'utiliser un TSelectDirectory j'utilise un TOpenDialog ..."
    TOpenDialog ouvre des fichiers, il attend la sélection d'un fichier pour activer le bouton OK
    TSelectDirectory sélectionne un dossier, il te renvoie son path complet et tu trouves tes fichiers dedans.
    Donc c'est impossible.
    solilog

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 717
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 717
    Par défaut
    @ solilog, merci de ton retour,

    Le TopenDialog à un plus bel interface c'est pourquoi je testais l'utilisation et c'est la raison que j'utilise une photo témoin qui me permet d'ouvrir puis de fermer sinon j'ai l'autre façon de faire, en D6 pas beaucoup de choix au niveau de l'interface ou le créer.

    Mais comme il y a des cracs sur ce forum il était possible de contourner le problème.

    @+,

    cincap

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 717
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 717
    Par défaut
    Bonjour à toutes et à tous,

    J'ai utilisé un TOpenDialog pour choisir le dossier et puis je clique sur la 1ère image.

    Mais je n'ai pas trouvé comment vider le chargement de l'image par un TButton.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Créer dynamiquement un TImage
          Image := Timage.Create(ScrollBox1); // Le ScrollBox est le Owner
          Image.Parent := ScrollBox1; // Le ScrollBox est le Parent visuel
     
          try
            // Charger l'image depuis le fichier
            Image.Picture.LoadFromFile(ImagePath + '\' + SearchRec.Name);
            Image.Top := TopPos;
            Image.Left := 10;
    J'ai testé avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Image.Picture := nil;
     
    ou
     
    Image.Parent := nil; 
     
    ou
     
    Image.Free;
    Cela ne fonctionne pas, si quelqu'un à une idée merci.

    @+,

    cincap

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 86
    Par défaut
    Bonjour
    a tu essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Image.Picture := nil;
    Image.Invalidate;

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 173
    Par défaut
    Sinon, as-tu les sources de Delphi ?
    En D4, mon maitre d'apprentissage m'a fait ajouter des fonctionnalités sur le TSelectDirDlg de l'époque, je l'avais tout simplement refait à base de TDriveComboBox, TDirectoryListBox, TFileListBox ... bon c'était sous Win98 et NT4 donc le style était moche, mais en utilisant des controles Shell plus moderne + skin, tu pourrais avoir ton Dialogue personnalisé une boite fois pour toute.

    Si je me souviens bien, justement, le dialogue en D4 que j'avais refait c'était pour choisir un dossier via une fonction SelectDirectoryEx
    La condition de sélection était uniquement si le dossier contenait au moins un fichier avec l'une des extensions souhaitées et le retour était bien le nom du dossier (pas celui du premier fichier).

    Tu n'avais déjà transformé un TOpenDialog en TDirDialog dans ce sujet ?


    Pour rappel TSelectDirDlg dialogue interne du vieux SelectDirectory affiche un truc un moche du genre que l'on peut totalement modernisé aujourd'hui (en D6, je sais que tu utilises un outil de Skin)

    Nom : Sans titre.jpg
Affichages : 125
Taille : 103,5 Ko



    Si tu as le source de Delphi, reprend le code du TSelectDirDlg remplace les composants de Vcl.FileCtrl par des composants Shell plus moderne (TShellTreeView, TShellListView ...)


    EDIT : Cela existe déjà : https://github.com/EtheaDev/DelphiShellControlsPackages
    Il y a une démo justement pour faire un sélecteur de dossier avancé :

    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 717
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 717
    Par défaut
    @ papyvore, merci de ton message, en effet j'avais testé et à la compilation une exception.

    Par contre avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FreeAndNil(Scrollbox1);
    Cela fonctionne le TScrollBox se vide mais si j'ouvre à nouveau le Topendialog et que je choisis l'image j'ai un bug.


    @ ShaiLeTroll, merci de ton message, en effet j'utilise VCLSKINS avec license mais pas de tracas c'est une bète application que j'essaye de mettre à jour.

    Tu n'avais déjà transformé un TOpenDialog en TDirDialog dans ce sujet ?
    En effet mais je devais quand même choisir un fichier.

    @+,

    cincap

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 86
    Par défaut
    Cela fonctionne le TScrollBox se vide mais si j'ouvre à nouveau le Topendialog et que je choisis l'image j'ai un bug.
    si tu veut vider le TScrollBox et le recharger essais plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm14.Button2Click(Sender: TObject);
    begin
      repeat
        ScrollBox1.Controls[0].Destroy;  //  ScrollBox1.ControlCount-1
      until ScrollBox1.ControlCount = 0;
      ScrollBox1.Refresh;
    //ScrollBox1.Invalidate;
    end;

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 717
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 717
    Par défaut
    @ papyvore, superbe cela fonctionne correctement je t'en remercie.

    Merci a tous pour vos réponses.

    Topic résolut.

    @+,

    cincap

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 717
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 717
    Par défaut
    Bonjour à toutes et à tous,

    Pour confirmer la question résolue depuis l'intervention de ShaiLeTroll.

    J'ai fouillé dans mes vieux disques Dur et j'ai retrouvé une application que j'avais réalisée il y a longtemps qui utilisait une petite "dll" pour modifier simplement le TOpenDialog.

    Nom : DirOpenDlg.jpg
Affichages : 98
Taille : 44,2 Ko

    @+,

    cincap

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 86
    Par défaut
    salut sans charger de dll je pense que ça
    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
    // add uses ShlObj
    procedure TForm14.Button3Click(Sender: TObject);
    var
      TitleName: string;
      lpItemID: PItemIDList;
      BrowseInfo: TBrowseInfo;
      DisplayName: array [0 .. MAX_PATH] of char;
      TempPath: array [0 .. MAX_PATH] of char;
    begin
      FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
      BrowseInfo.hwndOwner := Handle;
      BrowseInfo.pszDisplayName := @DisplayName;
      TitleName := 'Sélectionner un Dossier';
      BrowseInfo.lpszTitle := PChar(TitleName);
      BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
      lpItemID := SHBrowseForFolder(BrowseInfo);
      if lpItemID <> nil then
      begin
        SHGetPathFromIDList(lpItemID, TempPath);
        mydirpath := TempPath;
        // ShowMessage(TempPath);
        GlobalFreePtr(lpItemID);
      end;
    end;
    marche aussi sous d7

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 717
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 717
    Par défaut
    Bonjour à toutes et à tous,

    @ papyvore, merci de ta suggestion, c'est une excellente méthode que tu proposes, tu as oublié de renseigner la variable "mydirpath" string.

    Et le look reste le même plutôt qu'avec le fichier ".dll" et pas beaucoup de ligne surtout que je l'ai mis en ressource.

    Juste une question la mémorisation du dossier peut aussi se faire car à chaque appel on revient au début et il faut rechercher ou se trouve le dossier et dans quel répertoire.

    @+,

    cincap

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 86
    Par défaut
    mémoriser le dossier je sais pas trop mais essais ça ,si mydirpath est <> de ''
    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
     
     
    function BrowseForFolderCallBack(Wnd: HWND; uMsg: UINT; lParam, lpData: lParam): Integer stdcall;
    begin
      if uMsg = BFFM_INITIALIZED then
        SendMessage(Wnd, BFFM_SETSELECTION, 1, Integer(@mydirpath[1]));
      result := 0;
    end;
     
    procedure TForm14.Button3Click(Sender: TObject);
    var
      TitleName: string;
      lpItemID: PItemIDList;
      BrowseInfo: TBrowseInfo;
      DisplayName: array [0 .. MAX_PATH] of char;
      TempPath: array [0 .. MAX_PATH] of char;
    begin
      FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
      BrowseInfo.hwndOwner := Handle;
     
      BrowseInfo.pszDisplayName := @DisplayName;
      if mydirpath <> '' then
      begin
     //   lg_StartFolder := mydirpath;
        BrowseInfo.lpfn := BrowseForFolderCallBack;
      end;
     
      TitleName := 'Sélectionner un Dossier';
      BrowseInfo.lpszTitle := PChar(TitleName);
      BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
      (* Browsing for directory
     
        BIF_RETURNONLYFSDIRS   = $0001; { For finding a folder to start document searching }
        BIF_DONTGOBELOWDOMAIN  = $0002; { For starting the Find Computer }
        BIF_STATUSTEXT         = $0004;
        BIF_RETURNFSANCESTORS  = $0008;
     
        BIF_BROWSEFORCOMPUTER  = $1000; { Browsing for Computers }
        BIF_BROWSEFORPRINTER   = $2000; { Browsing for Printers }
        BIF_BROWSEINCLUDEFILES = $4000; { Browsing for Everything } *)
     
      lpItemID := SHBrowseForFolder(BrowseInfo);
      if lpItemID <> nil then
      begin
        SHGetPathFromIDList(lpItemID, TempPath);
        mydirpath := TempPath;
        // ShowMessage(TempPath);
        GlobalFreePtr(lpItemID);
      end;
      Button1Click(Sender); //charge les images dans scroolbox1
    end;
    var mydirpath en var globale.
    on rouvre sur le dernier dossier sélectionné

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 717
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 717
    Par défaut
    @ papyvore, oufti je n'aurai jamais trouvé seul, cela fonctionne et j'ai pu sauvegarder le chemin dans un fichier .ini.

    Mais pour libérer la mémoire je suis en D6 et "CoTaskMemFree(Pidl)" ne fonctionne pas.

    De même pour relire le fichier . ini pas encore de résultat !

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    var
      TitleName: string;
      lpItemID: PItemIDList;
      BrowseInfo: TBrowseInfo;
      DisplayName: array [0 .. MAX_PATH] of char;
      TempPath: array [0 .. MAX_PATH] of char;
    
      ImagePath: string;
      Image: Timage;
      TopPos: Integer;
      SearchRec: TSearchRec;
    
      ini : Tinifile;
    begin
      FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
      BrowseInfo.hwndOwner := Handle;
     
      BrowseInfo.pszDisplayName := @DisplayName;
      if mydirpath <> '' then
      begin
     //   lg_StartFolder := mydirpath;
        BrowseInfo.lpfn := BrowseForFolderCallBack;
      end;
     
      TitleName := 'Sélectionner un Dossier';
      BrowseInfo.lpszTitle := PChar(TitleName);
      BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
      (* Browsing for directory
     
        BIF_RETURNONLYFSDIRS   = $0001; { For finding a folder to start document searching }
        BIF_DONTGOBELOWDOMAIN  = $0002; { For starting the Find Computer }
        BIF_STATUSTEXT         = $0004;
        BIF_RETURNFSANCESTORS  = $0008;
     
        BIF_BROWSEFORCOMPUTER  = $1000; { Browsing for Computers }
        BIF_BROWSEFORPRINTER   = $2000; { Browsing for Printers }
        BIF_BROWSEINCLUDEFILES = $4000; { Browsing for Everything } *)
     
      lpItemID := SHBrowseForFolder(BrowseInfo);
    
      if lpItemID <> nil then
      begin
      try
       if SHGetPathFromIDList(lpItemID, TempPath) then
    
           begin
            // Sauvegarde immédiate
            Ini := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
            try
              Ini.WriteString('Settings', 'Folder', string(TempPath));
            finally
              Ini.Free;
            end;
          end;
        finally
          //CoTaskMemFree(Pidl); // Libération de la mémoire du PIDL
        end;
      
        mydirpath := TempPath;
    
        GlobalFreePtr(lpItemID);
      end;
    
      ed.text := mydirpath;
    
      ImagePath := mydirpath;    //  'Photos'
    
      TopPos := 10; // Position de départ pour la première image
    
      // Effacer les images précédentes (si nécessaire)
      while ScrollBox1.ControlCount > 0 do
        ScrollBox1.Controls[0].Free;
    
      // Rechercher les fichiers images (par exemple, *.jpg)
      if FindFirst(ImagePath + '\*.jpg', faArchive or faSysFile or faHidden, SearchRec) = 0 then
      begin
        repeat
          // Créer dynamiquement un TImage
          Image := Timage.Create(ScrollBox1); // Le ScrollBox est le Owner
          Image.Parent := ScrollBox1; // Le ScrollBox est le Parent visuel
    
          try
            // Charger l'image depuis le fichier
            Image.Picture.LoadFromFile(ImagePath + '\' + SearchRec.Name);
            Image.Top := TopPos;
            Image.Left := 10;
            Image.AutoSize := false; // Ajuste la taille du TImage à l'image chargée
    
            image.Width := Spwidth.value;
            image.Height := Spheight.value ;
            Image.Stretch := true;
            Image.Align := alNone;
            // Mettre à jour la position Top pour l'image suivante
            TopPos := TopPos + Image.Height + 10; // Espacement de 10 pixels entre les images
    
          except
            // Gérer les erreurs de chargement d'image si nécessaire
            Image.Free;
          end;
        until FindNext(SearchRec) <> 0;
        FindClose(SearchRec);
      end;
    
      // Important pour que le ScrollBox ajuste ses barres de défilement
      // en fonction de la taille totale de son contenu
      ScrollBox1.AutoScroll := True;
    
    end;
    @+,

    cincap

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 86
    Par défaut
    pour lire tes données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm14.FormShow(Sender: TObject);
    var
      ini: Tinifile;
    begin
      ini := Tinifile.Create(ChangeFileExt(ParamStr(0), '.ini'));
      try
       mydirpath := ini.ReadString('Settings', 'Folder', '');
      finally
        ini.Free;
      end;
    end;
    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GlobalFreePtr(lpItemID);
    essais de remplacer par ça devrait libérer lpItemID mais je ne connais pas la différence entre GlobalFreePtr et dispose

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 717
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 717
    Par défaut
    Bonjour à toutes et à tous,

    @ papyvore, merci pour ton temps et ta solution tout fonctionne super.

    Pour la libération de "lpItemID" :

    Mais pour libérer la mémoire je suis en D6 et "CoTaskMemFree(Pidl)" ne fonctionne pas.
    Par contre seul:

    finally
    //FreeMem(lpItemID); // Libération de la mémoire du PIDL
    GlobalFreePtr(lpItemID); //Fonctionne mais dispose(lpItemID); ne fonctionne pas !
    end;
    Fonctionne pas d'exception à la compilation.

    Code terminé :

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    var
      TitleName: string;
      lpItemID: PItemIDList;
      BrowseInfo: TBrowseInfo;
      DisplayName: array [0 .. MAX_PATH] of char;
      TempPath: array [0 .. MAX_PATH] of char;
     
      ImagePath: string;
      Image: Timage;
      TopPos: Integer;
      SearchRec: TSearchRec;
     
      begin
     
      FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
      BrowseInfo.hwndOwner := Handle;
     
      BrowseInfo.pszDisplayName := @DisplayName;
      if mydirpath <> '' then
      begin
     //   lg_StartFolder := mydirpath;
        BrowseInfo.lpfn := BrowseForFolderCallBack;
      end;
     
      TitleName := 'Sélectionner un Dossier';
      BrowseInfo.lpszTitle := PChar(TitleName);
      BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
     
      (* Browsing for directory
     
        BIF_RETURNONLYFSDIRS   = $0001; { For finding a folder to start document searching }
        BIF_DONTGOBELOWDOMAIN  = $0002; { For starting the Find Computer }
        BIF_STATUSTEXT         = $0004;
        BIF_RETURNFSANCESTORS  = $0008;
     
        BIF_BROWSEFORCOMPUTER  = $1000; { Browsing for Computers }
        BIF_BROWSEFORPRINTER   = $2000; { Browsing for Printers }
        BIF_BROWSEINCLUDEFILES = $4000; { Browsing for Everything } *)
     
      lpItemID := SHBrowseForFolder(BrowseInfo);
     
      if lpItemID <> nil then
      begin
      try
       if SHGetPathFromIDList(lpItemID, TempPath) then
     
           begin
            // Sauvegarde immédiate
            Ini := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
            try
              Ini.WriteString('MON CHEMIN', 'DOSSIER', string(TempPath));
            finally
              Ini.Free;
            end;
          end;
        finally
        //FreeMem(lpItemID); // Libération de la mémoire du PIDL
        GlobalFreePtr(lpItemID);
        end;
     
        mydirpath := TempPath;
     
      end;
     
      ed.text := mydirpath;
     
      ImagePath := mydirpath;    //  'Photos'
     
      TopPos := 10; // Position de départ pour la première image
     
      // Effacer les images précédentes (si nécessaire)
      while ScrollBox1.ControlCount > 0 do
        ScrollBox1.Controls[0].Free;
     
      // Rechercher les fichiers images (par exemple, *.jpg)
      if FindFirst(ImagePath + '\*.jpg', faArchive or faSysFile or faHidden, SearchRec) = 0 then
      begin
        repeat
          // Créer dynamiquement un TImage
          Image := Timage.Create(ScrollBox1); // Le ScrollBox est le Owner
          Image.Parent := ScrollBox1; // Le ScrollBox est le Parent visuel
     
          try
            // Charger l'image depuis le fichier
            Image.Picture.LoadFromFile(ImagePath + '\' + SearchRec.Name);
            Image.Top := TopPos;
            Image.Left := 10;
            Image.AutoSize := false; // Ajuste la taille du TImage à l'image chargée
     
            image.Width := Spwidth.value;
            image.Height := Spheight.value ;
            Image.Stretch := true;
            Image.Align := alNone;
            // Mettre à jour la position Top pour l'image suivante
            TopPos := TopPos + Image.Height + 10; // Espacement de 10 pixels entre les images
     
          except
            // Gérer les erreurs de chargement d'image si nécessaire
            Image.Free;
          end;
        until FindNext(SearchRec) <> 0;
        FindClose(SearchRec);
      end;
     
      // Important pour que le ScrollBox ajuste ses barres de défilement
      // en fonction de la taille totale de son contenu
      ScrollBox1.AutoScroll := True;
     
    end;
    Grand merci et excellent dimanche à tous.

    @+,

    cincap

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 717
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 717
    Par défaut
    @ papyvore,

    Concernant la libération de "lpItemID" je viens de tester, il fallait ajouter dans le uses "ActiveX" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     finally
     
        if Assigned(lpItemID) then begin
        CoTaskMemFree(lpItemID);
     
      end;
    Et pour une ancienne version :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure FreePidl(pidl: PItemIDList);
    var
      Malloc: IMalloc;
    begin
      if (lpItemID <> nil) and Succeeded(SHGetMalloc(Malloc)) then
      begin
        Malloc.Free(lpItemID);
        // Pas besoin de libérer manuellement "Malloc", c'est une interface gérée.
      end;
    @+,

    cincap

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 23
    Dernier message: 12/03/2017, 19h01
  2. Réponses: 2
    Dernier message: 27/07/2016, 14h21
  3. [WS 2008] Partager dossier avec plusieurs utilisateurs
    Par boboss123 dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 06/11/2009, 10h24
  4. Réponses: 0
    Dernier message: 22/04/2009, 10h15
  5. Réponses: 3
    Dernier message: 20/04/2008, 22h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo