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

Langage Delphi Discussion :

Intercepter la suppression d'un fichier.


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut Intercepter la suppression d'un fichier.
    Bonjour,

    Que ce soit par le composant TOpenDialog de Delphi ou par un ShellExecute de Explorer.exe, je n'arrive pas à intercepter la suppression d'un fichier par pression de la touche "Del".
    Si ce n'est pas possible, il me restera à placer les fichiers dans une StringList à comparer après sortie de la boite de dialogue.
    Sauf si quelqu'un a une idée du genre test de touche ou évènement OnDelete.

    Cordialement.

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 961
    Points
    6 961
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  3. #3
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    J'ai opté pour la création d'une fiche qui contient une Listview.
    Celle-ci doit contenir les fichiers d'un dossier dans lequel l'utilisateur pourra sélectionner ceux à supprimer via un bouton.

    Malheureusement, les données entrées dans la ListeView n'y apparaissent pas. C'est comme si elle était vide. Cela fait plus de deux semaines que je cherche des solutions sur le net, sans résultat. Voici le code de la procédure qui remplit la ListView et qui comporte deux boucles pour envoi de message de contrôle :
    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
    procedure TForm1.Test;
    var
      FoundResult : TSearchRec;
      i, j : Integer;
      StrPath : String;
      NewItem: TListItem;
      FileDate, FileSize, FileName, Msg : String;
      Point : Char;
      KbSize : Double;
    begin
      FilesListView.Items.Clear;
      StrPath := IncludeTrailingPathDelimiter(PathLbl.Caption);
      FilesListView.Items.BeginUpdate;
      if FindFirst(StrPath + '*.*', faAnyFile, FoundResult) = 0 then
      try
        Msg := '';
        repeat
          if ((FoundResult.Attr and faDirectory) <= 0) and (FoundResult.Name <> '.') and
             (FoundResult.Name <> '..') then
          begin
            if ThousandSeparator = ',' then Point := '.' else Point := ',';
            NewItem := FilesListView.Items.Add;
            NewItem.Caption := FoundResult.Name;
            KbSize :=(FoundResult.Size / 1024) / 1;
            if KbSize < 1 then KbSize := 1;
            FileSize := FormatFloat('###' + Point + '### Kb', KbSize);
            NewItem.SubItems.Add(FileSize);
            FileDate := formatdatetime('dd-mm-yyyy', FileDateToDateTime(FoundResult.Time));
            NewItem.SubItems.Add(FileDate);
            Msg := Msg + NewItem.Caption;
            For i := 0 to NewItem.SubItems.Count - 1 do
            begin
              Msg := Msg + ' | ' + NewItem.SubItems[i];
            end;
            Msg := Msg + #10;
          end;
        until FindNext(FoundResult) <> 0;
      finally
      ShowMessage(Msg);
      FilesListView.Items.EndUpdate;
      end;
      FindClose(FoundResult);
      FilesListView.Repaint;
      For i := 0 to FilesListView.Items.Count - 1 do
      begin
        Msg := Msg + #10 + FilesListView.Items[i].Caption;
        For j := 0 to FilesListView.Items[i].SubItems.Count - 1 do
        begin
          Msg := Msg + ' | ' + FilesListView.Items[i].SubItems[j] + #10;
        end;
      end;
      ShowMessage(Msg);
    end;
    La boucle placée dans le remplissage de la ListView montre bien que les valeurs voulues sont affectées à ses items. Mais c'est comme si elles disparaissaient puisque le message placé en fin de procédure est vide alors que «FilesListView.Items.Count» donne la bonne valeur en exécution pas à pas.

    Quelqu'un aurait-il une idée permettant de remplir cette ListView ?

    Cordialement

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    j'ai plusieurs remarques.

    Je commence par est-ce VCL ou FMX et même quelle version de Delphi ? c'est pas que ça gêne mais

    autrement au niveau du code
    c'est FileListView.BeginUpdate et bien évidement FileListView.EndUpdate qu'il faut mettre pas FileListView.Items.BeginUpdate/EndUpdate
    Virer les lignes 43 à 52

    rapidement (sans tester) je 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
    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
     
    procedure TForm1.Test;
    var
      FoundResult : TSearchRec;
      i, j : Integer;
      StrPath : String;
      NewItem: TListItem;
      FileDate, FileSize, FileName, Msg : String;
      Point : Char;
      KbSize : Double;
    begin
      StrPath := IncludeTrailingPathDelimiter(PathLbl.Caption);
      FilesListView.BeginUpdate;
      FilesListView.Items.Clear;
      if FindFirst(StrPath + '*.*', faAnyFile, FoundResult) = 0 then
      try
        Msg := '';
        repeat
          if ((FoundResult.Attr and faDirectory) <= 0) and (FoundResult.Name <> '.') and
             (FoundResult.Name <> '..') then
          begin
            if ThousandSeparator = ',' then Point := '.' else Point := ',';
            NewItem := FilesListView.Items.Add;
            NewItem.Caption := FoundResult.Name;
            KbSize :=(FoundResult.Size / 1024) / 1;
            if KbSize < 1 then KbSize := 1;
            FileSize := FormatFloat('###' + Point + '### Kb', KbSize);
            NewItem.SubItems.Add(FileSize);
            FileDate := formatdatetime('dd-mm-yyyy', FileDateToDateTime(FoundResult.Time));
            NewItem.SubItems.Add(FileDate);
            Msg := Msg + NewItem.Caption;
            For i := 0 to NewItem.SubItems.Count - 1 do
            begin
              Msg := Msg + ' | ' + NewItem.SubItems[i];
            end;
            Msg := Msg + #10;
          end;
        until FindNext(FoundResult) <> 0;
      finally
       FindClose(FoundResult);
      end;
      FilesListView.EndUpdate;
      ShowMessage(Msg);
    end;
    je n'ai pas regardé de près cette histoire de FileSize AMHA il y a mieux (mais cela dépend de la version de Delphi)

    Pour info, j'ai écrit et publié un truc de ce genre dans mon tutoriel sur les styles (premier pas)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 685
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 097
    Points
    13 097
    Par défaut
    En mode vsReport, tu dois obligatoirement ajouter des colonnes au composant.

    Et aussi :
    Si tu veux ajouter un texte dans une chaîne de format, il vaut mieux l'entourer de guillemets : FormatFloat('0 "kb"').

    if ThousandSeparator = ',' then Point := '.' else Point := ','; est inutile. La chaîne de formatage de FormatFloat ne se base pas sur la localisation, seule la chaîne résultante l'est. La séparation des milliers se fait donc toujours en spécifiant la virgule.
    Il n'y a pas besoin non plus de formater les milliers, la présence d'une virgule est suffisante pour que FormatFloat le fasse. La position de la virgule n'a même aucun intérêt. Ainsi, FormatFloat('###,### "kb"') égale FormatFloat('#, "kb"') égale FormatFloat(',# "kb"') égale FormatFloat('# "kb",'), etc.

  6. #6
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    L'appli est en Delphi 4 et le composant TListView est dans le paquet dclstd40.
    Ni FileListView.BeginUpdate, ni FileListView.endUpdate, ne sont reconnus par le compilateur.
    Par contre, j'ai essayé FilesListView.UpdateItems(FirstIndex, LastIndex) mais cela ne change rien.
    Les lignes 42 à 53 ne sont là que pour montrer si les valeurs exactes renvoyées par les lignes 30 à 39 sont gardées ce qui n'est pas le cas actuellement.

    Merci pour votre aide

  7. #7
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,
    Comme dit AndNotOr, tu dois créer tes colonnes. Tu peux le faire par l'IDE ou bien par code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      NewColumn : TListColumn ;
    begin
      FilesListView.ViewStyle :=  vsreport ;
      NewColumn := FilesListView.Columns.Add;
      NewColumn.Caption := 'Fichier';
      NewColumn.Width := 200 ;
      NewColumn := FilesListView.Columns.Add;
      NewColumn.Caption := 'Taille';
      NewColumn.Width := 100 ;
      NewColumn := FilesListView.Columns.Add;
      NewColumn.Caption := 'Date';
      NewColumn.Width := 100 ;
    A+
    Charly

  8. #8
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Sauf votre respect, je crois que cela n'a rien à voir avec le problème.

    La propriéte ViewStyle est définie VsReport dans l'inspecteur d'objet.
    Nom : Objet.JPG
