EXEMPLE DE MANUAL DOCKING OU COMMENT DONNER DE LA SOUPLESSE À VOS APPLICATIONS

Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 - 3 févr. 2011 à 15:54
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 9 mars 2011 à 09:10
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52780-exemple-de-manual-docking-ou-comment-donner-de-la-souplesse-a-vos-applications

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
9 mars 2011 à 09:10
@paustmart :
j'ai des applis mais on ne peut plus banales..
mais qui ne traitent pas la création de fiches à
l'intérieur d'un Thread ce qui est bien le sujet évoqué
par Caribensila.
Mais, il suffit de tester, c'est-à-dire placer :

if not Assigned(Form2) then
Application.CreateForm(TForm2, Form2)

dans une procédure située dans un Thread
en enlevant dans les options la création au démarrage de la form2

pas de quoi déposer une source, tout juste peut-être un snippet..

cantador
paustmart Messages postés 19 Date d'inscription dimanche 2 novembre 2003 Statut Membre Dernière intervention 26 novembre 2013
7 mars 2011 à 16:10
Juste pour la note que j'avais oublié
paustmart Messages postés 19 Date d'inscription dimanche 2 novembre 2003 Statut Membre Dernière intervention 26 novembre 2013
7 mars 2011 à 16:03
BONJOUR Cantador

Tu dis avoir des applications perso qui continennent des Thread et des créations de fiches pourrais tu faire une démo cela m'interesserai comme beaucoup de mon niveau (Débutant chronique)
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
11 févr. 2011 à 16:05
Bonjour Caribensila,
non,
j'ai des applications perso qui continennent des Thread et des créations de fiches
mais effectivement ça me semble une excellente idée de faire le tout ensemble et cela ne doit pas à priori poser de soucis.

cantador
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
11 févr. 2011 à 14:57
Bonjour Cantador,

Dans une application lourde, as-tu déjà essayé de construire les fiches dans un Thread dont la priority = tpIdle ?
Cela pourrait être une méthode combinant tous les avantages.
Il me semble que le risque que l'utilisateur demande la construction d'une fiche en même temps que l'application (faible probabilité), ne doit pas être très difficile à gérer...
Qu'en pensez-vous ?
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
11 févr. 2011 à 10:15
@cirec : utile, efficace - bonne idée.
@L_art_ment et Caribensila :
le souci de la création des fiches se pose bien évidememnt lorsque ces dernières sont lourdes
deux solutions :
soit on les créent à la demande, l'application s'ouvre plus vite au démarrage mais souffrira un peu lors de l'ouverture de celles-ci.
soit, on laisse delphi les créer au démarrage et dans ce cas, l'utilisateur devra patienter et ensuite tout sera léger.
il n'y pas vraiment de solution miracle..

Pour ma part, j'opte le plus souvent pour la création des fiches au démarrage et lorsque vraiment, le temps d'ouverture semble long (ce qui est parfois pénible), alors je mets en place une barre de progression pendant la création des fiches + ouverture des tables.
Cela rassure en quelque sorte l'utilisateur qui ne se pose plus de questions à savoir si l'appli est plantée ou pas etc.

Ce système est d'ailleurs courant aujourd'hui (barre de progression lors des installations
des logiciels ou chargement dans les jeux vidéos etc..)

Il faut aussi prendre en compte l'objet de l'application.

cantador
aafi Messages postés 24 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 12 janvier 2011
8 févr. 2011 à 16:27
pour CIREC , test fait sous DELPHI5 , après 30 minutes de nettoyage,
car pas mal de choses n'existaient pas sous D5 :

