IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Blog de Serge Girard (aka SergioMaster)

Livebindings : Concepteur visuel ou codification ? Partie 2 - Création des liens à l'exécution

Noter ce billet
par , 30/09/2020 à 12h02 (469 Affichages)
Les reproches que je peux faire au concepteur visuel de liens sont quand même assez nombreux.

Outre le fait qu'il crée des liens rapides avec les inconvénients que j'ai pu déjà relever dans mon premier billet sur le sujet
dès que vous écrivez une application un peu conséquente : plusieurs sources de données, fiches, module de données le concepteur représente vite "une assiette de spaghettis boulettes" ! À moins d'avoir un grand second écran c'est la pagaille et pire, pas toujours la même après fermeture/réouverture du projet.
Bien sûr il est possible de faire des couches ou cacher certains composants, mais ce n'est pas chose réellement aisée et cela n'empêchera pas que des flèches se croisent à moins de dépenser des heures inutiles pour avoir une représentation qui nous plaise. Représentation quasi inutile sauf à vouloir enregistrer une image (oui, c'est possible, c'est une option du menu contextuel du concepteur)

Donc oui, la solution pourrait passer par une création des liens à l'exécution ce qui permettrait d'avoir la main et de commenter le code. Il y a déjà longtemps (2 ans informatiques) j'avais déjà jeté un appel à l'aide pour résoudre le cas "TGrid lié à l'exécution"

Reprenons donc le "cahier des charges" du billet

Nom : Capture.PNG
Affichages : 118
Taille : 23,8 Ko

cette fois-ci pas d'appel au concepteur de lien donc pas de visualisation des données et du code.
* Petite précision le composant TBindingsList est inutile et peut être supprimé de la forme.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
LiaisonsAuRunTime;
ClientDataSet1.Active:=true;
end;

procedure TForm1.LiaisonsAuRuntime;
var ABindGrid : TBindGridLink;
begin
 ABindGrid:=TBindGridLink.Create(self);
 ABindGrid.ControlComponent := Grid1;
 ABindGrid.SourceComponent := BindSourceDB1;

// positions au sein de la grille 
 with ABindGrid.PosControlExpressions.AddExpression do
       begin
          ControlExpression := 'Selected';
          SourceExpression := 'Math_Max(0,DBUtils_ActiveRecord(Self))';
        end;

 with ABindGrid.PosSourceExpressions.AddExpression do
        begin
          ControlExpression := 'Math_Max(1,Selected+1)';
          SourceExpression := 'DBUtils_ValidRecNo(Self)';
        end;

// colonnes 
 with ABindGrid.ColumnExpressions.AddExpression do
        begin
          ColumnName := 'Column1';
          ColumnIndex := 0;
          SourceMemberName := 'SS_NUMBER';
          with FormatCellExpressions.AddExpression do
            begin
              ControlExpression := 'Data';
              SourceExpression := 'DisplayText';  // oui j'ai gardé le DisplayText 
            end;
        end;

 with ABindGrid.ColumnExpressions.AddExpression do
        begin
          ColumnName := 'Column2';
          ColumnIndex := 1;
          SourceMemberName := 'FIRST_NAME';
          With FormatCellExpressions.AddExpression do
            begin
              ControlExpression := 'Data';
              SourceExpression := 'Value+'#39' '#39'+Dataset.LAST_NAME.text';
            end;
        end;

end;
Nom : Capture_1.PNG
Affichages : 114
Taille : 13,4 Ko

Cela écrit, vous vous demanderez certainement comment j'ai pu faire pour "pondre" ce code ! J'avoue que cela n'a pas été sans mal, même si je savais quoi mettre, la seconde colonne m'a posé quelques soucis avec cet espace entre prénom et nom, surtout que seule l'exécution du programme permet de se rendre compte qu'il y a des erreurs dans le code.

Mes secrets de fabrication : avant tout quelques templates que je m'étais concoctés (si vous insistez un peu , je pourrai même les fournir). Ces mêmes templates avait été élaborés à partir de code source de fiches (comme celle de la partie 1) lors de la rédaction de mon tutoriel sur les grilles.

Conclusion partielle, il est possible d'écrire les liens dans le code bien que cela demande pas mal de connaissances sur les mécanismes des LiveBindings.

Donc, maintenant, que nous apporterait l'unité proposée par Malcolm Groves ?

Je l'avoue, j'en espérai beaucoup (rien que cette phrase donne hélas le ton). J'ai donc repris ce même exercice pour comprendre ce qu'il proposait.

Bon, déjà, pour lier une grille il faut faire un tour dans le source du programme exemple accompagnant l'unité. Une fois trouvé le bon bouton et donc la bonne procédure effectivement le code est hyper simple par rapport à ce qu'il m'a fallu ressortir (* vous remarquerez qu'un TBindingsList est nécessaire).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
procedure TForm1.FluentBindings;
begin
BindingsList1.BindGrid(Grid1).ToBindSource(BindSourceDB1);
end;
Simple, oui, mais, cela s'arrête là , pour l'instant je gage, impossible de définir mes colonnes avec des expressions. Nous avons à faire à une simple liaison telle que le concepteur visuel peut nous fournir.
L'écran ci-dessous permet la comparaison
Nom : Capture_4.PNG
Affichages : 183
Taille : 28,2 Ko
Seule l'exécution permet d'avoir un résultat comparatif
Nom : Capture_5.PNG
Affichages : 112
Taille : 17,3 Ko

