8
votes

Contrôles d'interface graphique "d'objet"

J'ai des objets commerciaux écrits à Delphi avec un schéma personnalisé de la persistance de la base de données qui fonctionne enfin pour mes besoins. D'accord, super. Maintenant, il est temps pour les implémentations de l'interface graphique. Et ici commence les problèmes.

Comment lier mon objet à l'interface graphique correctement?

Je ne peux pas utiliser les contrôles de sensibilisation des données car j'ai isolé tous les composants d'accès aux données dans la couche ORM, donc je commence à écrire quelques contrôles "d'objet" à l'aide de l'unité RTTI (je travaille avec Delphi 2010), mais j'ai le Sentir que je vais dans la mauvaise façon ...

Quelques idées sur la façon de résoudre ce problème en utilisant uniquement les commandes VCL?


0 commentaires

5 Réponses :


0
votes

Il n'y a actuellement aucun moyen de le faire en utilisant uniquement des commandes VCL. Je sais que Lazare a un ensemble de contrôles informatiques basés sur la RTTI; Vous voudrez peut-être les regarder pour des idées de base. Mais c'est plus difficile que vous ne pourriez penser au début. Par exemple, contrairement à un jeu de données, un objet n'a pas de mécanisme de signalisation intégré lorsque les valeurs de ses membres changent. Ce qui signifie que si vos contrôles de liaison de données ne possèdent pas l'objet complètement et que rien d'autre n'a accès à celui-ci, il est possible qu'un autre code puisse modifier une certaine valeur, puis ce changement ne se reflète pas dans l'interface utilisateur.

J'ai entendu diverses choses de l'équipe DELPHI au cours des dernières années sur l'extension du modèle d'objet ou du modèle RTTI afin de permettre une meilleure liaison de données, mais quoi que ce soit à peu près, c'est encore quelques années.


1 commentaires

J'ai développé tout un cadre conscient de l'objet autour de ces principes en 1998 (Delphi 4), ainsi qu'une couche de cartographie de données équivalente. Cependant, la quantité de travail impliquée pour le faire correctement est une voie, de bien plus que vous ne le penseriez - donnez-vous un bien 6-12 mois pour développer quelque chose qui serait prêt à être utilisé dans une application commerciale non triviale. Bien que vous puissiez prototyper ces choses dans une journée environ, il ne s'agit absolument aucune indication de la quantité de travail requise pour mettre en œuvre correctement la conception.



2
votes

Ce que vous pouvez faire (bien que je n'ai aucun échantillon de code) utilise une combinaison de

  • Aides de classe ou classes d'intercepteurs li>
  • Interfaces de liaison pour les objets de domaine unique et / ou les listes d'objets de domaine li> ul>

    Les aides de classe ont l'inconvénération qu'elles ne sont pas prises en charge officiellement et que vous ne pouvez pas ajouter de champs à la classe que vous aidez. p>

    Les classes d'interceptage sont simplement des classes descendantes avec le même nom que leur Ancêtre: P>

      function TButton.IsEnabled: Boolean;
      begin
        Result := Self.Enabled;
      end;
    
      procedure TButton.Execute;
      begin
        Self.Action.Execute;
      end;
    
      procedure TButton.Update;
      begin
        Self.Action.Update;
      end;
    
      function TEdit.GetValueFromControl: string;
      begin
        Result := Self.Text;
      end;
    
      procedure LoadValueIntoControl(const aValue: string);
      begin
        Self.Text := aValue;
      end;
    
    • Vous pouvez continuer à concevoir votre interface utilisateur à l'aide de contrôles Standard VCL ou de tiers. LI>
    • Vous obtenez tous les avantages des descendants. Li>
    • Vous n'avez pas besoin de créer ou d'installer vos propres contrôles. LI>
    • Pas besoin de classes de mappeuse spéciales ou d'utilisation de RTTI. LI>
    • facilement (bien, relativement facilement) intégré dans une interface utilisateur testable (Dunit-) dans le cadre des lignes de l'article de Julian Bucknall à ce sujet dans le magazine (distinct) Delphi, comme indiqué dans cette question / réponse: Mainlières d'événement de souris li> ul>

      pseudo échantillon de commande d'intercepteur avec interface de liaison / interface de commande: p> xxx pré>

      implémentation pourrait être le long des lignes de: p> xxx PRE> P>


0 commentaires

1
votes

Mon client actuel a fait ses propres classes "mapper" dans le passé (avant de venir). Leurs objets de données ont des champs (qui sont des objets) et vous pouvez mapper ces champs à un contrôle. J'ai étendu le cadre en utilisant une approche de type MVC: xxx

par commande une classe "mappage" simple est créée: xxx

non Rocket Sience, et peut-être de meilleures solutions sont disponibles en moyenne (cela a fonctionné dans D6 et inférieur :-)) Mais cela fonctionne assez bien pour le client.

