Exemple d'editeur de fenêtre (contenant des composants) : insertion de composant puisé dans une palette, édition de leur pr

Soyez le premier à donner votre avis sur cette source.

Vue 5 923 fois - Téléchargée 1 155 fois

Description

ATTENTION : le code présenté ne pourra pas être utilisé tel quel, car je l'ai développé pour l'utiliser avec des composants que je ne souhaite pas publier pour l'instant.
Pour pouvoir l'utiliser, il faudra supprimer les références aux unités non publiées, et remplacer les types TCHAMPS et autres par vos Composants.
L'exécutable est joint au ZIP, pour vous permettre de tester le fonctionnement.
Pour accélerer mes tests, une fenêtre est ouverte avant la fenêtre principale de l'application.
Cette fenêtre correspont à la fenêtre obtenue par l'entrée de menu "Les Fichiers Naturels/Saisie", ainsi court-circuitée.
Dans cette fenêtre, le bouton "Editer la Fiche", ouvre la fenêtre qui nous interresse : "Conception", issue des UConception.PAS/DFM. Elle est une instance descendante de TEZFiche, descendant elle-même de TFORM.
Pour vos developpements personnels, elle peut être une TForm toute simple.
Grace à la présence d'un TToolBar, l'utilisateur peut sélectionner un composant.
Les Evènements OnClick, OnMouseDown, OnMouseMove, OnMouseUp, permettent l'insertion d'un composant du type sélectionné, le déplacement et le dimensionnement des composants existants.
2 composants particuliers posent problème. Ce sont tout deux des composants conteneurs, TChampTableau (composant perso) et TPageControl (ou plus exactement TPageControlEx = TPageControl + 3 propriétes "publiquées", défini dans UConception.Pas)
La contenance m'a posé de nombreux pb que j'ai du mal à résoudre.
Par exemple, pour une raison inconnue, Un TPageControl ne repond pas aux évènements OnMouse...
Donc impossible d'y déposer un composant (contrairement au TChampTableau !)

Conclusion :


La liste des Beug est trop longue !!!
PS : L'executable du ZIP étant supprimé par CodeSource, voici un lien :
www.assemple.fr/EasyBase.exe (Corrigé le 15 janvier 2005)
Garanti par moi même et sur l'honneur sans virus (à ma connaissance) sans spyware, sans procédure mal intentionnée.
Diégo DELPY - SARL Assemple Informatique - RCS de Carpentras

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
72
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
16 décembre 2011

Grace à cet exemple, j'ai découvert la fonction IsPublishedProp, qui va me permettre d'appeler Set/GetPropertyValue (et aussi, je suppose, Set/GetObjectProperty) sans que ça plante si la propriété est inexistante.
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012

C'est des procédures que l'on employe très souvent et largement lorsque l'on réalise des experts sous Delphi.

Mais cela permet également d'autres subtilités.

Voici, un programme fait en 2 coups de cuillères à pot pour manipuler un type énuméré à partir de chaines de caractères :

unit Unit2;

interface

uses
Classes ;

type
TypeAConvertir =
( mtInconnu
, mtType1
, mtType2
) ;

TTypeAConvertir = class( TPersistent )
private
FType : TypeAConvertir ;
public
function EnChaine : string;
procedure DeChaine ( s : string );
published
property ProprieteType : TypeAConvertir read FType Write FType ;
end ;

implementation

uses
Dialogs, TypInfo;


function TTypeAConvertir.EnChaine : string;
begin
// Récupération de la valeur du type sous forme de chaine.
if IsPublishedProp(self,'ProprieteType') then
begin
Result := GetPropValue( self,'ProprieteType',true);
end ;
end ;

procedure TTypeAConvertir.DeChaine ( s : string );
begin
// Forçage de la valeur du type à partir d'une chaine.
if IsPublishedProp(self,'ProprieteType') then
begin
SetPropValue( self,'ProprieteType',s );
end ;
end ;


var
T : TTypeAConvertir ;

initialization
T := TTypeAConvertir . Create ;
T.ProprieteType := mtType1 ; // Emploi classique
ShowMessage( T.EnChaine );
T.DeChaine( 'mtType2' );
ShowMessage( T.EnChaine );
T.DeChaine( 'mtInconnu' );
ShowMessage( T.EnChaine );

T.Free ;
end.


Cordialement.
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012

