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

Delphi Discussion :

Dériver une TForm


Sujet :

Delphi

  1. #1
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2021
    Messages : 138
    Points : 207
    Points
    207
    Par défaut Dériver une TForm
    Bonjour,

    dériver une TForm répond au même principe que dériver un autre composant... sauf que les composants on les trouve dans la Palette de composants (si évidemment vous y incorporez votre nouveau composants).

    Les TForm ne se trouvent pas dans la palette.
    Nom : Capture d’écran 2022-04-06 093012.png
Affichages : 270
Taille : 17,5 Ko

    Comment intégrer une Tform dérivée dans un projet simplement ? La même question se pose pour Lazarus.

    Merci. Cordialement. Gilles

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    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 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour Gilles,

    Si j'ai compris, je pense que tu cherches les éléments héritables une image valant mieux qu'un discours

    Nom : Capture.PNG
Affichages : 261
Taille : 33,3 Ko

    Trouvant étonnant que Lazarus n'ai pas la même chose, j'ai lancé une version restant en embuscade sur mon poste

    Nom : Capture.PNG
Affichages : 254
Taille : 16,1 Ko
    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

  3. #3
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2021
    Messages : 138
    Points : 207
    Points
    207
    Par défaut
    Hello,

    merci pour la solution. Donc si je comprends bien, je bidouille une TmyForm par héritage d'une TForm. Par exemple, j'ajoute une propriété FdisplayScreen [qui sera l'écran d'affichage de ma Form lors de son ouverture] et j'override sa méthode de création ? Puis ensuite, je la copie à l'infini....

    Sur Lazarus, je fais déjà cela "à la main". Je n'ai pas eu le temps encore de suivre le C:\lazarus-2.2.0RC2-fpc-3.2.2-win64\ide\sourcefilemanager.pas & co. [le code de l'IDE est open source en Lazarus]. Mais en ce moment je me concentre sur la partie métier de mes projets et pas sur la création de composants.

    Bref, en FMX Desktop, à l'ouverture du projet, je voudrais laisser le temps à l'utilisateur de placer sa souris sur l'écran qu'il choisi d'utiliser.[éviidemment s'il est au moins en dual-screen]. Ensuite les fenêtres s'ouvrent sur l'écran choisi (ou corrigé pendant l'utilisation du logiciel). J'ai fait cela en Lazarus au départ parce que j'en avais marre lors des Run de voir les fenêtres s'afficher en dehors de l'écran de test qui pouvait varier d'un appareil de développement à l'autre.

    Et dans le cas précis, j'ai repris un projet FreeHandDx développé en XE7 alors que j'enseignais. Stupéfaction, Delphi 10.4 le compile les vieilles sources sans aucun problème. J'ai failli en tomber de ma chaise ! Dans ce projet, j'utilise un jeu de 2 fenêtres transparentes alternant click-through ou pas qui me permettent d'enrichir mon écran connecté au vidéoprojecteur des salles d'informatique avec "rémanences" des annotations quand je reviens en click-through et que je travaille par exemple dans ma feuille de calcul. J'avais essayé d'autres produits déjà faits et je n'étais pas satisfait. En plus, j'y avais intégré un système permettant aux élèves de leur poste de faire des copies d'écran (vidéo-projeté) à volonté.

    Malheureusement en Lazarus, je n'ai jamais trouvé le moyen de gérer la transparence des TForm dans les 3 OS et pire, je n'ai pas été capable de créer une fenêtre click-through "obéissante". C'est un peu normal, c'est une faiblesse [uniquement dans ce type de projet] de l'utilisation pour l'affichage des objets graphiques natifs de l'OS. En y mettant beaucoup de temps, c'est à mon avis jouable sauf que la maintenance en fonction de l'évolution des OS mac et Nux doit devenir prohibitive.

    Alors qu'en FMX, j'ai fait assez rapidement une ébauche. J'ai été plus loin en Qt. Je pensais à une discussion récente avec Shailetroll (le tout en delphi) et cela a fait remonter ce projet à la surface.
    Comme c'est un projet OpenSource, je vais en mettre des "bouts" sur le site, car j'ai besoin d'aide pour l'approche du module "à main levée".

    Cordialement. Gilles

  4. #4
    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
    il existe aussi un autre approche pour ajouter des fonctionnalités à TForm (ou tout autre composant d'ailleurs)

    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
     
    uses
      FMX.Forms; // ça marche de la même façon avec VCL.Forms
     
    type
     // on surcharge TForm
      TForm = class(Forms.TForm)
        FdisplayScreen : Integer;
        constructor Create(AOwner: TComponent); override;
      end;
     // le reste du code est standard 
      TForm1 = class(TForm)  
      end;
      ...
    implementation
     
    constructor TForm.Create(AOwner: TComponent);
    begin
      inherited;
      ...
    end;
    le fait de déclare un autre objet TForm dans l'unité suffit pour enrichir TForm

    et il est tout à fait possible de mettre ce code dans une autre Unit

    [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
     
    uses
      FMX.Forms, // ça marche en FMX ou un VCL
      CustomForms; // placer le code qui personnalise TForm dans cette unité placée APRES FMX.Forms dans le uses
     
    type
      TForm1 = class(TForm)  // TForm vient donc de CustomForms
      end;
      ...
    implementation
     
    constructor TForm.Create(AOwner: TComponent);
    begin
      inherited;
      ...
    end;

    et on peut faire ça pour tous les composants, c'est très pratique pour ajouter des fonctionnalités qui n'affectent pas la partie Design à des composants

    avec ça ou avec des Helper on peut faire bcp de choses comme dans mon unité VCLPatches
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2021
    Messages : 138
    Points : 207
    Points
    207
    Par défaut
    Merci pour vos réponses.
    Je pense que je me suis mal exprimé. Créer un composant, je pense savoir faire. J'ai développé tout une série de composants en Lazarus. J'ai quelques incertitudes en ce qui concerne FMX, je dois l'avouer.

    Nom : Capture d’écran 2022-04-06 134621.png
Affichages : 238
Taille : 48,3 Ko

    Mon problème est le suivant. Supposons que dans ma TmyForm, je veuille y intégrer le N° de l'écran sur lequel elle s'ouvrira (à condition évidemment que l'utilisateur dispose au moins d'un dual-screen). Cela commencerait comme cela...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     private
        FDisplayScreen : integer;
        procedure SetDisplayScreen(const aValue: Integer);
      protected
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
         property DisplayScreen  : integer
          read  FDisplayScreen
          write SetDisplayScreen default 0;
    Ensuite je vais modifier les évènements ou overrider les méthodes concernées par la modification du placement relatif à la valeur de la propriété DisplayScreen... à moins que je ne place ce code directement dans le constructeur si c'est possible. Je me méfie toujours avec l'interface graphique.

    Quand j'utilise un de mes composants, dans l'éditeur de composant, je ne vois pas "la techno" utilisée mais simplement, la propriété DisplayScreen ajoutée dans la liste des propriétés publiées] et en aucun cas le contenu des méthodes overridées ou des évènements corrigés. Je ne suis peut-être pas très clair. je prends l'exemple d'un TlzEdit :
    Nom : Capture d’écran 2022-04-06 140818.png
Affichages : 226
Taille : 17,0 Ko
    J'ai ajouté une propriété : EnterKeyIsNext. Comme son nom l'indique, si j’appuie sur la touche entrée lors de la saisie dans le TlzEdit, il donne automatiquement le focus au champ suivant. Cela a entrainé dans le code du composant la modification d'un évènement :
    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
    procedure TlzEdit.SelfOnKeyPress(Sender: TObject; var Key: char);
    begin
      if Assigned(FOnKeyPress) then FOnKeyPress(Sender);
      if (FEnterKeyIsNext)
      and (bForm <> nil)
      and (not (ReadOnly))
      and (Enabled)
      and not (csDesigning in ComponentState) then begin
        if Key = #13 then begin
          with bForm do
            if HiWord(GetKeyState(VK_SHIFT)) <> 0 then
              SelectNext(ActiveControl, False, True)
            else
              SelectNext(ActiveControl, True, True);
          Key := #0
        end;
      end;
    end;
    Et évidemment quand j'active l'évènement OnKeyPress de mon composant incorporé dans ma TForm, il est "vide" comme celui d'un TEdit classique. On ne voit pas la "machinerie".
    Nom : Capture d’écran 2022-04-06 141854.png
Affichages : 237
Taille : 30,6 Ko

    Voila ce que je cherche à faire avec ma TMyForm. Je dois pouvoir la faire apparaitre dans l'IDE [visuellement F12] et je ne dois pas voir les codes qui y ont été intégrés mais simplement dans l'inspecteur d'objet la propriété DisplayScreen.

    Or on dépose pas une forme sur un projet comme on le fait avec un composant sur une Tform mais on crée une nouvelle fiche à partir d'un menu de l'éditeur. Et je me demande comme créer une nouvelle fiche TmyForm avec les spécificités précisées [pas de machinerie, une Tform avec les propriétés ajoutées, les évènements ajoutés ou modifiées, les méthodes overridées mais sans la "pollution" des codes ajoutés ou modifiés dans l'héritage]. Je ne sais pas faire mais est-ce faisable ?

    Merci. Cordialement. Gilles

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 669
    Points : 5 238
    Points
    5 238
    Par défaut
    Pour créer une nouvelle fiche directement dérivée de TMyForm via l'IDE, il faut aller dans Fichier > Nouveau > Autres (en tout cas, c'est comme ça sur mon vieux Delphi 7).
    Et là tu auras un écran avec plusieurs onglets dont un onglet portant le nom de ton application.
    Dans cet onglet, tu devrais y retrouver MyForm.

  7. #7
    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
    Pour avoir les propriétés de la fiche dans l'IDE il faut obligatoirement enregistrer un nouveau composant...mais pour les fiches c'est un peu plus sioux que pour les composants classiques.

    ça passe par RegisterCustomModule, et je pense qu'il faut créer un Wizard pour ajouter dans le menu Nouveau un nouveau type de fiche.

    j'ai fait ça sur un projet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure Register;
    begin
      RegisterCustomModule(TGraphicForm, TCustomModule);
      with BorlandIDEServices as IOTAWizardServices do
      begin
        iFormWizard := AddWizard(TGraphicFormWizard.Create);
      end;
    end;
    mais à c'est la partie visible de l'iceberg, il y a un tas de choses à ajouter.

    Marco avait fait un article là dessus https://www.marcocantu.com/ddh/ddh15/ddh15e.htm

    Sinon, il est parfois possible de créer un composant sur la fiche qui prend en charge le code - quitte à passer par une surcharge de TForm pour prendre en compte le composant...et là c'est un RegisterComponent classique.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2021
    Messages : 138
    Points : 207
    Points
    207
    Par défaut
    Merci beaucoup. J'étudie tout cela.
    Cordialement. Gilles

Discussions similaires

  1. Comment fermer une Tform avant meme qu'elle s'affiche??
    Par Jayceblaster dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 17/05/2006, 11h34
  2. Dériver une paire de clé RSA à partir d'un mot de passe
    Par Strab dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 03/03/2006, 12h28
  3. [Message] Redimensionner une TForm
    Par Manopower dans le forum Langage
    Réponses: 1
    Dernier message: 05/01/2006, 14h28
  4. Réponses: 7
    Dernier message: 27/06/2005, 22h05
  5. Problèmes avec une TForm créée dynamiquement
    Par Pascal Jankowski dans le forum Composants VCL
    Réponses: 5
    Dernier message: 30/03/2005, 11h55

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