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

Composants VCL Delphi Discussion :

Composant détectant l'insertion d'une clé USB


Sujet :

Composants VCL Delphi

  1. #1
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut Composant détectant l'insertion d'une clé USB
    Bonsoir,

    Une idée m'est venue à l'esprit, c'est de faire un composant qui me permettrait de récupérer un peu tout ce dont j'ai besoin lorsqu'une clé USB est insérer.

    Pour celà, j'avais vu sur ce forum un morceau de code qui permettait de détecter l'insertion ou le retrait de clé usb, CDROM ...

    Sans utiliser le composant, j'arrive à récupérer correctement mes informations par contre, je n'y arrive pas en passant par ce dernier ...

    Voici mon code :

    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
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    unit UMedia;
     
    interface
     
    uses Windows,Messages,Classes,SysUtils,Dialogs;
     
    const
      DBT_DEVICEARRIVAL          = $8000;          // system detected a new device
      DBT_DEVICEREMOVECOMPLETE   = $8004;          // device is gone
      DBT_DEVTYP_VOLUME          = $00000002;      // device volume class
     
     
    type
      PDevBroadcastHdr  = ^DEV_BROADCAST_HDR;
      PDevBroadcastHeader  = PDevBroadcastHdr;
      DEV_BROADCAST_HDR = packed record
        dbch_size: DWORD;
        dbch_devicetype: DWORD;
        dbch_reserved: DWORD;
    end;
     
      PDevBroadcastVolume        =  ^DEV_BROADCAST_VOLUME;
      DEV_BROADCAST_VOLUME      =  packed record
         dbch_size:              DWORD;
         dbch_devicetype:        DWORD;
         dbch_reserved:          DWORD;
         dbcv_unitmask:          DWORD;
         dbcv_flags:             WORD;
    end;
     
    type TMediaConnected = class(TComponent)
      private
        LettreLecteur:char;
        VolName     : Array[0..Max_Path]Of Char;
        FileSysName : Array[0..Max_Path]Of Char;
        VolSerial   : DWord;
        FileMaxLen  : DWord;
        FileFlags   : DWord;
        EspaceLibre : double;
        EspaceTotal : double;
        EspaceOccupe: double;
        procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
      public
        function GetSerialVolume:Cardinal;
        function GetNameVolume:String;
        function GetFreeSpace(TypeSizeReturn:String='octet'):double;
        function GetBusySpace(TypeSizeReturn:String='octet'):double;
        function GetSpace(TypeSizeReturn:String='octet'):double;
        function GetLetterMedia:char;
     
    end;
     procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('Media',[TMediaConnected]);
    end;
     
    procedure TMediaConnected.WMDeviceChange(var Msg: TMessage);
    var
    PHeader : PDevBroadcastHeader;
    PData : PDevBroadcastVolume;
    Index : Integer;
     
    begin
    inherited;
      PHeader:=PDevBroadcastHeader(Msg.lParam);
      LettreLecteur:=#0;
      case Msg.WParam of
        DBT_DEVICEARRIVAL :
        begin
          if (PHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
          begin
            PData:=PDevBroadcastVolume(Msg.lParam);
            for Index:=0 to 25 do
            if ((PData^.dbcv_unitmask shr Index) = 1) then
            begin
              LettreLecteur:=Chr(65+Index);
              break;
            end;
              If GetVolumeInformation(PChar(LettreLecteur+':\'),VolName,Max_Path,@VolSerial, FileMaxLen, FileFlags,FileSysName,Max_Path) then
              begin
              EspaceLibre:=DiskFree(Ord(LettreLecteur)-64);
              EspaceTotal:=DiskSize(Ord(LettreLecteur)-64);
              EspaceOccupe:=EspaceTotal-EspaceLibre;
              end;
          end;
        end;
     
        DBT_DEVICEREMOVECOMPLETE:
        begin
          if (PHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
          begin
            PData:=PDevBroadcastVolume(Msg.lParam);
            for Index:=0 to 25 do
            if ((PData^.dbcv_unitmask shr Index) = 1) then
            begin
              LettreLecteur:=Chr(65+Index);
              break;
            end;
          end;
        end;
      end;
    end;
     
    function TMediaConnected.GetSerialVolume:cardinal;
    begin
      Result:=VolSerial;
    end;
     
    function TMediaConnected.GetNameVolume:string;
    begin
      Result:=VolName;
    end;
     
    function TMediaConnected.GetLetterMedia:char;
    begin
      Result:=LettreLecteur;
    end;
     
    function TMediaConnected.GetFreeSpace(TypeSizeReturn:String='octet'):double;
    var
    typeOfSize:TStringList;
    begin
      typeOfSize:=TStringList.Create;
      typeOfSize.Add('Ko');
      typeOfSize.Add('Mo');
      typeOfSize.Add('Go');
      case typeOfSize.IndexOf(TypeSizeReturn) of
        0: Result:=EspaceLibre / 1024;
        1: Result:=EspaceLibre / 1048576;
        2: Result:=EspaceLibre / 1073741824;
        else
          Result:=EspaceLibre;
      end;
      typeOfSize.Free;
    end;
     
    function TMediaConnected.GetBusySpace(TypeSizeReturn:String='octet'):double;
    var
    typeOfSize:TStringList;
    begin
      typeOfSize:=TStringList.Create;
      typeOfSize.Add('Ko');
      typeOfSize.Add('Mo');
      typeOfSize.Add('Go');
      case typeOfSize.IndexOf(TypeSizeReturn) of
        0: Result:=EspaceLibre / 1024;
        1: Result:=EspaceLibre / 1048576;
        2: Result:=EspaceLibre / 1073741824;
        else
          Result:=EspaceLibre;
      end;
      typeOfSize.Free;
    end;
     
    function TMediaConnected.GetSpace(TypeSizeReturn:String='octet'):double;
    var
    typeOfSize:TStringList;
    begin
      typeOfSize:=TStringList.Create;
      typeOfSize.Add('Ko');
      typeOfSize.Add('Mo');
      typeOfSize.Add('Go');
      case typeOfSize.IndexOf(TypeSizeReturn) of
        0: Result:=(EspaceTotal - EspaceLibre) / 1024;
        1: Result:=(EspaceTotal - EspaceLibre) / 1048576;
        2: Result:=(EspaceTotal -EspaceLibre) / 1073741824;
        else
          Result:=EspaceTotal -EspaceLibre;
      end;
      typeOfSize.Free;
    end;
    end.
    Est-ce possible de récupérer les infos de cette manière ou dois-je obligatoirement passer par la méthode standard, c'est à dire ne pas créer de composant ?

    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 700
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 044
    Points
    15 044
    Par défaut
    Salut !

    j'avais vu sur ce forum un morceau de code qui permettait de détecter (...)
    Pas trouvé... Tu le mets en œuvre comment, ton bazar ?
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Re-Bonsoir,

    Je vais essayer d'être plus explicite ...

    J'ai utilisé le code provenant de ce topic :

    http://www.developpez.net/forums/sho...d.php?t=121998

    Mon idée, c'était de faire un composant (non visuel donc comme par exemple les OpenDialogs) qui me permettrait de mettre en oeuvre de façon simple la détection de clé USB lors de son insertion ou de son retrait.

    Je me suis dit que j'allais donc créer le composant à partir de la classe TComponent (j'espère d'ailleurs que je ne me trompe pas).

    Au delà du fait que je n'aperçoit pas mon composant dans la palette de Delphi après compilation de la source, je n'arrive pas à mettre en oeuvre le système de détection de clé USB via cette source...

    Lorsque je veux faire appel à mon composant, je fais ceci :
    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,UMedia, StdCtrls, DB, DBTables;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Query1: TQuery;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      MonAppareilUSB:TMediaConnected;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      // Crétion de mon Objet
      MonAppareilUSB:=TMediaConnected.Create(Self);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      // Avant de cliquer sur le bouton, j'insère une clé USB pour récupérer les infos
     //Là je devrais avoir son nom de volume mais rien (de devrais avoir Mandriva)
      ShowMessage(MonAppareilUSB.GetNameVolume);
    end;
    Voilà pour les explications ...
    J'espère que c'est plus clair...
    A+

  4. #4
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Il ne te manquerait pas les méthode Create et Destroy?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      public
        { Déclarations publiques }
        constructor Create(aOwner: Tcomponent); override;
        destructor Destroy; override;
    Je n'ai pas Testé ton code encore ...

  5. #5
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par petitprince Voir le message
    Il ne te manquerait pas les méthode Create et Destroy?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      public
        { Déclarations publiques }
        constructor Create(aOwner: Tcomponent); override;
        destructor Destroy; override;
    Je n'ai pas Testé ton code encore ...
    Hé bien, je ne pense pas ... J'ai tout de même ajouter ceci :

    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
    public
        constructor Create(aOwner: Tcomponent); override;
        destructor Destroy; override;
     
    implementation
     
    Constructor TMediaConnected.Create(aOwner:TComponent);
    begin
      inherited;
    end;
     
    Destructor TMediaConnected.Destroy;
    begin
      inherited;
    end;
    Celà ne fonctionne pas tout de même

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    C'est assez spéciale l'utilisation d'un TStringList dans tes fonctions GetXXXSpace.

    Je verrais plutôt l'utilisation d'une constante énumérée:
    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
     
    type
      TTypeSizeOf = (tsoByte, tsoKiloByte, tsoMegaByte);
     
      // ...
     
    implementation
     
    function FormatSize(Value: Double; TypeSizeReturn: TTypeSizeOf): Double;
    begin
      case TypeSizeReturn of
        tsoByte:      Result := Value / 1024;
        tsoKiloByte:  Result := Value / 1048576;
        tsoMegaByte:  Result := Value / 1073741824;
        else
          Result := Value;
      end;
    end;
     
    function TMediaConnected.GetFreeSpace(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
    begin
      result := FormatSize(FFreeSpace, TypeSizeReturn);
    end;
     
    function TMediaConnected.GetBusySpace(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
    begin
      result := FormatSize(FBuzySpace, TypeSizeReturn);
    end;
     
    function TMediaConnected.GetSize(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
    begin
      result := FormatSize(FSize, TypeSizeReturn);
    end;
    [Edit]
    Dans le cas présent, je ne vois pas trop l'intérêt d'écrire un composant. Tu n'as pas de propriétés publiées, et toutes les infos sont en lecture-seule.
    Cette simple unité que tu adjoins à ton projet, cela me semble suffisant.

    @+ Claudius

  7. #7
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut Cl@udius,

    En ce qui concerne une constante énumérée j'y avais tout simplement pas pensé et c'est vrai que l'utilisation d'un TStringList dans les accesseurs me chagrinais! C'est désormais chose résolue

    Pour ce qui est de faire un composant, j'en suis juste à mes débuts ... En fait, actuellement je sais juste lorsque j'ai une Clé USB qui est insérer ou enlevé, idem pour les CDRom et peut être aussi avec les WebCam (pas testé). Par la suite, il y aura des propriétés pour savoir ce que l'on veut détecter ou pas et j'ai envie, mais là c'est une chose que je ne saurais faire seul, c'est de pourvoir exécuter du code à l'insertion ou retrait du périphérique en question ... Je sais où je dois mettre le code lorsque je passe par une utilisation simple du code (c'est à dire pas de composant mais uniquement un copié collé du code sur la Form adéquate)...

    Je vais surement dire une grosse bétise, mais je ne vois pas comment expliquer autrement.

    Lorsque l'on regarde le code du 'composant', on à ceci en private :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
    C'est ceci qui est déclenché à chaque utilisation de port USB ...
    Ce qui serait assez bien de faire, (mais là je crains le pire) c'est de faire des événements OnConnect, OnDisconnect pour que l'on puisse exécuter du code à ces endroits ...
    Je ne sais pas si j'arrive à me faire comprendre

    Enfin bref, pour le moment, je n'arrive même pas à détecter le média connecté. C'est peut-être impossible via ma façon de faire ...

    Merci de m'éclairer

  8. #8
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Mais biensûr que l'on peut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
    begin
    ...
     if Assigned(FonConnect) then
         FOnConnect(Self);
    end;
    Le problème vient de WMDeviceChange, car utilisé sur une form, il n'y a pas de problème !

  9. #9
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par petitprince Voir le message
    Mais biensûr que l'on peut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
    begin
    ...
     if Assigned(FonConnect) then
         FOnConnect(Self);
    end;
    Le problème vient de WMDeviceChange, car utilisé sur une form, il n'y a pas de problème !
    Heu, oué ... Je suis pas trop à l'aise avec ça
    Donc je défini FOnConnect dans la partie published c'est bien ça?
    Et là, la Assigned test si il y a du code, si oui, on fait le code défini par l'utilisateur, sinon le mien (c'est une explication assez large ...)

    Merci

  10. #10
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 700
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 044
    Points
    15 044
    Par défaut
    Yep !

    Ça serait-y pas lié à la proc WMDeviceChange ? Sous-entendu qu'elle devrait être implémentée dans le thread principal (celui de la form) ? Parce que le code du post que tu cites fonctionne...

    Pour avoir le composant dans la palette, as-tu créé un fichier .dcr avec icône ?

    @Claudius : mets-toi à la page, :
    TTypeSizeOf = (tsoByte, tsoKiloByte, tsoMegaByte, tsoGigabyte, tsoTeraByte);

    Mes 2 cts,
    --
    jp
    [edit]bon, grillé par petitprince... [/edit]
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  11. #11
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Déjà, avant de ce lancer là dedans..... Comprenons pourquoi ça ne marche pas .......
    En réponse à Jipété, oui en effet, le code fonctionne impec, sur une Form... Le problème est ici !

  12. #12
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par petitprince Voir le message
    Déjà, avant de ce lancer là dedans..... Comprenons pourquoi ça ne marche pas .......
    Oui, je suis tout à fait d'accord

    Comme le dit Jipété, le code fonctionne sur la Form ... et pas comme moi je l'ai défini et je n'ai pas assez d'expérience pour trouver tout seul comment faire ce genre de chose

  13. #13
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 700
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 044
    Points
    15 044
    Par défaut
    Inspire-toi de Torry... (non testé).
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  14. #14
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Inspire-toi de Torry... (non testé).
    --
    jp
    J'essaierai de voir celà cette aprem ... Pas simple tout de même
    Merci

  15. #15
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Bon et bien après un "mix" de tout ceci, voilà ce que ça peut donner ....

    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
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    unit AntMediaConnected;
     
    interface
     
    uses Windows, Messages, SysUtils, Classes, Forms, Dialogs;
     
    const
      DBT_DEVICEARRIVAL          = $8000;          // system detected a new device
      DBT_DEVICEREMOVECOMPLETE   = $8004;          // device is gone
      DBT_DEVTYP_VOLUME          = $00000002;      // device volume class
     
     
    type
      PDevBroadcastHdr  = ^DEV_BROADCAST_HDR;
      PDevBroadcastHeader  = PDevBroadcastHdr;
      DEV_BROADCAST_HDR = packed record
        dbch_size: DWORD;
        dbch_devicetype: DWORD;
        dbch_reserved: DWORD;
      end;
     
      PDevBroadcastVolume =  ^DEV_BROADCAST_VOLUME;
      DEV_BROADCAST_VOLUME  =  packed record
         dbch_size: DWORD;
         dbch_devicetype: DWORD;
         dbch_reserved: DWORD;
         dbcv_unitmask: DWORD;
         dbcv_flags: WORD;
      end;
     
    type
      TTypeSizeOf = (tsoByte, tsoKiloByte, tsoMegaByte, tsoGigabyte, tsoTeraByte);
     
      TMediaConnected = class(TComponent)
      private
        FDeviceLetter: Char;
        FVolName: Array[0..Max_Path]Of Char;
        FileSysName : Array[0..Max_Path]Of Char;
        FVolSerial   : DWord;
        FileMaxLen  : DWord;
        FileFlags   : DWord;
        FFreeSpace : double;
        FSize : double;
        FBusySpace: double;
        FWindowHandle: HWND;
        FOnUSBArrival: TNotifyEvent;
        FOnUSBRemove: TNotifyEvent;
        procedure WndProc(var Msg: TMessage);
       // function USBRegister: Boolean;
      protected
        procedure WMDeviceChange(var Msg: TMessage); dynamic;
      public
        function GetSerialVolume: Cardinal;
        function GetNameVolume: String;
        function GetFreeSpace(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
        function GetBusySpace(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
        function GetSize(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
        function GetLetterMedia: Char;
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival;
        property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove;
      end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('AntFIRST',[TMediaConnected]);
    end;
     
    {==============================================================================}
    {                                TMediaConnected                               }
    {==============================================================================}
    function FormatSize(Value: Double; TypeSizeReturn: TTypeSizeOf): Double;
    begin
      case TypeSizeReturn of
        tsoByte:      Result := Value / 1024;
        tsoKiloByte:  Result := Value / 1048576;
        tsoMegaByte:  Result := Value / 1073741824;
        else
          Result := Value;
      end;
    end;
    //------------------------------------------------------------------------------
    constructor TMediaConnected.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FWindowHandle := AllocateHWnd(WndProc);
      //USBRegister;
    end;
    //------------------------------------------------------------------------------
    destructor TMediaConnected.Destroy;
    begin
      DeallocateHWnd(FWindowHandle);
      inherited Destroy;
    end;
    //------------------------------------------------------------------------------
    procedure TMediaConnected.WndProc(var Msg: TMessage);
    begin
      if (Msg.Msg = WM_DEVICECHANGE) then 
      begin
        try
          WMDeviceChange(Msg);
        except
          Application.HandleException(Self);
        end;
      end
      else
        Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
    end;
    //------------------------------------------------------------------------------
    procedure TMediaConnected.WMDeviceChange(var Msg: TMessage);
    var
      PHeader : PDevBroadcastHeader;
      PData : PDevBroadcastVolume;
      Index : Integer;
    begin
      inherited;
      PHeader:=PDevBroadcastHeader(Msg.lParam);
      FDeviceLetter:=#0;
      case Msg.WParam of
        DBT_DEVICEARRIVAL :
        begin
          if (PHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
          begin
            PData:=PDevBroadcastVolume(Msg.lParam);
            for Index:=0 to 25 do
            if ((PData^.dbcv_unitmask shr Index) = 1) then
            begin
              FDeviceLetter:=Chr(65+Index);
              break;
            end;
              if GetVolumeInformation(PChar(FDeviceLetter+':\'),FVolName,Max_Path,@FVolSerial, FileMaxLen, FileFlags,FileSysName,Max_Path) then
              begin
                FFreeSpace:=DiskFree(Ord(FDeviceLetter)-64);
                FSize:=DiskSize(Ord(FDeviceLetter)-64);
                FBusySpace:= FSize - FFreeSpace;
              end;
          end;
          if Assigned(FOnUSBArrival) then
              FOnUSBArrival(Self);
        end;
     
        DBT_DEVICEREMOVECOMPLETE:
        begin
          if (PHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
          begin
            PData:=PDevBroadcastVolume(Msg.lParam);
            for Index:=0 to 25 do
            if ((PData^.dbcv_unitmask shr Index) = 1) then
            begin
              FDeviceLetter:=Chr(65+Index);
              break;
            end;
          end;
          if Assigned(FOnUSBRemove) then
              FOnUSBRemove(Self);
        end;
      end;
    end;
    //------------------------------------------------------------------------------
    function TMediaConnected.GetSerialVolume:cardinal;
    begin
      Result:=FVolSerial;
    end;
    //------------------------------------------------------------------------------
    function TMediaConnected.GetNameVolume:string;
    begin
      Result:=FVolName;
    end;
    //------------------------------------------------------------------------------
    function TMediaConnected.GetLetterMedia:char;
    begin
      Result:=FDeviceLetter;
    end;
    //------------------------------------------------------------------------------
    function TMediaConnected.GetFreeSpace(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
    begin
      result := FormatSize(FFreeSpace, TypeSizeReturn);
    end;
    //------------------------------------------------------------------------------
    function TMediaConnected.GetBusySpace(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
    begin
      result := FormatSize(FBusySpace, TypeSizeReturn);
    end;
    //------------------------------------------------------------------------------
    function TMediaConnected.GetSize(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
    begin
      result := FormatSize(FSize, TypeSizeReturn);
    end;
     
    end.

  16. #16
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par petitprince Voir le message
    Bon et bien après un "mix" de tout ceci, voilà ce que ça peut donner ....

    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
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    unit AntMediaConnected;
     
    interface
     
    uses Windows, Messages, SysUtils, Classes, Forms, Dialogs;
     
    const
      DBT_DEVICEARRIVAL          = $8000;          // system detected a new device
      DBT_DEVICEREMOVECOMPLETE   = $8004;          // device is gone
      DBT_DEVTYP_VOLUME          = $00000002;      // device volume class
     
     
    type
      PDevBroadcastHdr  = ^DEV_BROADCAST_HDR;
      PDevBroadcastHeader  = PDevBroadcastHdr;
      DEV_BROADCAST_HDR = packed record
        dbch_size: DWORD;
        dbch_devicetype: DWORD;
        dbch_reserved: DWORD;
      end;
     
      PDevBroadcastVolume =  ^DEV_BROADCAST_VOLUME;
      DEV_BROADCAST_VOLUME  =  packed record
         dbch_size: DWORD;
         dbch_devicetype: DWORD;
         dbch_reserved: DWORD;
         dbcv_unitmask: DWORD;
         dbcv_flags: WORD;
      end;
     
    type
      TTypeSizeOf = (tsoByte, tsoKiloByte, tsoMegaByte, tsoGigabyte, tsoTeraByte);
     
      TMediaConnected = class(TComponent)
      private
        FDeviceLetter: Char;
        FVolName: Array[0..Max_Path]Of Char;
        FileSysName : Array[0..Max_Path]Of Char;
        FVolSerial   : DWord;
        FileMaxLen  : DWord;
        FileFlags   : DWord;
        FFreeSpace : double;
        FSize : double;
        FBusySpace: double;
        FWindowHandle: HWND;
        FOnUSBArrival: TNotifyEvent;
        FOnUSBRemove: TNotifyEvent;
        procedure WndProc(var Msg: TMessage);
       // function USBRegister: Boolean;
      protected
        procedure WMDeviceChange(var Msg: TMessage); dynamic;
      public
        function GetSerialVolume: Cardinal;
        function GetNameVolume: String;
        function GetFreeSpace(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
        function GetBusySpace(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
        function GetSize(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
        function GetLetterMedia: Char;
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival;
        property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove;
      end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('AntFIRST',[TMediaConnected]);
    end;
     
    {==============================================================================}
    {                                TMediaConnected                               }
    {==============================================================================}
    function FormatSize(Value: Double; TypeSizeReturn: TTypeSizeOf): Double;
    begin
      case TypeSizeReturn of
        tsoByte:      Result := Value / 1024;
        tsoKiloByte:  Result := Value / 1048576;
        tsoMegaByte:  Result := Value / 1073741824;
        else
          Result := Value;
      end;
    end;
    //------------------------------------------------------------------------------
    constructor TMediaConnected.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FWindowHandle := AllocateHWnd(WndProc);
      //USBRegister;
    end;
    //------------------------------------------------------------------------------
    destructor TMediaConnected.Destroy;
    begin
      DeallocateHWnd(FWindowHandle);
      inherited Destroy;
    end;
    //------------------------------------------------------------------------------
    procedure TMediaConnected.WndProc(var Msg: TMessage);
    begin
      if (Msg.Msg = WM_DEVICECHANGE) then 
      begin
        try
          WMDeviceChange(Msg);
        except
          Application.HandleException(Self);
        end;
      end
      else
        Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
    end;
    //------------------------------------------------------------------------------
    procedure TMediaConnected.WMDeviceChange(var Msg: TMessage);
    var
      PHeader : PDevBroadcastHeader;
      PData : PDevBroadcastVolume;
      Index : Integer;
    begin
      inherited;
      PHeader:=PDevBroadcastHeader(Msg.lParam);
      FDeviceLetter:=#0;
      case Msg.WParam of
        DBT_DEVICEARRIVAL :
        begin
          if (PHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
          begin
            PData:=PDevBroadcastVolume(Msg.lParam);
            for Index:=0 to 25 do
            if ((PData^.dbcv_unitmask shr Index) = 1) then
            begin
              FDeviceLetter:=Chr(65+Index);
              break;
            end;
              if GetVolumeInformation(PChar(FDeviceLetter+':\'),FVolName,Max_Path,@FVolSerial, FileMaxLen, FileFlags,FileSysName,Max_Path) then
              begin
                FFreeSpace:=DiskFree(Ord(FDeviceLetter)-64);
                FSize:=DiskSize(Ord(FDeviceLetter)-64);
                FBusySpace:= FSize - FFreeSpace;
              end;
          end;
          if Assigned(FOnUSBArrival) then
              FOnUSBArrival(Self);
        end;
     
        DBT_DEVICEREMOVECOMPLETE:
        begin
          if (PHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
          begin
            PData:=PDevBroadcastVolume(Msg.lParam);
            for Index:=0 to 25 do
            if ((PData^.dbcv_unitmask shr Index) = 1) then
            begin
              FDeviceLetter:=Chr(65+Index);
              break;
            end;
          end;
          if Assigned(FOnUSBRemove) then
              FOnUSBRemove(Self);
        end;
      end;
    end;
    //------------------------------------------------------------------------------
    function TMediaConnected.GetSerialVolume:cardinal;
    begin
      Result:=FVolSerial;
    end;
    //------------------------------------------------------------------------------
    function TMediaConnected.GetNameVolume:string;
    begin
      Result:=FVolName;
    end;
    //------------------------------------------------------------------------------
    function TMediaConnected.GetLetterMedia:char;
    begin
      Result:=FDeviceLetter;
    end;
    //------------------------------------------------------------------------------
    function TMediaConnected.GetFreeSpace(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
    begin
      result := FormatSize(FFreeSpace, TypeSizeReturn);
    end;
    //------------------------------------------------------------------------------
    function TMediaConnected.GetBusySpace(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
    begin
      result := FormatSize(FBusySpace, TypeSizeReturn);
    end;
    //------------------------------------------------------------------------------
    function TMediaConnected.GetSize(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
    begin
      result := FormatSize(FSize, TypeSizeReturn);
    end;
     
    end.
    Hey, j'étais arrivé à cette même conclusion à quelques détails près
    Cependant, j'arrive pas à voir ce composant dans ma palette

  17. #17
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par ero-sennin Voir le message
    Cependant, j'arrive pas à voir ce composant dans ma palette
    Il faut créer un paquet (.dpk)

  18. #18
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Il faut créer un paquet (.dpk)
    La méthode du Register n'est donc pas satisfaisante alors ?
    Bon, ba faut que je me renseigne pour créer le paquet ...

  19. #19
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Ou alors l'inclure dans le paquet dcluser.dpk (dans le sous-dossier Lib je crois).

    [edit]
    Citation Envoyé par Jipété
    @Claudius : mets-toi à la page, :
    TTypeSizeOf = (tsoByte, tsoKiloByte, tsoMegaByte, tsoGigabyte, tsoTeraByte);
    Rhoo lui, de toute façon ma clé USB fait 256Mo, alors...
    [/edit]

    @+

  20. #20
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Je suis passé par Composant, Installer un nouveau composant et j'ai sélectionné le fichier .pas correspondant à mon Compo et tout est OK

    Il me reste à jouer avec ce compo et j'essaierai de francisé un peu le tout histoire de mieux comprendre.

    Ah, je trouve ça intéressant ... Let's go

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 5 12345 DernièreDernière

Discussions similaires

  1. Réponses: 27
    Dernier message: 06/11/2014, 07h25
  2. Detection de l'insertion/retrait d'une clef USB
    Par blondelle dans le forum C++Builder
    Réponses: 1
    Dernier message: 04/04/2013, 11h48
  3. Désactiver le "contenu mixe" lors de l'insertion d'une clé USB
    Par AntonioDella dans le forum Windows XP
    Réponses: 1
    Dernier message: 11/01/2010, 19h32
  4. Besoin d'un composant graphique pour simple insertion d'une date
    Par baccarios dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 06/08/2009, 17h40

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