Accueil > Forum > > > > Besoin d'explication : Pourquoi ca marche ?
Besoin d'explication : Pourquoi ca marche ?
samedi 27 janvier 2007 à 15:59:55 |
Besoin d'explication : Pourquoi ca marche ?

bradlemon
|
Tout d'abord bonjour à tous et bonne année !!!
Je débute en delphi et histoire de comprendre comment ca marche je fais quelques petits "essais" et je suis tombé sur un problème de compréhension du langage.
Voici ma question : mon projet contient un programme principal (essai) 2 forms (main et client) . Sur la première Form, j'ai 2 boutons : 'Consulter' et 'Modifier' qui comme vous l'aurez compris vont ouvrir la seconde Form soit en consultation soit en modification. le code ci-joint fonctionne (pour tester, je modifie simplement le titre de la seconde fenêtre).
Ma question est la suivante : pourquoi suis-je obligé de mettre Application.CreateForm(TForm_client, Form_client); dans mon programme principal (ligne en rouge) alors que j'ai déjà Form_client.FormCreate(Form_client,mode_choisi); dans les fonctions évenementielles des boutons (lignes en bleu) ?
D'avance merci pour vos réponses.
voici le codes des trois Unit : ******************************************** le programe ******************************************** program essai;
uses Forms, main in 'main.pas' {Form_main}, client in 'client.pas' {Form_client};
{$R *.res}
begin Application.Initialize; Application.CreateForm(TForm_main, Form_main); Application.CreateForm(TForm_client, Form_client); Application.Run; end.
****************************************** Unit main : contient les deux boutons ****************************************** unit main;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, client;
type TForm_main = class(TForm) Btn_consulter: TButton; Btn_modifier: TButton; procedure Btn_consulterClick(Sender: TObject); procedure Btn_modifierClick(Sender: TObject); private public
end;
var Form_main: TForm_main; mode_choisi:string;
implementation
{$R *.dfm}
procedure TForm_main.Btn_consulterClick(Sender: TObject); begin
mode_choisi:='consulter'; Form_client.FormCreate(Form_client,mode_choisi); Form_client.ShowModal; end;
procedure TForm_main.Btn_modifierClick(Sender: TObject); begin mode_choisi:='modifier'; Form_client.FormCreate(Form_client,mode_choisi); Form_client.ShowModal; end; end.
************************************************ Unit client : une fenetre vierge où seul le Caption est mis à jour ************************************************ unit client;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm_client = class(TForm) procedure FormCreate(Sender :TObject; var mode:string); private { Private declarations } public end;
var Form_client: TForm_client;
implementation
{$R *.dfm} procedure TForm_client.FormCreate(Sender :TObject; var mode: string); begin
if mode='consulter' then Form_client.Caption:='Consultation' else Form_client.Caption:='Modification' end;
end.
|
|
samedi 27 janvier 2007 à 16:44:51 |
Re : Besoin d'explication : Pourquoi ca marche ?

f0xi
|
Réponse acceptée !
mon dieu ... faut pas faire comme ça mon ami! bon deja, bon point pour toi, tu utilise ShowModal ce qui est bien pour ce type d'application. mais c'est mieux de faire comme cela : unit main;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm_main = class(TForm) Btn_consulter: TButton; Btn_modifier: TButton; procedure Btn_consulterClick(Sender: TObject); procedure Btn_modifierClick(Sender: TObject); private public
end;
var Form_main: TForm_main;
implementation
{$R *.dfm}
uses Client;
procedure TForm_main.Btn_consulterClick(Sender: TObject); begin Form_Client.Execute(FCL_SHOW);
{ // variante d'utilisation :
if Form_Client.Execute(FCL_SHOW) then
ShowMessage('La fiche viens d''être consultée.');
} end;
procedure TForm_main.Btn_modifierClick(Sender: TObject); begin Form_Client.Execute(FCL_EDIT); { // variante d'utilisation :
if Form_Client.Execute(FCL_SHOW) then
ShowMessage('La fiche viens d''être modifiée.') else
ShowMessage('Modification de la fiche annulée.')
} end;
end.
unit client;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm_client = class(TForm) Btn_Ok : TButton; { propriété ModalResult sur mrOK } Btn_Cancel : TButton; { propriété ModalResult sur mrCancel } private public function Execute(const Mode : word) : boolean; end;
var Form_client: TForm_client;
const FCL_SHOW = word($0001); FCL_EDIT = word($0002);
implementation
{$R *.dfm}
function TForm_client.Execute(const Mode : word) : boolean; begin case Mode of FCL_SHOW : Caption := 'Consultation'; FCL_EDIT : Caption := 'Modification'; end;
// en mode consultation pas de boutton "annuler" Btn_Cancel.Enabled := Mode <> FCL_SHOW;
// Execute ne renvois True que si le boutton Ok est préssé Result := ShowModal = mrOK; end; end. Croc (click me)
|
|
dimanche 28 janvier 2007 à 07:52:05 |
Re : Besoin d'explication : Pourquoi ca marche ?

