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 :

Comment créer un EDI ?


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Comment créer un EDI ?
    Salut

    -Debutant en delphi

    -je travaille sur petite application qui me permis de creer des controle dynamquee sur une form et je veux bien enregistrer ce form avec les controles creer dynamique...et puis l'ouvrir..."comme un petit delphi" quelqu'un peux m'aider avec mes meilleur remerciement .
    pour bien comprendre le prb visiter le liens http://www.greatis.com/delphicb/formdes/download.html
    merci javascript:emoticon('')
    Very Happy

  2. #2
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 68
    Points : 66
    Points
    66
    Par défaut
    Bienvenue !

    Vous voulez faire un RAD en fait ?

    Si vous n'aviez pas encore pensé au déplacement / redimmensionnage des controles, je vous propose ce petit composant
    http://www.angusj.com/delphi/sizercontrol.zip

    Pour la création dynamique,vous avez ceci dans la FAQ que je vous invite à lire

    http://delphi.developpez.com/faq/?page=creadyna

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    salut,
    j'ai utilisé le composant de greatis formdesigner, il est bien et pas trop cher, de plus Greatis envoi par mail les nouvelles versions assez régulièrement. Bien que j'ai changé il y a un an pour aller sur les composant de LMD LMDdesigner qui étaient plus fiables d'apres moi mais plus cher.

    Pour greatis formdesigner pour sauver tes créations tu appelles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TDFMFormat = (dfmBinary,dfmText);
     
    procedure SaveToDFM(FileName: string;DFMFormat: TDFMFormat);
     
    procedure LoadFromDFM(FileName: string DFMFormat: TDFMFormat);

  4. #4
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 10
    Points
    10
    Par défaut merci a tous
    mais moi je prefere les free composant acause ... a toi aussi Harvester j'ai bien télécharger ton exemple + la creation des composant dynamique et ... ca marche chez moi
    le prb c tjrs l'enregistrement du formulaire creer et l'ouvrir a nouveau ... j'attends tjrs un exemple claire et merci .

  5. #5
    Membre émérite
    Avatar de Merlin
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2002
    Messages
    524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 524
    Points : 2 883
    Points
    2 883
    Par défaut Re: Form Designer
    Citation Envoyé par servlet1
    -je travaille sur petite application qui me permis de creer des controle dynamquee sur une form et je veux bien enregistrer ce form avec les controles creer dynamique...et puis l'ouvrir..."comme un petit delphi"
    Ce que tu veux faire n'est pas si simple...
    Pour faire "comme delphi", ça c'est facile : WriteComponentResFile et ReadComponentResFile permettent de sauvegarder le flux d'un composant sur disque et de le relire.
    Tu peux aussi utiliser les méthodes de noms proches de la classe Stream si tu veux sauvegarder ça en mémoire, dans un blob, etc.

    Mais cela réclame déjà que les composants utilisés sur la ficher soit enregistrés par RegisterClass avant l'appel à ReadComponentResFile. Donc il faut que l'applicaton qui charge les fiches connaissent tous les composants possibles à l'avance.
    Pour mimer totalement Delphi il faut implémenter le chargement dynamique des packages de composants et le recessencement des classes. Déjà ça se complique un peu...

    Mais quand tu auras ça, tu auras en effet "comme delphi", en mode design... cestà dire l'affichage de la fiche, mais cest tout.
    Si tu veux que les boutons par exemple puissent avoir un OnClick qui fonctionne cela implique davoir du code compilé derrière et delphi le fait quand tu exécutes le projet, pas en design.
    Moralité tu pourras mimer Delphi en mode Design mais certainement pas en mode runtime de l'application. A moins de coder un compilateur Delphi :-)
    Si c'est pour du local perso tu peux appeler ddc32, le compilo en ligne, mais tu ne pourras pas diffuser l'appli à moins que l'utilisateur n'achete une licence Delphi aussi pour avoir le droit sur le compilo.
    La seule solution qui reste est d'utiliser un langage de scripting pour ajouter de "la vie" à tes forms. il en existe plusieurs, gratuits ou payants, mais tout cela devient à mon sens bien complexe pour un débutant...

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 10
    Points
    10
    Par défaut tjrs plonté
    merci Merlin pour la description, mais moi je cherche pas a faire un grand log comme delphi tout
    ce que je cherche c un composant qui peux me sauvgarder mon formulaire creer dynamiquement et l'ouvrir a nouveau
    j'arrive a creer mes controle les deplacer ... mais apres il fau les sauvgarder pour terminer c tous
    j'attends tjrs le composant si quelqu'un peux me l'envoyé"free et merci" et tous mes remerciement

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 68
    Points : 66
    Points
    66
    Par défaut
    On est pas là pour te faire le boulot
    On t'aide, on te réponds à quelques questions mais faut pas pousser non plus

  8. #8
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 10
    Points
    10
    Par défaut merci Harvester
    mais mon prb Harvester que je veux passer a autre chose et je suis ponté et j'arrive pas a depasser le prb DSL et merci Harvester

  9. #9
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    J'ai une petite idée que je ne vais pas développer ici en entier, sinon elle va sembler trop compliquée. je vais juste t'expliquer le principe, à toi ensuite de l’adapter selon tes contraintes.
    N ! : avant de commencer je suppose que le lecteur est familier avec la notion "Class d'objet/Instace d'objet". Dans ce qui suit le terme « référence de Classe » désigne la notion de Classe, et « Objet » pour la notion d’instance. (c’est tout, rien de méchant).

    1- Principe général :
    Le principe général c’est d’avoir un objet globale dans ton appli (en singleton si possible) qui va gérer une liste d’entrées
    de la forme suivante :
    =============
    | E1 | E2 | E3 | E4 |
    =============
    |..... |.....|.....|......|
    |..... |.....|.....|......|
    =============
    C’est une sorte de table d’indexe

    E1 (de type String) : est le nom affecté au type de contrôle (l’équivalant à ClassName)
    E2 (de Type TControlClass) : est la référence de Classe pour le type de contrôle que tu veux utiliser dans ton GUI.
    E3 (de type TControlConfigClass) : est une référence de classe sur le type de fenêtre qui va manipuler le composant en
    design-Time. Elle sera utilisé pour définir les propriétés du control.
    E4 (de type TControlManagerClass) : référence de Classe pour Manager le control elle aura pour tache de
    sauvegarder/charger les propriétés du controle.

    cet objet globale est de type "TControlLibrary" il aura pour tache d'instancier dynamiquement de Controls ainsi que les objet qui permettent sa manip. Mais avant de presenter ce type et son utilisation, je préfére passer en revue les autres classes et référence de classes (je procéde par ordre de complexité)

    2- presentation de TControlConfigClass et TControlManagerClass :
    je préfère expliquer ça par un peut de code.

    2.1- TControlConfigClass est definit ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TControlConfigClass = Class of  TControlConfig ;
    // une référence de classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TControlConfig = Class(TForm)  // c’est généralement une fenêtre qui va afficher le propriété du composant
    private 
      FControl : TControl;
    protected
       procedure SetControl(Value: TControl); virtual; // c’est dans cette routine que tu va charger les valeurs des propriétés a  
    partir de ton controle
    public
       property Control : TControl read FControl write SetControl;
       procedure ApplayChange; virtual; abstract ; // appliquer les changement au control
    end;
    Remarque importante : TControlConfig est la classe de base des fenêtres de configuration des contrôles (créés dynamiquement).
    c'est avec cette classe que tu peut changer les propriétés des composant en mode conception. Il faut noter qu’à chaque type de control il faut créer un descendant de TControlConfig.

    2.2- TControlManagerClass :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TControlManagerClass = Class of TControlManager ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TControlManager = Class(TComponent)
    public
      // Extraire les propriétés à partir d'un control et la stocker dans un objet definition de controle
      function GetConfigFromControl(Ctrl:TControl): TConfigControlChunk; virtual; abstract;
      // appliquer le informations contenu dans l'objet definition de au control
      procedure ApplyConfigToControl(Ctrl:TControl; Cfg:TConfigControlChunk); virtual; abstract;
    End;
    vous remarquez l'utilisation d'un nouveau type "TConfigControlChunk"; c'est enfait un objet qui encapsule la definition (configuration) d'un control. sa structure est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    TConfigControlChunk = Class
    public
      ControlType : String; // Nom du type de controle il fait reference a une entrée dans la table tecrite plus haut
      ControlName: String; // pas tres importantes mais qui peut servir à adresser le control dans les scripts par exemple
      property Properties[IndexOrName:Variant]:Variant ; // une liste dynamique de paires (NomDeProriété/ValeurDeProriété);
      // procedures de chargement/sauvegarde
      procedure LoadFromFile
      procedure SaveToFile
      procedure LoadFromStream
      procedure SaveToStream
      procedure LoadFromXMLNode
      procedure SaveToXMLNode
      ....
    end;
    ainsi les operations de sauvegarde/chargement seront déléguées au TConfigControlChunk par le TControlManager.

    3. Retour à l'objet global de type TControlLibrary :
    definition de la class

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    TControlLibrary = Class(TComponent) // vivement le C++ et ses templates, mais bon!!
    public
      // routine de gestion de la table de correspendance
      procedure RegisterControl(ControlClassName:String; ControlClass: TControlClass; ControlConfig:TControlConfigClass; ControlManager:TControlManagerClass);
      procedure UnRegisterControl(ControlClass: ControlClass);
      // Utilisation de la Table de correspondance
      procedure GetAllControlNames(Strs:TStrings); // la liste de tout les noms des controles referencé par la library 
      function GetControlClass(ControlClassName:String):TControlClass;
      function GetConfigFormOf(Control:TControl):TControlConfig;
      function GetManagerOf(Control:TControl):TControlManager;
    end;
    les methodes presentées sont suffisantes pour implementer des fonctions de génération dynamique d'interface.
    • - on peut avoir la liste de controls disponibles,

    • - instancier un control à partir du nom de sa class (ou tout autre nom attribué a sa class).

    • - avoir dynamiquement un configurateur et un manager d'un control sans se soucier du type de control (du moment que sa class figure dans la table de correspondance).

    Reste à voir comment implementer la Fenetre qui va charger et sauvegarder notre interface (complet) dynamiquement.
    N! la classe "TControlLibrary" devra etre implementé sous forme de Singleton (une instance unique),

    4. La fenetre du GUI :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TDynamicGUIForm = Class(TForm)
    public
      SaveToStream(Strm); // sauvegarder l'interface dans un stream
      LoadFromStream(Strm); // Charger l'interface à partir d'un stream
    end;
    4-1. SaveToStream(Strm)
    algo :
    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
    var
      i:Integer;
      CurCtrl : TControl;
      Library : TControlLibrary;
    begin
      Library := TControlLibrary.GetUniqueInstance;  
      try
        for i:=0 to ControlCount-1 do
        begin
          CurCtrl := Controls[i];
          with Library.GetManagerOf(CurCtrl).GetConfigFromControl(CurCtrl) do // On a une Intance de type TConfigControlChunk;
          begin
            SaveToStream(Strm);
            Free; // Liberer l'Instance de TConfigControlChunk apres utilisation             
          end; 
        end;
      finally
        Library.ReleaseInstance;
      end; 
    end;
    4-2. LoadFromStream(Strm) :
    notre stream sera constitué par une succession de données stocké par des TConfigControlChunk
    algo :
    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
    var
      CurChunk : TConfigControlChunk;
      CurCtrlClass : TControlClass;
      Library : TControlLibrary;
    begin  
      Library := TControlLibrary.GetUniqueInstance;   CurChunk := TConfigControlChunk.Create;
      try 
        wile non fin du Stream do
        begin
          CurChunk.LoadFromStream(Strm);
          CurCtrlClass := Library.GetControlClass(CurChunk.ControlType);
          CurCtrl := CurCtrlClass.Create(Self);
          CurCtrl.Name := CurChunk.ControlName;
          CurCtrl.Parent := Self;
          Library.GetManagerOf(CurCtrl).ApplyConfigToControl(CurCtrl, CurChunk); 
        end;
      finally
        CurChunk.free;
        Library.ReleaseInstance;
      end; 
    end;
    6. Le designer d'interface : (in the next version)

    7. Finally :
    je croie que j'ai fait le tour du problème (sans trop de détail). j'ai essayé d'etre le plus clair possible, mais si ça semble un peu flou dans ta tête, tu n'a qu'à le relire deux ou trois fois (dans un endroit très calme, après une séance de yoga).
    et si ça reste encore flou, ben ta ka me demander des explications. je te répondrais (Inchallah).

  10. #10
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Merci chebreg
    Merci chebreg
    je suis tes explications maintenant et je vais refaire le travail et dès que je trouve un problème insoluble, je t'écris merci .

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

Discussions similaires

  1. [FLASH 5] Comment créer un lien hypertexte
    Par ajit dans le forum Flash
    Réponses: 4
    Dernier message: 30/03/2006, 12h26
  2. Comment créer des barres de Menu ?
    Par MoKo dans le forum IHM
    Réponses: 5
    Dernier message: 30/07/2003, 14h58
  3. Comment créer un nouveau dossier par programmation ?
    Par annecyrond dans le forum Langage
    Réponses: 3
    Dernier message: 27/03/2003, 07h59
  4. Comment créer et executer un .EXE
    Par maher12 dans le forum Flash
    Réponses: 3
    Dernier message: 26/09/2002, 08h33
  5. [] [Stratégie] Comment créer un fichier log
    Par Skeezo dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 16/09/2002, 18h30

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