bien sur XPmanifest et VARIANTS (heureusement ta démo n'en a pas du tout besoin)

ensuite quelques nouvelles propriétés , sur les boutons LBL_LINK1 LINK2 LINK3 (OnMouse et Font.Color) , sur les PANEL (Panel1 ParentBackground), LabelSpacing ... etc ..

et surtout les composant TLabeledEdit ou LabelEdit (inexistant en D5 , mais l'équivalent existaient dans les packs de composants payants ou gratuits, tel que PROLIB18)

Pour faire cela, évidemment pas dans l'IDE , ce nettoyage se fait dans un éditeur tel que NotePad++ ou PSPad (mes préférés)

et aussi la directive {$IF qui, sauf mon ignorance, n'existait que sous une forme limitative : $IFDEF ou $IFNDEF ...

Et bien, merveille, ça marche impeccable sous D5 , résultat identique , enfin pour ce qui est de l'aspect visuel et du fonctionnement,
par contre l'embonpoint et l'obésité made in USA nous frappe de plein fouet :
l' EXE = 1176 ko sous D5 , et maintenant 1763 ko sous D2010 !!!

dont environ 800ko rien que pour l'image incorporée dans UMAIN.DFM (pour l'ombrage)

cordialement
************
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
7 févr. 2011 à 14:12
@aafi:
pour D5, oui je comprends mais saches que ça prend 5mn pour se faire un composant TXPManifest compatible avec D7 et +

à l'occasion si tu pouvais tester le code sous D5 pour savoir si ma modif est acceptée où non.
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
7 févr. 2011 à 13:48
@olivier1955:
Merci pour le commentaire ... pour la note, si tu y tiens toujours, tu peux à nouveau noter. L'ancienne a été supprimée.

@Caribensila:
"Voici une petite manip' de docking sans une seule ligne de code entraînant de grands effets sans trop d'efforts non plus ! ^^ "

oui ... mais c'était pas le but recherché, je pense que l'utilité est différente ici. Le code que je propose offre, à mon avis, des possibilités autres que celles du docking automatique. ;)

@Tous:
D'ailleurs à ce propos, vous trouverez dans les Démos de Delphi un bel exemple de Docking (Drag n Drop) sur fiches et ToolBars.

Répertoire d'installation de Delphi ... \Demos\Docking\DockEx.dpr
aafi Messages postés 24 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 12 janvier 2011
7 févr. 2011 à 13:43
pour CIREC : la version modifiée (je n'ai pas regardé ce qui avait changé) , fonctionne correctement sous D2010.

pour ce qui est de DELPHI5 , c'est effectivement par nécessité : quand on dispose de nombreux composants PAYANTS sous D5 , on n'a pas envie de remettre des centaines d'euros pour acquerir les memes en version plus récente.
Et aussi, je suis définitivement faché avec la nouvelle formule des Helps apparu avec D2005 et suivants (tout ça pour se mettre au diapason de Microsoft).
olivier1955 Messages postés 2 Date d'inscription lundi 3 décembre 2007 Statut Membre Dernière intervention 7 février 2011
7 févr. 2011 à 11:35
oh désolé, j'avai mis 5 étoiles, ignorant que ça voulait dire 5/10, je corrige le tir et met 10/10.
olivier1955 Messages postés 2 Date d'inscription lundi 3 décembre 2007 Statut Membre Dernière intervention 7 février 2011
7 févr. 2011 à 11:34
Merci Cirec pour cette démo léchée qui fonctionne très bien (D2007).
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
7 févr. 2011 à 11:13
Salut,

Delphi 7 est un minimum aujourd'hui ... ceux qui veulent rester à une version antérieur (par choix où nécessité) ... libre à eux mais 99,9% des codes déposés ici le sont pour D7 et plus

Le thème XPManifest est un "problème" connu depuis au moins 8 ans et des solutions alternatives existes, à vous de les utiliser. ( J'ai fait une modif dans le code mais je sais pas si ça passe sous D5, version que je ne possède pas)

Sinon le code est modifié pour contrer l'erreur ... il semblerait que l'évènement OnChange du PageControl soit déclenché une deuxième fois sous D2009 et + ... problème résolu.
aafi Messages postés 24 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 12 janvier 2011
7 févr. 2011 à 07:58
je précise ou ça coince , dans cette portion de code

{Sélection du menu en fonction de la fiche au premier plan}
procedure TMainDocfrm.PageControl1Change(Sender: TObject);
var X1 : integer ;
begin
X1 := PageControl1.ActivePage.ControlCount-1 ;
if (PageControl1.ActivePage.Controls[X1] is TForm) then begin

** nota : j'ai légèrement modifié pour faire apparaitre l'indice X1 ,
qui se révèle être NEGATIF , soit -1
aafi Messages postés 24 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 12 janvier 2011
7 févr. 2011 à 07:35
Veuillez signaler que votre code est fait pour DELPHI7 (que je ne possède pas)

Avec DELPHI5 , beaucoup d'erreurs, car le composant XPmanifest n'existe pas.

Avec DELPHI2010, la compile et le début d'exécution fonctionne impec ( le projet DPR est transformé en DPROJ automatiquement)
La ou ça coince, c'est lorsqu'on clique sur l'un des boutons "Relacher Manuellement" : on récolte une erreur grave
"le projet ManualDoc.EXE .... EAcessViolation ... adresse 00433136 .... lecture adr 000008"

L
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
6 févr. 2011 à 23:30
Voici une petite manip' de docking sans une seule ligne de code entraînant de grands effets sans trop d'efforts non plus ! ^^

Dans la démo de Cirec je prends, pour l'exemple, l'appli SHADED TEXT.


1) Mettre la propriété 'DockSite' de la fiche 'Ombrefrm' à true.
2) Mettre la propriété 'DragKind' du TPanel 'Panel1' à 'dkDock'.
3) Mettre la propriété 'DragMode' du TPanel 'Panel1' à 'dmAutomatic'.
Lancez l'application et amusez-vous à "draguer" le Panel1 où ça vous chante.

Dans cet exemple ça n'a pas grand intérêt, mais imaginez ce truc dans des applications prévues pour... ;)
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
5 févr. 2011 à 08:30
Merci CIREC
cs_systmd Messages postés 41 Date d'inscription mercredi 25 février 2004 Statut Membre Dernière intervention 29 août 2012
4 févr. 2011 à 21:49
Bonjour
Merci pour cette méthode simple et efficace, qui va me rendre de grand service.
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
4 févr. 2011 à 19:41
j'me rend compte que j'étais un peu avare :D