BTW: Un générateur d'objet de données est également utilisé. Donc, si un champ change dans la base de données (par exemple, TARRA.TARID est modifié en taraid), nous obtenons une erreur de compilateur car "Tarid" n'existe plus. Cela fonctionne beaucoup mieux que la cartographie «chaîne fixe» (erreurs d'exécution).


1 commentaires

C'est une solution intéressante, mais cela nécessiterait une refonte complète sur mes objets d'affaires ... ce sera plus complexe, mais je pense que je vais essayer le modèle de médiateur de l'interface graphique modèle comme suggéré par A. Bouchwz. Beaucoup de thaks, homme.



6
votes

Vous avez plusieurs modèles pour relier OrM avec interface utilisateur.

voir par exemple le Modèle GUI Mediator Modèle. En bref, vous écrivez un observateur qui reflétera le contenu ORM dans les composants de l'interface utilisateur et inversement. Ceci a été mis en œuvre par exemple dans le Cadre TIOPF pour Delphi < / a> (ce lien contient des vidéos).

Une autre approche consiste à mapper vos données au moment de l'exécution: vous concevez votre formulaire comme d'habitude, alors vous remplissez le contenu de l'événement inshow , puis le " enregistrer " Ou " ok " est validera, puis enregistrez le contenu dans l'enregistrement ORM. C'est ce qui se fait dans le exemple d'application principale de notre cadre . Facile à coder dans cet échantillon simple, mais pourrait entraîner un code spaghetti si vous avez beaucoup de champs et de validation à utiliser.

La dernière approche consiste à laisser votre orje crée la forme.

Dans notre cadre, vous pouvez définir des propriétés de l'interface utilisateur sur chaque table, dans une structure dédiée. Ensuite, Une seule unité créera un formulaire avec tous les champs modifiables de votre objet Orm. Les liens vers d'autres enregistrements seront affichés sous forme de liste déroulante, Boolesans sous forme de cases à cocher, définit des radioboxes, etc. Ensuite, le filtrage (par exemple, couper un champ de texte des espaces situés à gauche ou à droite) et la validation (par exemple, assurez-vous qu'une valeur de champ est unique ou une adresse IP valide) est manipulée pas dans la partie UI, mais dans la logique commerciale elle-même, c'est-à-dire l'ormes .

IMHO Il est obligatoire de conserver une véritable architecture multi-niveaux. C'est-à-dire que l'interface utilisateur doit compter surtout sur la logique commerciale. Par exemple, la validation des données doit faire partie de l'ORM, non de l'interface utilisateur. Par exemple, si vous décidez d'ajouter un client Web à votre application client Delphi, vous n'aurez pas à coder la validation une autre fois: elle sera commune aux deux clients, séparé des détails de la mise en œuvre de l'interface utilisateur.


1 commentaires

Bien que la deuxième approche puisse être plus facilement mise en œuvre dans mon cas particulier, je pense que je vais prendre le premier, car il sera plus facile de faire et de maintenir des formes complexes à long terme. J'ai lu le document sur le motif de lien et MGM semble convenir comme gant pour moi. Merci beaucoup.



0
votes

Jetez un coup d'œil à Everclassy Dataset à http://www.inovativa.com.br . Cela peut répondre à vos besoins. Everclassy DataSet est un jeu de données Delphi conçu pour être rempli par des objets à la place des enregistrements d'un système de base de données.

Avec ce composant, vous aurez la possibilité d'interopérer vos objets de domaine avec des composants de Dataware, ce qui vous donnera une grande puissance pour construire votre interface graphique.


0 commentaires