Faut pas le prendre mal, mais même si c'est un premier jet, cela ne devrait pas empecher une certaine rigueur. Privilégier la rapidité de développement et non la qualité se paye à un moment ou un autre (choix erronés de solutions, maintenance ardue, évolution impossible sans modification à coups de serpe, etc...) Même le processus le plus rapide de développement, l'XP(eXtreme Programming) impose des principes à respecter, et surtout de la rigueur.

Je suis tétu, ( soit! :-) en conséquence, j'insiste. Quel est l'intérêt de proposer un programme prospectif ? Déjà une seconde version et ce en moins de 4 jours ! Désolé mais pour ma part, je m'intéresse aux programmes finis qui pourront m'apporter quelquechose, et non aux essais de programmation, qui un jour iront vers une voie et plus tard vers la voie opposée, car la prospection ne sera pas partie du bon côté par manque d'analyse préalable. Qui voudrait d'ailleurs faire se reposer un programme sur une [Easy]Base aussi chancelante ?

En conclusion, un petit programme fini, bien structuré proposant peu de fonctionnalités sera toujours plus intéréssant et instructif qu'un gros programme non complet (dont une partie des sources est manquante) proposant une multitude de fonctionnalités non exploitables une fois celle-ci sorties de leur contexte.

Cordialement.
Messages postés
72
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
16 décembre 2011

Easybase est un peu brouillon car c'est un premier jet, prospectif. Si la disposition des "IF" semble illogique, inélégante, c'est qu'ils se sont ajoutés par couche, lorqu'il m'a fallut rajouter des attributions de gestionnaire d'évènement.
Mais quoi ?!
Personne ne trouve de choses intéressantes ?
Comme l'utilisation Set/GetObjectProperty, Set/GetPropertyValue,
Read/WriteComponentResFile ... ?
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012

La curiosité étant plus forte, j'ai quand même regardé le source et là je suis entièrement d'accord, cette publication n'est "Pas destinée à être utilisée telle quelle", pire je dirais même qu'elle n'est pas exploitable du tout, même pour une application similaire... Vu tout le code manquant, il sera plus facile et certainement plus rapide de repartir sur une base vide plutôt que d'essayer de recoller les bouts manquants.
Enfin, cela n'engage bien sur que mon modeste jugement.

Mais arrétons de tirer sur l'ambulance, quelques remarques constructives concernant le codage pur :

Faché avec les "if then else" ?
Ex 1 :
If Valeur = StrOUI then Valeur := 'True' ;
If Valeur = StrNON then Valeur := 'False' ;
If Valeur = StrNeutre then Valeur := 'False' ;

Ex 2 :
If C is TLabel then TLabel(C).OnClick := ControlClick ;
If C is TLabel then TLabel(C).OnDblClick := ControlDblClick ;
If C is TCurvedSpeedButton then TCurvedSpeedButton(C).OnClick := ControlClick ;
If C is TCurvedSpeedButton then TCurvedSpeedButton(C).OnDblClick := ControlDblClick ;

Ne serait-il pas plus judicieux d'écrire :
Ex 1 :
If ( Valeur = StrOUI ) then Valeur := 'True'
else if ( Valeur StrNON ) or ( Valeur StrNeutre ) then Valeur := 'False' ;

Ex 2 :
If ( C is TLabel ) then
begin
TLabel(C).OnClick := ControlClick ;
TLabel(C).OnDblClick := ControlDblClick ;
end ;
If ( C is TCurvedSpeedButton ) then
begin
TCurvedSpeedButton(C).OnClick := ControlClick ;
TCurvedSpeedButton(C).OnDblClick := ControlDblClick ;
end ;

Je sais c'est PRESQUE la même chose, mais d'une part on économise des tests et d'autre part on gagne en clarté, facilitant au passage les modifications futures.

Moi la maintenance de code identique dans plusieurs modules, j'aime pas ça. Cela n'est pas nécessaire, et les risques d'erreurs lors de modifications sont multipliés.

Il serait donc, par exemple, beaucoup plus logique de créer une fiche "TFichePropChamp" dérivant de TEzFiche contenant le code identique des fiches TPropChampCompte, TPropChampCouleur, TPropChampEntier, TPropChampNumero,... qui deviendraient alors des fiches enfants de "TFichePropChamp". Idem pour la fiche TPropChampString avec un override en prime.

Cordialement.

P.S. Une mention spéciale pour ce superbe anglicisme "bouged"
Afficher les 19 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.