bradlemon
|
merci FOxi pour ton aide. J'aurai trois questions supplémentaires :
1. dans la déclaration des constantes FCL_SHOW et FCL_EDIT que signifient ($0001) et ($0002) ?
2. Je suis donc obligé de garder Application.CreateForm(TForm_client, Form_client); dans la partie program. Cela signifie-t-il que la Form est créée dès le démarrage du programme ? si oui, la mémoire nécessaire pour la création de la Form_client est également allouée dès le démarrage du programme ?
3. Dois-je mettre une Application.CreateForm(...) dans la partie program pour toutes les Form qui vont exister dans mon logiciel ? Je veux dire que si j'ai une trentaine de Form dans l'ensemble du logiciel, cela fait beaucoup de Form crées dès le démarrage alors que seules quelques-unes ne seront peut-être utilisées par l'utilisateur, non ?
D'avance merci.
|
|
dimanche 28 janvier 2007 à 13:13:45 |
Re : Besoin d'explication : Pourquoi ca marche ?

cantador
|
Réponse acceptée !
Dans delphi, tu as deux possibilités pour les formes :
Soit tu laisses Delphi les créer automatiquement (voir Projet/Options/fiches) et dans ce cas pour les afficher tu peux utiliser : Form1.show ou Form1.ShowModal ou utiliser l'astuce de foxi pour changer le caption. Cette technique est à priviligier lorsque les formes servent très souvent ou sont petites.
lorsque les formes sont plus imposantes ou sont utilisées moins fréquemment, on aura intérêt à ne pas les créer au démarrage (voir Projet/Options/fiches) mais à différer leurs créations, en utilisant par exemple :
If not Assigned(Form_client) then Application.CreateForm(TForm_client, Form_client); Form_client.Show;
cantador
|
|
dimanche 28 janvier 2007 à 13:24:54 |
Re : Besoin d'explication : Pourquoi ca marche ?

jace1975
|
Réponse acceptée !
c'est tout bete,
va dans le menu projet/options/fiche. Là tu vois deux listbox, une indiquant les fiches créées dès le début d'execution de ton programme et à droite celles qui ne le sont pas mais que tu peux appeler en cours.
donc si toutes tes fiches sont dans la listbox de gauche, c'est normal que tu es Application.CreateForm(TForm_client, Form_client) dans la partie program et le Form_client.FormCreate(Form_client,mode_choisi); n'est pas nécessaire.
par contre si une fiche est dans la listbox de droite, tu dois la créer avant son appel, donc faire appel à tes Form_client.FormCreate(Form_client,mode_choisi); et ne pas oublier aussi de tous bien libérer si tu as vraiment un probleme de mémoire .
pour plus d'info regarde dans l'aide à tapplication; tu auras la réponse à tes questions
j'espère avoir été clair
|
|
dimanche 28 janvier 2007 à 17:22:42 |
Re : Besoin d'explication : Pourquoi ca marche ?

bradlemon
|
merci à tous pour votre aide. @bientôt.
|
|
dimanche 28 janvier 2007 à 17:48:22 |
Re : Besoin d'explication : Pourquoi ca marche ?