donc, pour que ça fonctionne il faut impérativement déposer un TMainMenu sur la fiche principale de l'application (avec ou sans Items ça n'a pas d'importance).

La gestion est très simple vous verrez cela dans le code
j'ai "poussé" la gestion aux "multimenus" donc chaque fiche peut contenir un TMainMenu et en fonction de la page active et si c'est une fiche(TForm) et si elle dispose d'un MainMenu il sera affiché à la place habituelle.

ah oui, dans l'unité UMain.pas du projet de Caribensila, à la fin, on y trouve un exemple de retrait du menu si l'on demande la fermeture de la fiche par commande interne.

Voilà .. je crois qu'il ne manque plus rien :D
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
4 févr. 2011 à 19:24
Salut à tous ;)

merci pour vos commentaires ... je suis content que ça vous plaise

@Dubois77:

je pense avoir résolu le problème des menus ... à savoir qu'un TMainMenu ne peut s'afficher qu'en haut d'une fiche ... de ce fait il faut ruser :D

encore une petite astuce qui, je trouve, règle assez bien le problème sans trop d'efforts ^^
fbalien Messages postés 251 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 11 novembre 2016
4 févr. 2011 à 18:52
Bonjour

simple et efficace

A+
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
4 févr. 2011 à 13:51
Bonjour
Question d'un néophyte :
J'ai essayé le source de CIREC avec le truc de Caribensila (tout est impec !) avec une application autre que celles qu'il a fourni.
Dans cette application il a un menu
Elle n’apparaît pas à l’exécution
Comment faire pour voir le menu (si cela est possible bien sur)
Cordialement
Roger
L_art_ment Messages postés 302 Date d'inscription vendredi 21 septembre 2007 Statut Membre Dernière intervention 6 février 2013
4 févr. 2011 à 08:44
Cher Cirec... :D

Encore une fois, Delphifr tombe à point pour moi !

Cette source est exactement ce que je souhaite faire dans l'une de mes applications en ce moment, une application assez lourde (avec base de données, active directory et tout le tralala).

J'avais utilisé une méthode autre, le principe était de ne pas créé les forms dés le démarrage (comme le préconise Cari juste au dessus) et de les créer au moment voulu dans mon appli en renseignant un panel sur ma form Principale comme parent de la form à créé (euh ma phrase est-elle claire ?)
Cependant, un problème se posait, admettons, si de ma form3, je souhaitais agir sur un composant de ma form Principale (par exemple un ClientDataSet relié à une dbGrid) je me retrouvais avec des messages d'erreur, alors que mon code était bon.

Je vais donc essayé avec ta methode pour voir si je peux accéder d'une fiche à l'autre sans soucis.

Merci pour ton source !
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
3 févr. 2011 à 23:32
Tiens ! J'en profite pour donner un 'truc' qui est souvent négligé et qui permet de lancer une application un peu lourde plus rapidement. Ce qui n'est pas anodin si, comme moi, vous avez pris l'habitude d'utiliser WordPad plutôt que Word pour cette raison, par exemple... ;)

Dans une application, seules les fiches nécessaires dès le démarrage doivent être crées automatiquement !

Si je prends comme exemple la démo de Cirec et que l'on considère que d'écrire avec des ombres sera une occupation occasionnelle, il n'est pas nécessaire de créer la fiche Ombrefrm dès le lancement.

Comment faire ?

Sous D7, dans l'IDE, cliquer sur Projet/Options.../Fiches
et mettre la fiche Ombrefrm en disponibilité en cliquant sur le '>'. Ainsi, elle ne sera plus créée au démarrage.

Et ajouter cette ligne dans le code de Cirec pour créer la fiche quand besoin :

procedure TMainDocfrm.btn_Doc3Click(Sender: TObject);
begin
btn_Doc3.Enabled := False;
btn_UnDoc3.Enabled := True;
if Ombrefrm=nil then Application.CreateForm(TOmbrefrm,Ombrefrm); /////// La ligne à ajouter //////
Ombrefrm.ManualDock(PageControl1, nil, alClient);
PageControl1.ActivePageIndex := PageControl1.PageCount - 1;
if not Ombrefrm.Visible then Ombrefrm.Show;
end;

En faisant de même avec toutes les fiches secondaires, l'utilisateur ne s'apercevra de rien et aura le sentiment d'utiliser une application alliant légéreté et performances. Le rêve, quoi...

Merci à Cirec de me pardonner ce squat, mais c'était l'occasion... ;)
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
3 févr. 2011 à 17:03
Téléchargé, testé, approuvé et bien sur félécité Cirec !
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
3 févr. 2011 à 15:54
« Certaines idées complexes peuvent être vaines et confuses; certaines idées simples peuvent être bien vues, suffire, et mener très loin. »
[Didier Nordon. Revue: Pour la Science. Février 2011]

Et bien, voici une citation qui s'applique parfaitement à ce 'post'. :)
Merci Cirec.

Je me permets de préciser que cette démo a été inspirée à Cirec par une discussion du forum concernant le Modèle MDI qui est un mode d'écriture 'deprecated' dans Windows. Cette démo illustre à merveille une alternative puissante et pleine d'intérêt.
Rejoignez-nous