Que l'on se rassure, d'autres liaisons avec Fluent Livebindings sont plus abouties. Il a fallu que je tombe sur ce qui est le point non encore abouti de cette unité. Il est tous arrivé aux professionnels d'avoir préparé un super programme que le client démonte en un client d'œil avec un cas précis, cette fois-ci j'ai joué le client

Toutefois, l'unité me parait prometteuse, peut-être même irai-je y fourrer mon grain de sel en demande ou même en action.

Ne voulant pas rester sur une impression négative d'utilisation de l'unité Fluent Livebindings, j'ai repris les données dans un applicatif sans grille (toujours avec la même source de données) en utilisant une interface utilisateur différente. Par souci de comparaison je reproduis le même schéma entre conception à l'exécution et design.

Nom : Capture_1.PNG
Affichages : 90
Taille : 26,4 Ko

sans être un "spaghettis boulettes" car déjà un peu arrangé, le concepteur visuel de liens

Nom : Capture.PNG
Affichages : 90
Taille : 19,6 Ko

Mon objectif est donc d'obtenir la même chose avec l'unité Fluent LiveBindings. Pour ce qui est des zones de saisie, c'est extrêmement aisé (pour peu de se souvenir des noms de zones, donc, conseil, bien les nommer est atout certain)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
// Les zones de saisie
BindingsList1.BindComponent(edt_SS_NUMBERF).ToField(BindSourceDB1,'SS_NUMBER'); // liaison avec le numéro de Secu
BindingsList1.BindComponent(EdtFirstNameF).ToField(BindSourceDB1,'FIRST_NAME');     // liaison avec le prénom
BindingsList1.BindComponent(edtLastNameF).ToField(BindSourceDB1,'LAST_NAME');       // liaison avec le nom
A partir de là je me heurte (déjà) à ce qui me semble imprévu pour le nom complet. En suivant les premiers essais de liaison j'ai écrit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
BindingsList1.BindComponent(LabelNomF).ToField(BindSourceDB1,'FIRST_NAME');
pour sécher ensuite : "comment ajouter le contenu de la colonne LAST_NAME comme dans l'expression Value+' '+dataset.LAST_NAME.Text utilisée en conception visuelle ?"
Qu'à cela ne tienne je pourrai toujours passer par du code, donc passons au test .
Citation Envoyé par Erreur
Aucun support d'observateur pour TLabel
Je suis douché, alors que je n'ai pas encore tenté de lien avec la liste me voilà déjà bloqué .

Attaquons, la liste. Premier problème j'ai choisi par habitude un TListView alors que dans la démo du dépôt GitHub il s'agit d'un TListBox. Pas de notion de texte et de détail, pas non plus d'ailleurs de notion de style, il s'agit donc d'une liste simple.

Pour l'instant le round n'est pas à l'avantage de Fluent LiveBindings, j'ai déjà déposé une "Issue" qui s'apparente aussi à une "Pull Request". Du coup, mes templates fait-maison ont certainement de beaux jours devant eux, quoique je m'en sorte très bien avec mes liens rapides ou manuels désormais , force de l'habitude ?

En conclusion, une constatation générale, un point essentiel manque à la création de lien au runtime, quelle que soit la technique, le WYSEEWYG.

Du coup, il me prend à rêver de l'outil idéal, mi-chemin entre le concepteur actuel : si seulement on pouvait tester (et modifier) les expressions des liens rapides aussi bien que les liaisons "manuelles" et un outil qui permettrait de documenter ces liens pour avoir un dossier cohérent.
Cela fera l'objet de mon prochain billet.

Envoyer le billet « Livebindings : Concepteur visuel ou codification ? Partie 2 - Création des liens à l'exécution » dans le blog Viadeo Envoyer le billet « Livebindings : Concepteur visuel ou codification ? Partie 2 - Création des liens à l'exécution » dans le blog Twitter Envoyer le billet « Livebindings : Concepteur visuel ou codification ? Partie 2 - Création des liens à l'exécution » dans le blog Google Envoyer le billet « Livebindings : Concepteur visuel ou codification ? Partie 2 - Création des liens à l'exécution » dans le blog Facebook Envoyer le billet « Livebindings : Concepteur visuel ou codification ? Partie 2 - Création des liens à l'exécution » dans le blog Digg Envoyer le billet « Livebindings : Concepteur visuel ou codification ? Partie 2 - Création des liens à l'exécution » dans le blog Delicious Envoyer le billet « Livebindings : Concepteur visuel ou codification ? Partie 2 - Création des liens à l'exécution » dans le blog MySpace Envoyer le billet « Livebindings : Concepteur visuel ou codification ? Partie 2 - Création des liens à l'exécution » dans le blog Yahoo

Catégories
Delphi

Commentaires