f0xi
|
Réponse acceptée !
1. dans la déclaration des constantes FCL_SHOW et FCL_EDIT que signifient ($0001) et ($0002) ?
$ signifie que le chiffre qui suis vas etre en hexadecimal, $0001 et $0002 sont equivalant a 1 et 2, mais dans le cas de constante qu'on utilise comme des "flags" (switch de mode etc) on prefere souvent les ecrires en hexa avec parfois un transtypage inclus dans l'affectation : word($0001) pour signifier que FCL_? ne vas prendre que deux octets (registre 16 bits) et non dans un integer (registre 32bits). ici on aurait meme pus signifier : byte($01) et byte($02) pour les stocker dans un registre 8 bits. 2. Je suis donc obligé de garder Application.CreateForm(TForm_client, Form_client); dans la partie program.
Cela signifie-t-il que la Form est créée dès le démarrage du programme
? si oui, la mémoire nécessaire pour la création de la Form_client est
également allouée dès le démarrage du programme ?
en effet, avec cette methode c'est l'appli qui gere la creation de la fiche Form_Client, elle alloue egalement la memoire necessaire pour cette fiche dés le demarrage. la ou Cantador a tort et a la fois raison, c'est qu'il faut reflechir a 2 choses, en effet des petites fiches ne prendrons pas beaucoup de ressources memoire mais, une grosse fiche pourrait etre plus longue a etre crée. il faut donc reflechir au confort d'utilisation, soit on economise les ressources, soit on prefere la rapiditée d'utilisation. sincerement je prefere toujours laisser l'appli gerer les fiches consequentes ou petites, de toute façon, les ressources devront etre allouée tot ou tard, au moins, en allouant dés le debut, on est sur de la disponibilitée de ces dernieres quand on appeleras nos fiches enfants.
3. Dois-je mettre une Application.CreateForm(...) dans la partie program
pour toutes les Form qui vont exister dans mon logiciel ? Je veux dire
que si j'ai une trentaine de Form dans l'ensemble du logiciel, cela
fait beaucoup de Form crées dès le démarrage alors que seules
quelques-unes ne seront peut-être utilisées par l'utilisateur, non ?
voir ma reponse au dessus, a toi de gerrer correctement l'equilibre ressource/performance. voir TOpenDialog, TSaveDialog et surtout TCustomDialog, cela peut etre une bonne idée quand on a besoin de plusieurs fenetre "outils". on les appel directement par leur fonction Execute qui se charge de la creation et de la liberation. Croc (click me)
|
|
dimanche 28 janvier 2007 à 19:53:23 |
Re : Besoin d'explication : Pourquoi ca marche ?

cantador
|
Réponse acceptée !
Oui foxi, ce qui également intéressant afin de compléter ton explication, est qu'une fois la fiche créée, il n'est pas nécessaire de la re-contruire une deuxième fois, ainsi l'utilisateur verra le sablier (en cas de grosse fiche) au premier click mais lors du 2e la fiche s'ouvrira instantément... @+ cantador 
|
|
lundi 29 janvier 2007 à 04:10:54 |
Re : Besoin d'explication : Pourquoi ca marche ?
|
Cette discussion est classée dans : form, end, client, tform, main
Répondre à ce message
Sujets en rapport avec ce message
Create Form explication [ par Bruto ]
Salut,voila comme je débute en Delphi ( migration VB oblige ), je rencontre qq prob's.Explication ( ce que je voudrais ) :Mon programme se lance et pa
pb a creer un exe avec la principal form invisible [ par Winniez ]
J'ai voulu au demarrage de exe afficher une autre form que la form principal. a l'execution sa me met une erreur, apres g mis le meme code dans un bou
Form dans une dll mIRC [ par Delirium ]
Je suis en train de faire ma première source en Delphi pour me familiariser avec ce language, et je créer une dll pour mIRC.Je voudrais afficher une F
Réccupérer des données sur un autre Unit [ par m_cyril1 ]
J'ai fait un petit programme, celui-ci mémorise des chiffres entier sur une première form et sur la deuxième le résultat de la somme des chiffres s'af
dériver une form ? [ par DeltaFX ]
En fait j'ai besoin d'ajouter à la class Tform une procedure, donc de créer une classe du genre TExtendForm qui reprendraient tout d'une TForm normale
TIdTCPServer réouverture de connexion impossible [ par nitrique ]
Bonjour à tous,J'ai une connection TCP/IP indy avec TIdTCPServer et client.Sur le serveur, je lance mon application: OKSur le client je lance mon appl
Thread : Synchronize Bloqué !!!! [ par picolo5 ]
Bonjour à tous !Je dev un projet qui utlise une dll. Cette dll me permet de me connecter à un serveur et de recuperer une trame.J ai donc mis en place
TImage et TForm [ par Zareth ]
Wou, bon j'ai un autre soucis, je possède 2 composant TForm et dans l'un d'entre eux une TImage qui est définit comme alignée en alclient. Cette Form
deplacement de la form [ par Nicolas___ ]
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);begin if appuie thenbeginform1.Left:=x;form1.Top:=y;end;end;Pourqu
configurer en client serveur [ par kadje84 ]
Salut à tous, bonne et heureuse année 2007svp, je voudrais un coup de main pour configurer mon ordinateur afin de tester les codes sources des applica
Livres en rapport
|
Derniers Blogs
[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Arnault Nouvel et Antoine Dongois Le processus à prendre : Apprendre (découvrir la plateforme) Préparer (documenter l'historique et choisir la méthode de MAJ) Test (Test de MAJ) Implémenter (Effectuer la MAJ) Valid...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOURTECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOUR par ROMELARD Fabrice
Après un retour sur l'histoire des TechDays de Paris et le fait que ce soit le plus gros event MS au monde (du fait de sa gratuité), le président de MS France (Eric Boustoullier) a fait une présentation de la vision Microsoft pour les années à venir...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|