Navigation

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

  1. #1
    Membre à l'essai
    Ajouter propriété "Scaled = False" sur plusieurs fiches à la fois
    Bonjour,

    Déjà désolé si je ne suis pas dans le bon forum je ne savais pas trop ou faire cette demande.

    Nous allons bientôt migrer notre application de Delphi 7 à Rio, et pour diverses raisons, nous devons mettre la propriété "Scaled" à false sur chacun de nos fiches.

    Avec plus de 2000 fiches, comprenez que l'on cherche une solution pour pouvoir le faire automatiquement. Cette propriété ne pouvant pas être mise en runtime, le but serait de l'intégrer directement dans les fiches *.DFM.

    Malheureusement après des recherches, j'ai constaté que par défaut la ligne "Scaled = True" n'est pas présente dans le fichier DFM et dès que l'on passe la propriété à False "Scaled = False" apparaît bien ! Du coup impossible de faire une simple "Remplacer / Rechercher" sur plusieurs fichiers avec Notepad++ ou un autre outils de ce genre.

    Mon idée serait d'intégrer la ligne "Scaled = False" sur chaque 2ème ligne, de chacun de mes fichiers DFM, et tout cela automatiquement, et du coup là on sort de la programmation Delphi, pour + trouver une astuce via un logiciel ou autre pour pouvoir faire cela.

    Ou alors si vous avez d'autres idées pour pouvoir mettre cette propriété partout à la fois, je suis preneur !

    Merci beaucoup et bonne journée !

  2. #2
    Membre émérite
    Quelle est la difficulté de modifier tous les dfm pour y ajouter la ligne qui va bien ?

  3. #3
    Membre à l'essai
    Bonjour,

    Avec plus de 2000 fiches à modifier, je voulais éviter de devoir ouvrir chaque fiche un à un et faire un copier coller dedans.

    En gros c'était cela mon plus grand problème.

  4. #4
    Membre expert
    Bonjour,

    Citation Envoyé par briaume Voir le message
    du coup là on sort de la programmation Delphi, pour + trouver une astuce via un logiciel ou autre pour pouvoir faire cela.
    Si tu es certain de devoir ajouter systématiquement sur la deuxième ligne de chaque .dfm la ligne "Scaled = False", alors tu peux le faire via un petit programme Delphi.
    Tu peux faire une recherche récursive à partir d'un répertoire pour parcourir dans tous ses sous répertoires les fichiers ayant l'extension .dfm (plusieurs solutions possibles (à "l'ancienne" avec TSearchRec et des FindFirst/FindNext, ou via TDirectory.GetFiles)
    Ensuite, pour chaque fichier trouvé, tu le charges dans un TStringlist par exemple, tu insères en deuxième élément (indice 1) la chaine de caractères "Scaled = False" et tu sauvegardes le fichier.

    Je te conseille évidemment de faire tes tests sur une copie des fichiers d'origine et dans un premier temps sur un petit échantillon pour mettre au point le programme.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Membre confirmé
    bonjour

    Tu peux rédiger une petite application en delphi qui :
    • Scruter les répertoires + sous répertoires que tu souhaites
    • Ouvrir tes *.dfm, qui sont des fichiers texte, avec un Tstringlist...
    • Y ajouter ce que tu veux , ou tu veux ...
    • Sauvegarder les fichiers modifiés.


    bonne journée.
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  6. #6
    Membre émérite
    Attention à ce que tous les DFM soient bien au format texte.
    En binaire, ça va mettre un beau boxon

  7. #7
    Membre émérite
    J'affiche le résultat dans un memo mais il faudrait juste remplacer la ligne par celle modifiée et hop, le tour est joué.
    On peut aussi agrémenter en vérifiant si le fichier un dfm de même nom pour éviter de polluer de simples unités de 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
     
     
    const
      Folder = 'repertoiredecode';
    var
      F, C: string;
      L: TArray<string>;
      I: Integer;
      Mch: TMatchCollection;
    begin
      for F in TDirectory.GetFiles(Folder, '*.pas', TSearchOption.soAllDirectories) do
      begin
        L := TFile.ReadAllLines(F);
     
        for I := Low(L) to High(L) do
        begin
     
          Mch := TRegex.Matches(L[I], '^\s*uses\s', [TRegExOption.roIgnoreCase]);
          if Mch.Count > 0 then
          begin
            C := Mch.Item[0].Value;
            L[I] := C + 'manouvelleform, ' + Copy(L[I], C.Length, Length(L[I]) - C.Length);
            Memo1.Lines.Add(L[I]);
            Break;
          end;
     
        end;
      end;
     
    end;

  8. #8
    Membre expert
    Citation Envoyé par Papy214 Voir le message
    Attention à ce que tous les DFM soient bien au format texte.
    En binaire, ça va mettre un beau boxon
    Il me semble que c'est le cas par défaut dans les versions récentes de Delphi.
    En tout cas, Delphi est fourni avec un petit utilitaire de conversion nommé convert.exe. Il est possible ainsi de convertir tous les dfm en dfm texte d'un répertoire en lançant en ligne de commande depuis le répertoire du projet l'utilitaire de la manière :
    convert -i -s -t *.dfm
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Rédacteur/Modérateur

    @Papy 214 On parle de dfm version D7, je ne pense pas qu'ils fussent en binaire
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

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

  10. #10
    Membre émérite
    Citation Envoyé par SergioMaster Voir le message
    @Papy 214 On parle de dfm version D7, je ne pense pas qu'ils fussent en binaire
    Je n'ai pas de D7 sous la main mais pourtant il me semble bien que si

    Qui pourrait vérifier svp ?

    Attention: Je ne dis pas qu'ils étaient forcément en binaire mais juste qu'on avait le choix et que le choix par défaut faisait partie des options de Delphi

  11. #11
    Expert éminent sénior
    Citation Envoyé par Papy214 Voir le message
    Je n'ai pas de D7 sous la main mais pourtant il me semble bien que si

    Qui pourrait vérifier svp ?

    Attention: Je ne dis pas qu'ils étaient forcément en binaire mais juste qu'on avait le choix et que le choix par défaut faisait partie des options de Delphi
    c'est toujours possible de faire du DFM binaire clic droit "DFM Texte" est coché par défaut.

    le DFM texte ça doit remonter à Delphi 2 je pense...mais en effet, sur un projet qui aurait été développé initialement en binaire il est possible qu'il le soit resté.

    sinon pour changer un attribut partout sans modifier les DFM il est envisageable de surcharger TForm

    1) soit parce que tu utilises déjà une fiche ancètre
    2) soit car tu as une unité présente dans toutes tes unités et APRES l'unité Forms

    il suffit alors de déclarer

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    uses
      Forms;
     
    type
      TForm = class(Forms.TForm)
      end;


    et là il faut à un endroit ou à un autre modifier la valeur du Scaled...probablement en surchargeant Loaded...voir surcharger la propriété publiée Scaled pour en changer le setter.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #12
    Membre émérite
    Donc, pour conclure peut-être, créer une unité pour surcharger TForm comme indiqué par Paul ou créer une nouvelle unité FormScaled et passer le bout de code suivant pour vérifier que ça fonctionne. Si ok, modifier le code pour recomposer les fichiers de code plutôt qu'afficher les uses modifiés.

    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
     
     
     
    uses System.RegularExpressions, System.IOUtils;
     
    procedure TForm3.Button1Click(Sender: TObject);
    var
      F, C: string;
      R:    TRegex;
      Mch:  TMatch;
      L:    TArray<string>;
      I:    Integer;
      J: Integer;
    begin
     
      R := TRegex.Create('^\s*uses.*$', [TRegExOption.roIgnoreCase, TRegExOption.roMultiLine]);
     
      for F in TDirectory.GetFiles('D:\Projets\Developpement', '*.pas', TSearchOption.soAllDirectories) do
      begin
        SynEdit1.Lines.Add('{ ' + F + ' }');
     
        L := TFile.ReadAllLines(F);
     
        for I := Low(L) to High(L) do
        begin
          C := L[I];
     
          Mch := R.Match(C);
          if Mch.Success then
          begin
     
            if Mch.Value.Trim.EndsWith(';') then
              SynEdit1.Lines.Add(Mch.Value.TrimRight.TrimRight([';']) + ', FormScaled;')
            else
            begin
              J := I + 1;
              while 1 = 1 do
              begin
                if L[J].Trim.EndsWith(';') then
                begin
                  C := L[J].TrimRight.TrimRight([';']) + ', FormScaled;';
                  SynEdit1.Lines.Add(C);
                  Break;
                end
                else
                  SynEdit1.Lines.Add(L[J]);
                Inc(J);
              end;
            end;
     
            Break;
          end;
     
        end;
        SynEdit1.Lines.Add('');
      end;
     
    end;

  13. #13
    Rédacteur/Modérateur

    Du moment où il n'y avait pas de notion de nom de portée d'unité sous D7, il suffit de créer une unité Forms.pas dans le répertoire du programme qui elle fera appel à l'unité entièrement qualifiée Vcl.Forms.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
    unit Forms;
     
    interface
     
    uses
      Vcl.Forms;
     
    type
      TForm = class(Vcl.Forms.TForm)
      public
        procedure AfterConstruction; override;
      end;
     
    implementation
     
    { TForm }
     
    procedure TForm.AfterConstruction;
    begin
      inherited;
      Scaled := FALSE;
    end;
     
    end.



    Si plusieurs projets sont concernés, on pourrait imaginer créer un nouvel espace de nommage (disons D7UpFix) le nom de l'unité serait alors D7UpFix.Forms.pas et sauvegardée dans un répertoire commun du chemin de recherche. Il suffira ensuite d'ajouter ce nouvel espace aux noms de portées des unités dans les options des différents projets. A noter qu'il doit obligatoirement apparaître avant Vcl.




  14. #14
    Membre à l'essai
    Bonjour,

    Merci pour ces nombreuses réponses, la dernière proposition en date me semble idéale dans notre cas.

    Au niveau Delphi 7, donc si je comprend bien la notion de "Noms de portées d'unités", n'existe pas ? Car j'ai plusieurs projet (exe + DLL) qui seront impactée par cette modification.

    Du coup j'ai quand même essayé de mettre un fichier .pas directement dans le repertoire du projet avec le nom "Forms.Pas", mais impossible de le faire réagir pour le moment.

    Merci encore pour votre aide !

  15. #15
    Rédacteur/Modérateur

    Comprenons-nous bien, tu ne peux pas tester cela sous D7 mais uniquement sous Rio.

    Et une autre remarque : puisque cette unité va s'intercaler entre les fiches et Vcl.Forms.pas, l'ensemble de Vcl.Forms.pas va être masqué. Il faudra certainement router d'autres types et variables. Par exemple pour utiliser Application, il faudra ajouter cette déclaration var Application :TApplication absolute Vcl.Forms.Application.

    Mais la question que je me pose est pourquoi modifier tous ces Scale ? Ne pas oublier que la notion de manifeste n'existait pas sous D7 et que l'activer sous Rio pourrait palier aux problèmes de mise à l'échelle.


  16. #16
    Expert éminent sénior
    en dernier recours il doit être aussi possible de copier l'unité Vcl.Forms.pas dans le répertoire du projet et modifier la partie implémentation.

    tant qu'on ne touche pas à la partie interface, cela devrait fonctionner....sinon on tombe sur "l'unité XXX a été compilée avec une version différente de yyy"...seules l'interface est impliquée dans cette comparaison.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  17. #17
    Expert confirmé
    salut

    le plus simple étant quand même d'utiliser des "templates de forme"
    dont vont heriter tout les forme de ton appli
    cela évite de faire des copier coller de forme en forme
    tu peut ensuite décliner ces Template par exemple pour des dialogues
    le travail seras laborieux la première fois mais après tu comprendra l'utilité du paradigme object

    je me souvient que quickreport avait fait ce genre d'outil afin de modifer tout les etats
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

###raw>template_hook.ano_emploi###