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

API, COM et SDKs Delphi Discussion :

Comment ouvrir un dialogue de sélection de dossiers gérant des noms de dossiers en UTF8 ?


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut Comment ouvrir un dialogue de sélection de dossiers gérant des noms de dossiers en UTF8 ?
    Je sous sous Windows 10 et Delphi 6 PE.

    Je veux ouvrr un sélecteur de dossiers (pas de fichiers !) permettant de naviguer dans l'arborescence des dossiers d'un disque et d'en sélectionner un.
    Le chemin du dossier sélectionné doit être retourné dans une variable de sorte que je puisse l'afficher dans un EDIT et éventuellement ajouter à une TLIstBox.

    J'ai un code qui fonctionne parfaitement si tous les noms des dossiers et sous-dossiers sont ENSI:

    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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      OpenDialog1 := TOpenDialog.Create(self);
    end;
     
    function BrowseDialog(const Title: string; const Flag: integer): string;
    var
      lpItemID : PItemIDList;
      BrowseInfo : TBrowseInfo;
      DisplayName : array[0..MAX_PATH] of char;
      TempPath : array[0..MAX_PATH] of char;
    begin
      Result:='';
      FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
      with BrowseInfo do begin
        hwndOwner := Application.Handle;
        pszDisplayName := @DisplayName;
        lpszTitle := PChar(Title);
        ulFlags := Flag;
      end;
      lpItemID := SHBrowseForFolder(BrowseInfo);
      if lpItemId <> nil then begin
        SHGetPathFromIDList(lpItemID, TempPath);
        Form1.ListBox1.Items.Add(TempPath);
        Result := UTF8Decode(TempPath);
        GlobalFreePtr(lpItemID);
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Dir: string;
    begin
      dir := BrowseDialog( 'Chercher un dossier', 0);
      if dir<>'' then Edit1.Text := dir
                 else Edit1.Text := '';
    end;
    Un clic sur mon bouton remplit bien mon EDIT1 avec le chemin complet du dossier sélectioné.

    Mais, il arrive que dans l'arborescence des dossiers, il y en a dont le nom comprend des caractères UTF8 (chinois japonais, grec, russe, arabe, ..).
    Dans ce cas, mon EDIT n'affiche que des "?" à la place des caractères UTF8 autres que ANSI; et, bien entendu, ce nom de dossier est inutilisable et provoque une erreur lorsque j'essaie de l'utiliser.

    J'ai essayé d'utiliser WideString pour le résultat de la fonction BrowseDialog et pour la variable Dir dans le traitement du clic du bonton, mais ça ne change rien.
    J'ai utiliser UTF8Encodeet UTF8Decodepour ces variables, mais ça ne change rien non plus.
    POURTANT: le dialogue de sélection affiche CORRECTEMENT les noms des fichiers avec caractères UTF8 !

    Comment est-ce qye je peux me sortir de ce fratras ?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    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 096
    Par défaut
    SHBrowseForFolderW au lieu de SHBrowseForFolder qui est implicitement SHBrowseForFolderA sous D6
    Il faut utiliser des WideChar, conversion avec une WideString est plus aisé mais cela alloue les chaines sur la mémoire OLE/COM mais c'est plus simple que WideCharToMultiByte

    Cependant cela ne sera pas en UTF8 mais en Unicode 16 bits Windows n'utilise pas UTF8 dans l'OS contrairement à Linux mais de l'UTF-16
    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

  3. #3
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Pour finir sur ce sujet,je poste ici le résultat de tout cela, sous la forme de mon projet complet.

    Il s'agit d'un utilitaire pouvant parcourir une arborescence quelconque de dossiers sur un disque, que ce soit C:\, un autre disque interne ou un disque amovible (USB ou autre).
    La particularité du programme réside dans le fait que les dossiers peuvent avoir des noms contenant des caractères en Unicode, ainsi que les noms des fichiers.
    Le programme cherche l'occurrence d'une chaîne de caractères partielle (mais il n'y a pas de jokers). Le critère de recherche peut contenir du texte en Unicode.
    On peut exclure un dossier particulier de la recherche.
    Pendant la recherche, n texte en bleu affiche les noms des dossiers parcourus, et les noms des fichiers trouvés sont placés dans ine TTntListBox.
    Après la recherche, le texte bleu disparaît, et le nombre de dossiers parcourus et le nombre de fichiers inspectés sont affichés.
    On peut aors spécifier un dossier de destination (fusion) vers lequel tous les fichiers de la liste seront déplacés, et supprimant éventuellement une version préexistante.
    Ce dossier de fusion peut se trouver sur un autre disque ou dans une autre arborescence.
    Mais si le dossier de fusion est à l'intérieur de l'aborescence de recherche, alors il convient de l'exclure de la recherche AVANT de lancer la recherche (voir ci-dessus).
    Pendant la copie, une barre de progression indique l'avancement du processus.

    J'ai conscience que ce code montre encore beaucoup de maladresses, mais il semble bien fonctionner et constitue ma première expérience avec Unicode.Le code est basé sur les composants TntUnicode. J'ai copié la distribution dézippée dans C:\Programmes (x86)\Borland\Delphi6\Lib et j'ai placé le chemin vers le sous-dossier Source de cette distribution dans le chemin de recherche des bibliothèques. Voici ce que ça donne:
    Nom : aa1.png
Affichages : 35
Taille : 6,6 Ko

    Voici une capture d'écran:
    Nom : aa2.PNG
Affichages : 36
Taille : 16,3 Ko

    Il y a le projetcomplet en pièce jointe, y compris l'exécutable.

  4. #4
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    J'ai essayé de suive ton conseil:

    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
    function BrowseDialog(const Title: string; const Flag: integer): widestring;
    var
      lpItemID : PItemIDList;
      BrowseInfoW : TBrowseInfoW;
      DisplayName : array[0..MAX_PATH] of char;
      pTempPath: pWideChar;
      TempPath: array[0..MAX_PATH] of widechar;
      wTemp: widestring;
    begin
      Result:='';
      FillChar(BrowseInfoW, sizeof(TBrowseInfoW), #0);            
      with BrowseInfoW do begin
        hwndOwner := Application.Handle;
        pszDisplayName := @DisplayName;
        wTemp := Title;
        lpszTitle := PWideChar(wTemp);
        ulFlags := Flag;
      end;
      lpItemID := SHBrowseForFolderW(BrowseInfoW);
      if lpItemId <> nil then begin
        SHGetPathFromIDListW(lpItemID, TempPath);
        Form1.ListBox1.Items.Add(TempPath);      // <======== ici, les caractères UTG sont toujours des "?"
        Result := TempPath;
        GlobalFreePtr(lpItemID);
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Dir: widestring;
    begin
      dir := BrowseDialog( 'Chercher un dossier', 0);
      if dir<>'' then Edit1.Text := dir      // <======== ici, les caractères UTG sont toujours des "?"
                 else Edit1.Text := '';
    end;
    Mais le résulat est identique: les caractères ANSI sont bons, mais les caractères UTF sont des "?".

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 939
    Par défaut
    Tant que tu restes au niveau du code, passer par des widestring fait l'affaire mais les contrôles orientés unicode ne sont apparus qu'avec Delphi 2009.
    Tu es obligé d'installer des composants tiers supportant ce format.

  6. #6
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    C'est ce que je craignais...

    J'ai téléchargé le TntUnicode, mais ça ne compile pas ( il manque le fichier dclact.pas ainsi que d'ailleurs dcldb.pas).
    Voici le message!
    Nom : aa1.png
Affichages : 137
Taille : 23,4 Ko

    Je pense que ces composants ne sont pas conçus pour D6 PE, mais juste pour D6 tout court. Est-ce que mon soupçon est justifié ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 939
    Par défaut
    Ce ne sont pas des fichiers .pas mais .dcp, l'équivalent des .dcu mais pour les paquets.

    A voir si tu peux facilement supprimer ces dépendances, supprimer les composants orientés DB (TNTDBxxx) et les barres d'actions.

  8. #8
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Ok, je vais essayer cela...

  9. #9
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Bon, retour à la case départ.

    J'ai enlevé les références à dclact et dcldb. Résultat: des références indéfinies en cascade (juste pour exemple: TField !).
    J'ai viré tout ce qui était concerné par des références indéfinies, ce qui vide virtuellement les modules source.

    Connaissez-vous d'aures composants VCL Unicode sans lien avec les bases de données (car j'ai D6 PE) ? Pour ma part, je n'ai rien trouvé, du moins pas dans les logiciels libres ou open source.

    Alors, j'ai essaye une autre voie. En utilisant les API Windows (CreateWindowEx et SendMessageW), j'ai créé un EDIT Windows hors VCL et j'aii pu lui envoyer des textes.
    Cependant, je n'ai pas pu lui envoyer un texte Unicode malgré un WideString. Les caractères ASCII passent bien, si j'envoie un WideChar($041), le "A" s'affiche bien, mais je n'ai pas pu envoyer un caractère au-delà des caractères ASCII habituels. Pas de message d'erreur - juste un affichage sous forme de "?".
    Est-ce une histoire de page code ? J'ai lu quelque part que la page code serait 65001. Comment le l'applique à un EDIT créé par CreateWindowEx , dont j'ai le handle ?
    Je suis dubitatif car j'ai lu que sous W10, il faur changer la page de code système dans le registre et rebouter, et que c'est ensuite valable globalement pour tout le systçme... Pourtant, la doc MicroSoft dit clairement que le contrôle EDIT créé par CreateWindowEx est d'office en Unicode.

    Je suis perdu...

  10. #10
    Invité
    Invité(e)
    Par défaut
    Il est possible d'utiliser les contrôles TntUnicode sans installation soit par création dynamique ou les charger au moment du lancement du l'application à la place des contrôles standards .
    Alors j'ai fait un test sous D7 est ça fonctionne:
    Ajouter l'adresse de dossier Source des contrôles Tntunicode dans le chemin de recherche du projet
    Ajouter l'unité TntStdCtrls dans les uses de l'unité de la fiche, il faut qu'elle soit la dernière.
    Placer la liste des contrôles que tu souhaite remplacer.

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Buttons, ExtCtrls, StdCtrls, TntStdCtrls;
     
    type
     TEdit = class(TntStdCtrls.TTntEdit);
     TMemo = class(TntStdCtrls.TTntMemo);
     TListBox = class(TntStdCtrls.TTntListBox);
     
      TForm1 = class(TForm)
        HEdit: TEdit;
        ClsEdit: TEdit;
        Txt: TMemo;
    ...

  11. #11
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    YES !!!!!!!!!!!!!!!!!!

    Parfait ! Ca marche parfaitement !

    Un GRAND MERCI à toi, rMist2024 ! J'avais bien jonglé avec l'unité source, mais je n'avais pas trouvé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
      TEdit = class(TntStdCtrls.TTntEdit);
      TMemo = class(TntStdCtrls.TTntMemo);
      TListBox = class(TntStdCtrls.TTntListBox);
    à ppacer juste après les clauses USES ! J'ai suivi tes conseils:
    1. placer le chemin vers le dossier source dans les chemins de recherche du projet (il y trouvera ll'unité TntStdCtrls)
    2. placer TntStdCtrls à la fin de la liste des clauses Uses
    3. insérer les quelques lignes "type..." juste après les clauses Uses

    Et voilà - comme par magie, le problème est résolu !

    Bravo et MERCI !

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 939
    Par défaut
    Dès lors tu peux facilement créer un nouveau paquet pour l'enregistrement dans la palette de ces trois composants.

    Ce paquet inclut juste cette unité (si les chemins de recherche sont correctement définis).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    unit TNTRegister;
     
    interface
     
    uses Classes, TntStdCtrls;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('TNT', [TTntEdit, TTntMemo, TTntListBox]);
    end;
    A moins que tu préfères tout faire par code bien sûr

  13. #13
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    J'ai une uestion complémentaire:

    D'après le même modèle, j'ai réussi à faire marcher la recherche récursive de fichiers dans une arborescence de dossiers aux noms Unicode.
    An résultat, j'obtiens un TntListBox contenant les chemins vers les fichiers recherchés, avec éventuellement des caractères IUnicode dans le chemin et/ou le nom des fichiers. C'est exactement ce que je voulais.

    Maintenant, je veux traiter ces fichiers. Mais je n'ai rien trouvé pour faire un TTntFileStream... Et TFileStream n'accepte pas les chemins contenant des caractères Unicode. Est-ce qu'io y a une solution ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 939
    Par défaut
    TTntFileStream est défini dans TNTClasses.

  15. #15
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Ok, merci !

    J'ai compris. Je vais me faire un paquet comprenant tous les composants TTnt... de base, SANS database. Et donc, j'aurai un paquet compatible avec D6 Personal Edition. C'est bien ça ? Pui, je vais ouvrir ce paquet et l'installer, et le tour sera joué.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Si tu souhaites utiliser TTntStringList il y a un remarque très important concernant le WideString ce type de texte n'utilise pas le comptage de références contrairement au string cela veut dire qu' à chaque fois qu'une assignation est faite une nouvelle copie de texte est créée c'est important de le savoir pour éviter des copies parasites surtout si la taille du texte est importante.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 939
    Par défaut
    Citation Envoyé par rMist2024 Voir le message
    il y a un remarque très important concernant le WideString ce type de texte n'utilise pas le comptage de références contrairement au string
    Les compteurs de référence n'existaient pas sous D6, string = shortstring actuel (max 255 car.)

  18. #18
    Invité
    Invité(e)
    Par défaut
    surtout, faire un SetLngth avec valeur 0 pour les strings que je n'utilise plus - c'est ça ?
    le problème n'est pas aussi simple, par exemple le fait de faire une comparaison avec TntstringList créera une copie temporaire et probablement la même chose avec un élément d'un tableau de Widestring

    if List[n] = txt then

  19. #19
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    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 096
    Par défaut
    Citation Envoyé par KlausGunther Voir le message
    J'ai essayé de suive ton conseil:


    Mais le résulat est identique: les caractères ANSI sont bons, mais les caractères UTF sont des "?".
    Ah oui, tu ne parlais pas du résultat dans le buffer TempPath mais le contenu dans ListBox1

    Delphi 6 c'est tellement loin
    Comme les autres, j'ai utilisé TNTUnicode aussi, installé en package car tout l'ensemble de l'application étaient prévue pour gérer Russe, Hébreux, Arabe, Portugais et Français pour une association qui avait le budget pour ce genre de développement Delphi 7 + ADO + Oracle (migration d'un D6 + BDE + Paradox)

    Sache qu'il existe une autre approche !



    Les options régionales pour les applications ANSI
    Pour une association n'ayant pas le budget pour demander un passage de la VCL vers TNT, l'option choisi fut de mettre directement la bonne langue dans Windows :


    Ainsi cela gère uniquement l'arabe et les noms de fichier écrit en arabe, les TEdit, TMemo, TList supporte tous l'arabe MAIS
    car il y a un grand MAIS, cela ne gère plus les accents du français qui sont sur le section 128 - 255 de l'ANSI, tu ne pouvais pas avoir les deux et ce sujet montre très bien certe perte : Chaines à la conception et options régionales




    Citation Envoyé par rMist2024 Voir le message
    WideString ce type de texte n'utilise pas le comptage de références contrairement au string cela veut dire qu' à chaque fois qu'une assignation est faite une nouvelle copie de texte est créée c'est important de le savoir pour éviter des copies parasites surtout si la taille du texte est importante.
    Pour être plus précis, comme je l'ai évoqué précédemment, c'est le gestionnaire mémoire OLE qui contient les données des WideString c'est à dire le type BSTR OLE Automation et le type amélioré c'est CComBSTR qui contient une gestion de la taille (évite de chercher les #0#0) mais ne possède toujours pas de compteur de référence.
    Citation Envoyé par ShaiLeTroll Voir le message
    Il faut utiliser des WideChar, conversion avec une WideString est plus aisé mais cela alloue les chaines sur la mémoire OLE/COM mais c'est plus simple que WideCharToMultiByte


    Citation Envoyé par Andnotor Voir le message
    Les compteurs de référence n'existaient pas sous D6, string = shortstring actuel (max 255 car.)
    Euh, le compteur de référence dans StrRec n'existait déjà en D6 ?
    En D6, le type string était déjà à 2Go de taille maximal
    C'est en D2 que string devait être limité, déjà en D3, il ne l'était plus limité.

    Cela m'étonne, j'ai des codes qui exloitait cela, après je l'ai surtout approfondi en D7 j'avais même un code pour l'exploiter à titre de curiosité car sans FastMM à l'époque, j'aurais bien été incapable de dire les fuites mémoires lié à cette bidouille, en théorie, le FreeMem étant appelé sans la taille, il libère toute la zone mémoire du pointeur mais je n'ai jamais osé l'exploiter en PROD lui préférant FastMM transformant radicalement les performances sous D5 et D7 (cas en PROD)

    Suffit de voir si la fonction UniqueString existe en D6, si oui, le compteur existait déjà donc !




    Mais je pense que s'inquiéter du compteur de référence pour une pauvre liste de dossier ou fichier, au pire ça sera à 1000 ou 10000, même l'eplorateur windows n'aimait pas trop plus de 10 000 à l'époque des OS supporté par Delphi 6



    Citation Envoyé par rMist2024 Voir le message
    Il est possible d'utiliser les contrôles TntUnicode sans installation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type
     TEdit = class(TntStdCtrls.TTntEdit);
     TMemo = class(TntStdCtrls.TTntMemo);
     TListBox = class(TntStdCtrls.TTntListBox);
    Si j'avais a maintenir Aujourd'hui une application D6 avec TNT, je ferais comme rMist2024, sans package, je l'ai fait pour le TComPort et les controles associés dans un projet one-shot, c'est trop pénible lorsque l'on jongle entre plusieurs projet d'installer ou non les packages et dépendances de chacun si l'on a pas une WMWare pour chaque projet / chaque client.
    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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 939
    Par défaut
    Ok, plus vieux que ce que je pensais !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/12/2020, 22h28
  2. Comment Ouvrir les fichier provenant d'un dossier?
    Par totonin dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 22/04/2009, 19h42
  3. Comment ouvrir un dossier
    Par reeda dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 20/03/2008, 15h08
  4. comment ouvrir un dossier a partir d'un formulaire ?
    Par allmil17 dans le forum VBA Access
    Réponses: 3
    Dernier message: 16/03/2008, 16h27
  5. Comment ouvrir l'explorateur sur un dossier spécifique
    Par SimpleMe dans le forum Windows XP
    Réponses: 4
    Dernier message: 15/09/2007, 09h52

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