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 :

Ajouter propriété "Scaled = False" sur plusieurs fiches à la fois


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 42
    Points : 25
    Points
    25
    Par défaut 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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    Quelle est la difficulté de modifier tous les dfm pour y ajouter la ligne qui va bien ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 42
    Points : 25
    Points
    25
    Par défaut
    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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 658
    Points : 3 599
    Points
    3 599
    Billets dans le blog
    2
    Par défaut
    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é

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    Attention à ce que tous les DFM soient bien au format texte.
    En binaire, ça va mettre un beau boxon

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 658
    Points : 3 599
    Points
    3 599
    Billets dans le blog
    2
    Par défaut
    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

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    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 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    @Papy 214 On parle de dfm version D7, je ne pense pas qu'ils fussent en binaire
    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
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    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
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    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
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    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.



    Nom : 2020-10-24 17_57_22-Options de projet pour Project1.exe  (Toutes les plates-formes - Toutes les .jpg
Affichages : 152
Taille : 148,0 Ko

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 42
    Points : 25
    Points
    25
    Par défaut
    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
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    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.

    Nom : 2020-10-26 09_58_46-Options de projet pour Project1.exe  (Win32 - Debug).jpg
Affichages : 133
Taille : 140,1 Ko

  16. #16
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    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é
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    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

Discussions similaires

  1. Réponses: 33
    Dernier message: 22/04/2010, 20h48
  2. UPDATE sur plusieurs colonnes à la fois
    Par yuukuari dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/11/2009, 14h46
  3. Requête sur plusieurs fiches
    Par fabpan dans le forum HyperFileSQL
    Réponses: 3
    Dernier message: 26/06/2009, 15h50
  4. Lecture sur plusieurs records à la fois
    Par Matthieu Brucher dans le forum Fortran
    Réponses: 2
    Dernier message: 18/11/2008, 13h46
  5. Ajouter des informations sur plusieurs tables
    Par nana 69 dans le forum IHM
    Réponses: 6
    Dernier message: 08/07/2008, 10h39

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