Affichages : 261
Taille : 59,7 Ko
    De même pour les colonnes
    Nom : Colonnes.JPG
Affichages : 257
Taille : 13,5 Ko

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    L'appli est en Delphi 4 et le composant TListView est dans le paquet dclstd40.
    Ni FileListView.BeginUpdate, ni FileListView.endUpdate, ne sont reconnus par le compilateur.
    Delphi 4, j'étais loin du compte, "qui utilise encore D4 ?" dit celui qui utilise encore D3 pour la maintenance de certains programmes de son application

    Effectivement, cela change beaucoup de choses, les Listview et moi c'est plutôt une histoire FMX et, pire en VCL j'ai l'impression de ne plus savoir en remplir sans LiveBindings
    Si j'ai un petit 1/4 heure je vais me pencher sur le sujet (avec le D7 sur mon poste de travail)

    P.S. Comme quoi, indiquer la version utilisée (et si besoin le framework) c'est important (pour ne pas avoir à le répéter à chaque nouvelle discussion, mettre son environnement en signature empêche l'oubli)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Re,
    Finalement, j'ai fait un truc rapide (très rapide) en D3
    Seule entorse j'ai utilisé un composant tiers pour la sélection de répertoire (RxDirectoryEdit)
    Autrement j'ai copié/collé ton code en élaguant la partie debug (showmessage)
    Unité .Pas
    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
    unit UBrowse;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Mask, ToolEdit, ComCtrls;
     
    type
      TForm1 = class(TForm)
        ListView1: TListView;
        DirectoryEdit1: TDirectoryEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
        procedure Test;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.DFM}
     
    procedure TForm1.Test;
    var
      FoundResult : TSearchRec;
      i, j : Integer;
      StrPath : String;
      NewItem: TListItem;
      FileDate, FileSize, FileName, Msg : String;
      Point : Char;
      KbSize : Double;
    begin
      ListView1.Items.Clear;
      StrPath := DirectoryEdit1.Text+'\';
    //  ListView1.Items.BeginUpdate;
      if FindFirst(StrPath + '*.*', faAnyFile, FoundResult) = 0 then
      try
        repeat
          if ((FoundResult.Attr and faDirectory) <= 0) and (FoundResult.Name <> '.') and
             (FoundResult.Name <> '..') then
          begin
            if ThousandSeparator = ',' then Point := '.' else Point := ',';
            NewItem := ListView1.Items.Add;
            NewItem.Caption := FoundResult.Name;
            KbSize :=(FoundResult.Size / 1024) / 1;
            if KbSize < 1 then KbSize := 1;
            FileSize := FormatFloat('###' + Point + '### Kb', KbSize);
            NewItem.SubItems.Add(FileSize);
            FileDate := formatdatetime('dd-mm-yyyy', FileDateToDateTime(FoundResult.Time));
            NewItem.SubItems.Add(FileDate);
          end;
        until FindNext(FoundResult) <> 0;
      finally
          FindClose(FoundResult);
    //      ListView1.Items.EndUpdate;
      end;
     
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Test;
    end;
     
    end.
    dfm
    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
    object Form1: TForm1
      Left = 354
      Top = 214
      Width = 690
      Height = 531
      Caption = 'Form1'
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      PixelsPerInch = 96
      TextHeight = 13
      object ListView1: TListView
        Left = 20
        Top = 24
        Width = 389
        Height = 445
        Columns = <
          item
            Caption = 'Nom'
            Width = 200
          end
          item
            Caption = 'Taille'
            Width = 80
          end
          item
            Caption = 'Date'
            Width = 80
          end>
        TabOrder = 0
        ViewStyle = vsReport
      end
      object DirectoryEdit1: TDirectoryEdit
        Left = 28
        Top = 0
        Width = 197
        Height = 21
        NumGlyphs = 1
        TabOrder = 1
        Text = 'DirectoryEdit1'
      end
      object Button1: TButton
        Left = 420
        Top = 4
        Width = 75
        Height = 25
        Caption = 'Button1'
        TabOrder = 2
        OnClick = Button1Click
      end
    end
    Le résultat est ok (je m'attache pas aux colonnes tailles et dates )
    Nom : Capturer.PNG
Affichages : 257
Taille : 24,3 Ko
    J'ai un moment cru que les BeginUpdate et EndUpdate jouent, je les aient donc commentés/dé-commentés exécutions identiques

    [Edit]pour ce qui est de la taille qui me faisait "tiquer" voilà mon choix :
    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
    procedure TForm1.Test;
    var
      FoundResult : TSearchRec;
      i, j : Integer;
      StrPath : String;
      NewItem: TListItem;
      FileDate, FileSize, FileName : String;
      Point : Char;
      KbSize : Double;
    begin
      // bien sûr on peut se dispenser de cet ajout si on veut garder les FormatSettings du poste
      Point:=ThousandSeparator;    // J'utilise la variable point pour mémoriser le séparateur de millier de l'environnement
      ThousandSeparator:=',';         // j'indique que je veux toujours une virgule comme séparateur
      ListView1.Items.Clear;
      StrPath := DirectoryEdit1.Text+'\';
      ListView1.Items.BeginUpdate;
      if FindFirst(StrPath + '*.*', faAnyFile, FoundResult) = 0 then
      try
    //    Msg := '';
        repeat
          if ((FoundResult.Attr and faDirectory) <= 0) and (FoundResult.Name <> '.') and
             (FoundResult.Name <> '..') then
          begin
            NewItem := ListView1.Items.Add;
            NewItem.Caption := FoundResult.Name;
            KbSize :=(FoundResult.Size / 1024) / 1;
            if KbSize < 1 then KbSize := 1;
            FileSize := Format('%1.0n Kb',[Int(KbSize)]);    // j'utilise Format et arrondi kbSize 
            NewItem.SubItems.Add(FileSize);
            FileDate := formatdatetime('dd-mm-yyyy', FileDateToDateTime(FoundResult.Time));
            NewItem.SubItems.Add(FileDate);
          end;
        until FindNext(FoundResult) <> 0;
      finally
          FindClose(FoundResult);
          ListView1.Items.EndUpdate;
          ThousandSeparator:=point;      //si on a changé les FormatSettings retour à l'environnement du poste 
      end;
    end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Même résultat négatif avec cette source mais en gardant PathLbl.Caption au lieu de RxDirectoryEdit.
    J'ai vu plusieurs éditeurs qui proposent RxDirectory mais j'ai peine à croire que le problème vient de là. Après tout il ne s'agit que de récupérer un chemin mon ShowMessage montre que PathLbl.Caption le fait bien.
    Je parie qu'en remplacant RxDirectoryEdit par un Label conventionnel ta source fonctionnera. Ce qui voudrait dire que D4 a complètement remanié TListView par rapport à D3.
    La question est de savoir pourquoi les données ne sont pas enregistrées dans FilesListView alors que showMessage renvoie ces données et qu'en fin de remplissage FilesListView.Items.Count est exact. C'est comme si FilesListView était vidé de ses valeurs items et SubItems tout en maintenant ces items vide.
    Et cela se passerait forcément à la sortie de la boucle Repeat ...Until FileNext.

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par defluc Voir le message
    Je parie qu'en remplacant RxDirectoryEdit par un Label conventionnel ta source fonctionnera
    c'est certain, c'est juste que pour faire vite j'ai utilisé RxDirectory afin d'éviter une erreur de nom de répertoire et naviguer rapidement
    Ce qui voudrait dire que D4 a complètement remanié TListView par rapport à D3.
    j'ai un doute mais je n'ai pas D4 installé au mieux, je peux tester avec D7. J'ai bien un D5 dans une boite, un D6 qui traine quelque part mais ...

    [Edit] Sous D7 (RxDirectory remplacé par un TEdit) ça fonctionne tout pareil que D3
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  13. #13
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,
    j'ai testé le code de SergioMaster en D7 : il fonctionne parfaitement (avec FindFirst et en créant les colonnes dans le TListView)

    Mon code fonctionne aussi en créant les colonnes dans le code

    Ce doit être un problème de D4 ?

    A+
    Charly

  14. #14
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,

    J'ai combiné en les adaptant des bout de code trouvés sur le net et finalement j'ai une solution fonctionnelle sous Delphi 4 en utilisant des listes virtuelles.
    Les prémices se font dans l'évènement onShow de la fiche contenant la listView.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TListViewForm.FormShow(Sender: TObject);
    begin
      PathLbl.Caption := IncludeTrailingPathDelimiter(MainForm.PathEdit.Text);
      SetPath(PathLbl.Caption);
    end;
    Le handle du chemin est fixé par la procédure suivante
    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
    procedure TListViewForm.SetPath(const Value: string);
    var
      P: PWideChar;
      NewPIDL: PItemIDList;  //  From ShObj
      Flags,
      NumChars: LongWord;
      PathName : String;
    begin
      PathName := IncludeTrailingPathDelimiter(PathLbl.Caption);
      NumChars := Length(Value);
      Flags := 0;
      P := StringToOleStr(Value);
      OLECheck(FIDesktopFolder.ParseDisplayName(Application.Handle, nil, P,
      NumChars, NewPIDL, Flags));   //  Formation et remplissage de la PItemIDList
      SetPath(NewPIDL, PathName);   //  par shell API
    end;
     
    procedure TListViewForm.SetPath(ID : PItemIDList; PathName : String);
    var
      Index: Integer;
      NewShellFolder: IShellFolder;
    begin
       OLECheck(FIDesktopFolder.BindToObject(ID, nil,
                IID_IShellFolder, Pointer(NewShellFolder)));
       FilesListView.Items.BeginUpdate;
      try
        FillIDList(NewShellFolder, PathName);  //  La listView est remplie
        FPIDL := ID;                                      //  par la procedure FillIDList
        FPath := GetDisplayName(FIDesktopFolder, FPIDL, True);
      finally
        FilesListView.Items.EndUpdate;
      end;
    end;
    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
    procedure TListViewForm.FillIDList(ShellFolder : IShellFolder; PathName : String);
    const                                         //  $00000800 laisse passer
        Flags = $00000800 or SHCONTF_NONFOLDERS;  //  les dossiers zippés
    var
      ID: PItemIDList;
      EnumList: IEnumIDList;
      NumIDs: LongWord;
      SaveCursor: TCursor;
      ShellItem: PShellItem;
      ZipOrOtherFile : Boolean;
      FullFileName : File;
    begin
      SaveCursor := Screen.Cursor;
      try
        Screen.Cursor := crHourglass;
        OleCheck(ShellFolder.EnumObjects(Application.Handle, Flags, EnumList));
        FIShellFolder := ShellFolder;
        ClearIDList;
        while EnumList.Next(1, ID, NumIDs) = S_OK do
        begin
          ShellItem := New(PShellItem);
          ShellItem.ID := ID;
          ShellItem.DisplayName := GetDisplayName(FIShellFolder, ID, False);
          ShellItem.Empty := True;
          AssignFile(FullFileName, PathName + ShellItem.DisplayName);
          if FileGetAttr(PathName + ShellItem.DisplayName) and faDirectory <> 0 then Continue;
          FIDList.Add(ShellItem);
        end;
        FIDList.Sort(ListSortFunc);
        FilesListView.Items.Count := FIDList.Count;
        FilesListView.Repaint;
      finally
        Screen.Cursor := SaveCursor;
      end;
    end;
    function GetDisplayName(ShellFolder: IShellFolder; PIDL: PItemIDList;
                            ForParsing: Boolean): string;
    var                     //  Encapsulation des infos du dossier
      StrRet: TStrRet;
      P: PChar;
      Flags: Integer;
    begin
      Result := '';
      if ForParsing then
        Flags := SHGDN_FORPARSING
      else
        Flags := SHGDN_NORMAL;
      ShellFolder.GetDisplayNameOf(PIDL, Flags, StrRet); //  from ShObj
      case StrRet.uType of
        STRRET_CSTR:
          SetString(Result, StrRet.cStr, lStrLen(StrRet.cStr));
        STRRET_OFFSET:
          begin
            P := @PIDL.mkid.abID[StrRet.uOffset - SizeOf(PIDL.mkid.cb)];
            SetString(Result, P, PIDL.mkid.cb - StrRet.uOffset);
          end;
        STRRET_WSTR:
          Result := StrRet.pOleStr;
      end;
    end;
    L'évènement FilesListViewOnDataHint doit être affecté du code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TListViewForm.FilesListViewDataHint(Sender: TObject; StartIndex,
      EndIndex: Integer);
    begin
      //OnDataHint is called before OnData. This gives you a chance to
      //initialize only the data structures that need to be drawn.
      //You should keep track of which items have been initialized so no
      //extra work is done.
      if (StartIndex > FIDList.Count) or (EndIndex > FIDList.Count) then Exit;
      CheckShellItems(StartIndex, EndIndex);
    end;
    Il en va de même pour l'évènement FilesListViewOnData.
    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
    procedure TListViewForm.FilesListViewData(Sender: TObject; Item: TListItem);
    Var
     FoundResult : TSearchRec;
    begin
      //OnData gets called once for each item for which the ListView needs
      //data. If the ListView is in Report View, be sure to add the subitems.
      //Item is a "dummy" item whose only valid data is it's index which
      //is used to index into the underlying data.
      if (Item.Index > FIDList.Count) then Exit;
      with ShellItem(Item.Index)^ do
      begin
        Item.Caption := DisplayName;
        Item.ImageIndex := ImageIndex;
        if FilesListView.ViewStyle <> vsReport then Exit;
        Item.SubItems.Add(Format('%dKB', [Size]));
        try
          Item.SubItems.Add(ModDate);
        except
        end;
      end;
    end;
    Autres procédures utilisées
    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
    procedure TListViewForm.ClearIDList;
    var
      I: Integer;
    begin
      for I := 0 to FIDList.Count-1 do
      begin
        DisposePIDL(ShellItem(I).ID);
        Dispose(ShellItem(I));
      end;
      FIDList.Clear;
    end;
    procedure DisposePIDL(ID: PItemIDList);
    var
      Malloc: IMalloc;
    begin
      if ID = nil then Exit;
      OLECheck(SHGetMalloc(Malloc));
      Malloc.Free(ID);
    end;
    Cordialement

  15. #15
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,

    Bien, mais pas simple ! tu est sûr que tu n'aurais pas intérêt à passer à D7 (pratiquement sans modif du code) ou mieux à D10.2 CE ?

    A+
    Charly

  16. #16
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Je n'ai jamais upgradé ma license de Dephi 4 Pro. Aujourd'hui, je ne crois pas possible d'acquérir légalement une license D7 Pro.
    Et même si c'était le cas, le coût ne vaudrait pas la maintenance de quelques applications.

  17. #17
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    C'est vrai que seule la version personnelle de D7 est gratuite. Sinon D10.2 CE est gratuit : inconvénients un peu plus de travail pour porter les applis depuis D4 et des exe beaucoup plus volumineux.

    A+
    Charly

Discussions similaires

  1. [VB.NET] Suppression d'un fichier chargé dans un WebBrowser
    Par Vonotar dans le forum Windows Forms
    Réponses: 9
    Dernier message: 27/09/2004, 11h09
  2. Réponses: 4
    Dernier message: 22/12/2003, 11h12
  3. Réponses: 8
    Dernier message: 14/11/2003, 22h51
  4. Réponses: 2
    Dernier message: 11/08/2003, 13h43
  5. [LG]suppression dans un fichier
    Par cedrick essale dans le forum Langage
    Réponses: 5
    Dernier message: 10/08/2003, 15h22

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