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 :

Passer une application de SDI en MDI


Sujet :

Delphi

  1. #1
    Expert éminent

    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2002
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 160
    Points : 6 476
    Points
    6 476
    Billets dans le blog
    2
    Par défaut Passer une application de SDI en MDI
    Bonjour,

    J'ai une petite application (éditeur RTF), mais ouvrir 5 fichiers = ouvrir 5 instances de l'application.

    Donc en passant en MDI, les 5 fichiers seraient ouverts dans la même instance. Mais, c'est pas si simple. Les exemples de Delphi sont trop simplistes et je manque d'exemples plus complets pour inter-agir avec les fenêtres enfants.

    Questions subsidiaire, ça serait encore plus pratique en utilisant les onglets (comme NotePad++ par exemple), mais là, je manque encore plus d'exemples. Donc, si de tels exemples existent ? je serais preneur.

    Merci d'avance.
    Pierre GIRARD

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 663
    Points : 6 949
    Points
    6 949
    Par défaut
    Citation Envoyé par Pierre GIRARD Voir le message
    Questions subsidiaire, ça serait encore plus pratique en utilisant les onglets (comme NotePad++ par exemple), mais là, je manque encore plus d'exemples. Donc, si de tels exemples existent ? je serais preneur.
    Pour ça, moi j'utiliserais un simple TPageControl.
    Et avec, je créerais une classe héritant de TTabSheet, pour avoir des onglets avec un RichEdit et tout ce qui va bien.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (11.6 - 14.6)

  3. #3
    Expert éminent

    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2002
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 160
    Points : 6 476
    Points
    6 476
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Lung Voir le message
    Pour ça, moi j'utiliserais un simple TPageControl.
    Et avec, je créerais une classe héritant de TTabSheet, pour avoir des onglets avec un RichEdit et tout ce qui va bien.
    Oui, mais il me faudrait des exemples. Pour par exemple, faire que le clic sur "Nouveau Fichier" ouvre un document vierge dans le dernier onglet + 1, idem en cliquant sur "Ouvrir Fichier" et même en double-cliquant sur un fichier.rtf (mon application étant l'application par défaut pour ces fichiers).

    C'est peut-être vraiment très simple, mais sans avoir vu un exemple fonctionnel, c'est pas évident pour un amateur comme moi.
    Pierre GIRARD

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 663
    Points : 6 949
    Points
    6 949
    Par défaut
    Citation Envoyé par Pierre GIRARD Voir le message
    Oui, mais il me faudrait des exemples. Pour par exemple, faire que le clic sur "Nouveau Fichier" ouvre un document vierge dans le dernier onglet + 1, idem en cliquant sur "Ouvrir Fichier"
    Par exemple, voici ce que je fais dans une de mes applications :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
       Onglet: TOngletRequete;
    begin
          Onglet := TOngletRequete.Create(Self, PageControl);
          PageControl.ActivePage := Onglet;
          Onglet.RichEdit.SetFocus;
    Sachant que TOngletRequete hérite de TTabSheet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TOngletRequete = class(TTabSheet)
    ...
       RichEdit: TRichEdit;
    ...
    public
       constructor Create(AOwner: TComponent; APageControl: TPageControl);   reintroduce;   overload;
    ...
       destructor Destroy;   override;
    end;
    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
    constructor TOngletRequete.Create(AOwner: TComponent; APageControl: TPageControl);
    begin
       inherited Create(AOwner);
       PageControl := APageControl;
       Caption := 'Requête ' + IntToStr(PageControl.PageCount - 2);
       PageIndex := PageControl.PageCount - 2;
    ...
       RichEdit := TRichEdit.Create(Self);
       RichEdit.Parent := PanelRichEdit;
       RichEdit.Height := Round((Height / 5) * 2);
       RichEdit.Align := alClient;
       RichEdit.ScrollBars := ssBoth;
       RichEdit.PopupMenu := PopupMenuRequete;
       _OldRichEditProc := RichEdit.WindowProc;
       RichEdit.WindowProc := RichEditProc;
       RichEdit.OnKeyUp := RichEditKeyUp;
       RichEdit.OnMouseUp := RichEditMouseUp;
       RichEdit.OnChange := RichEditChange;
       RichEdit.OnSelectionChange := RichEditSelectionChange;
    ...
    end;
     
    ...
     
    destructor TOngletRequete.Destroy;
    begin
    ...
       RichEdit.Free;
    ...
    end;
    C'est peut-être pas la meilleure solution, mais s'en est une.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (11.6 - 14.6)

  5. #5
    Expert éminent

    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2002
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 160
    Points : 6 476
    Points
    6 476
    Billets dans le blog
    2
    Par défaut
    J'ai bien regardé, mais tout ça me semble bien compliqué ... vu à mon niveau très basique. Déjà, créer une nouvelle classe je n'ai jamais fais ça, et après, reste à intégrer tout ça dans mon application.

    L'avantage de la solution SDI était que je partais d'une application-exemple Delphi déjà fonctionnelle. Restait juste à y ajouter de nouvelles fonctions et à enrichir/personnaliser les fonctions existantes.

    J'ai aussi essayé de partir d'une application-exemple Delphi en MDI, mais (pour le moment) certains mécanismes m'échappent pour inter-agir avec les fenêtres enfants. Et donc j'ai des difficultés pour l'enrichir comme je l'ai fait avec l'application SDI.
    Pierre GIRARD

  6. #6
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour.

    Tu peux très bien rester en SDI (perso, j'ai horreur du MDI).

    Deux solutions :
    1) utiliser des onglets (un TPageControl) comme l'a suggéré Lung. Si tu n'es pas habitué à la création de classe, ceci n'est absolument pas nécessaire.
    2) placer ton richedit (+ boutons de formatage, popupmenu...) dans une TForm non créée automatiquement au démarrage de ton programme et déclarée StayOnTop afin qu'elle reste au-dessus de ta Form principale. Chaque fois que tu as besoin d'un nouveau RichEdit, il suffit de créer dynamiquement une instance de cette fenêtre. Le gros avantage de cette solution est de voir plusieurs textes à l'écran, et même si tu as une configuration multi-écrans, de placer une fenêtre sur le deuxième écran. Ce n'est pas compliqué à faire, tu peux reprendre une grosse partie de ton code existant. Si cette solution t'intéresse, je peux t'indiquer un bout de code.

    Thierry

  7. #7
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Si tu veux du MDI...

    Fiche principale : Form1 (FormStyle = fsMDIForm) avec un menu principal.
    Fiche enfant : ChildForm (FormStyle = fsMDIChild) avec un RichEdit (align = alClient)
    Dans Options du projet : déplacer ChidForm vers "fiches disponibles".

    Créer une fiche enfant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.NewMenuItemClick(Sender: TObject);
    var
       Child: TChildForm;
    begin
       Child:= TChildForm.Create(Self);
       Child.Caption:= 'Texte ' + IntToStr(MDIChildCount); // nombre de fiches enfant
    end;
    Pour interagir avec les fenêtres enfant, la propriété ActiveMDIChild renvoie la fiche enfant focalisée.

    Exemple pour mise en gras :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure BoldMenuItemClick(Sender: TObject);
    begin
       if ActiveMDIChild <> nil then
          with TChildForm(ActiveMDIChild).RichEdit1 do
              SelAttributes.Style:= [fsBold];
    end;
    Voici un tuto intéressant pour le MDI : http://delphi.about.com/od/objectpas.../aa042500a.htm
    (il y a une partie II).
    Regarde l'événement OnClose de ChildForm. Tu auras aussi besoin d'un événement OnCloseQuery pour gérer la sauvegarde du texte si l'utilisateur ferme la fenêtre.

    Thierry

  8. #8
    Expert éminent

    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2002
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 160
    Points : 6 476
    Points
    6 476
    Billets dans le blog
    2
    Par défaut
    Je vais voir tout ça, mais en fait, côté SDI, je n'ai presque rien à reprocher, simplement, malgré la suppression de toutes les fonctions de déboggage, le lancement de chaque instance est long et prend 100% (ou presque) de la puissance du CPU (virtuel). Du coup, cliquer sur 5 fichiers, c'est ouvrir 5 instances et multiplier par 5 le temps de lancement.

    A côté le lancement de Notepad++ avec 10 fichiers texte simultanés prend beaucoup moins de temps (bon, c'est du txt et pas du rtf). Mais lancer Notepad++ avec 10 fichiers au lieu de 1 ne multiplie pas par 10 le temps de lancement.

    Pour un exécutable de moins de 3,2 Mo, je trouve que c'est vraiment très long.
    Pierre GIRARD

  9. #9
    Expert éminent

    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2002
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 160
    Points : 6 476
    Points
    6 476
    Billets dans le blog
    2
    Par défaut
    Bon, des nouvelles. Tout d'abord, j'y suis allé très simplement au début. J'ai seulement remplacé : "RichEdit1" par : "TChildForm(ActiveMDIChild).RichEdit1" partout dans toutes mes procédures. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TChildForm(ActiveMDIChild).RichEdit1.SelAttributes.Style := [fsBold];
    Globalement, ça marche, sauf une erreur lors du lancement.
    Nom : Erreur.jpg
Affichages : 345
Taille : 35,8 Ko

    L'état actuel de l'application donne ça :
    Nom : EtatActuel.jpg
Affichages : 377
Taille : 137,3 Ko

    Pour l'erreur, c'est probablement dû fait que je ne fait aucun contrôle (contrairement à l'exemple que ThWilliam m'as donné).

    Pour les onglets, j'y réfléchirais plus tard, mais ça m'as quand même l'air encore plus complexe.

    PS. En fait, c'est pas des RichEdit, mais des LMDRichEdit (qui permet d'inclure des images), mais le principe est le même.
    Pierre GIRARD

  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 043
    Points
    15 043
    Par défaut
    Salut,

    Mon grain de sel (puisque ce sont des recettes de cuisine )
    Citation Envoyé par Pierre GIRARD Voir le message
    Pour les onglets, j'y réfléchirais plus tard, mais ça m'as quand même l'air encore plus complexe.
    Le but des feuilles MDI c'est de pouvoir les mettre côte à côte en général pour comparer des contenus (et ton exemple le montre très bien) : avec les onglets c'est mort !

    Quand à ton problème de message d'erreur au démarrage, je pense qu'un step-by-step permettra de le trouver.

    Bon code,
    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
    Expert éminent

    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2002
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 160
    Points : 6 476
    Points
    6 476
    Billets dans le blog
    2
    Par défaut
    Pour le MDI, finalement, je crois que tu as raison, et je vais sans doute en rester là. Les onglets m'apporteront moins d'avantages.

    Pour l'erreur, je l'ai, en fait, dans deux cas :
    1. Quand j'ouvre l'application.
    2. Quand je fais "ouvrir fichier" ... sauf si je fais "Nouveau fichier" avant.
    Pierre GIRARD

  12. #12
    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 043
    Points
    15 043
    Par défaut
    Yep !
    Citation Envoyé par Pierre GIRARD Voir le message
    Quand je fais "ouvrir fichier" ... sauf si je fais "Nouveau fichier" avant.
    Un truc est créé dans la proc "Nouveau" et pas dans la proc "Ouvrir"...

    Fais voir ces 2 procs, si tu veux.
    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

  13. #13
    Expert éminent

    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2002
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 160
    Points : 6 476
    Points
    6 476
    Billets dans le blog
    2
    Par défaut
    Non, ça y est, j'ai trouvé, c'est juste que je faisais appel à une fonction qui ne vérifiait pas si la fenêtre enfant était ouverte et active (un oubli). Du coup, maintenant tout marche sauf des détails, comme l'impression ou la vérification empêchant de fermer un fichier modifié sans demander si il faut le sauvegarder ... ou pas.

    Globalement, je pense y être arrivé, donc merci à tous ceux qui m'ont aidés sur ce coup, en particulier à ThWilliam ... et le lien qu'il m'a donné.
    Pierre GIRARD

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passer une application GWT en mode production
    Par SyLvErStOrM dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 12/05/2015, 00h20
  2. Passer une application en arrière plan/ en premier plan
    Par Invité dans le forum Développement iOS
    Réponses: 1
    Dernier message: 29/01/2014, 17h47
  3. Réponses: 0
    Dernier message: 21/07/2011, 18h22
  4. Faire passer une application par un serveur Sock
    Par Equilibrius dans le forum Développement
    Réponses: 3
    Dernier message: 12/09/2009, 21h53
  5. Réponses: 3
    Dernier message: 10/10/2008, 20h30

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