[!] Suite d'Objet dynamique dans objet dynamique

Résolu
Signaler
Messages postés
73
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
24 juillet 2005
-
Messages postés
73
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
24 juillet 2005
-
Re bonjour, J'ai une autre question ... tjs ds le même sujet (suite de celui-ci )


Maintenant je désire mettre mon TTabSheet et Mon TLabel dans une unit
apart de manière à la compiler plus tard en dll. Mais pour éviter du
taper tout le code qui précise la position, la hauteur ... , je pensais
mettre toutes des donnée dans un fichier dfm que l'unité chargerais.

J'avoue que je suis perdu et que je ne sais pas comment prendre le problème (si ce n'est par les "cornes", mais où sont-elles )



Amicalement

Alexis

11 réponses

Messages postés
73
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
24 juillet 2005

Nickel, ca marche ...

Je m'explike ...

D'abord créer une TFrame (cadre) avec tt les objet, fonctions, et
procedure comme on le souhaite ensuite, enregistrer le tout sous un nom
correct (ex : maframe.pas et .dfm).



J'ai rajouter un "constrcutor" car dans mon application j'oblige
ma TIDFrame à être créee dans un TTabSheet, donc je rajoute ceci :



...

public

constructor CreateTab(PC : TPageControl);

...

const TabPos = 1;



implementation



constructor TIDFrame.CreateTab(PC : TPageControl);

begin

with TTabSheet.Create(PC) do begin

PageControl: =PC; // !!! j'utilise la variable PC dans les

PageIndex:= TabPos; // paramètres. Je n'utilise pas PageControl

Name:='IdTab'; // car il y a violation d'acces !!!

Caption:='ID Tag';

with TIDFrame.Create(PC.Pages[TabPos]) do

Parent: =PC.Pages[TabPos];

end;

end;

...



Après celà, je crée une nouvelle application dans
laquelle j'inclu l'unité contenant ma Frame. Je crée un TButton,
TPageControl et un TTabSheet (sinon erreur car ma TIDFrame a un
PageIndex = 1). Dans l'événement OnClick du bouton je met :



procedure TForm1.Button1Click(Sender: TObject);

begin

TIDFrame.createtab(PageControl1);

end;



Et c'est tout !



Alexis


PS : comment faire des cadres de fond gris pour les codes ?
Messages postés
55
Date d'inscription
mardi 26 août 2003
Statut
Membre
Dernière intervention
22 janvier 2006

hello,



ce que tu pourrais faire de cool, ça serait de stocker comme tu le
proposes tes données pour la position de tes objets dans un fichier XML
(c'est plus facile de gérer toi même un fichier XML plutot qu'un
ficheir .dfm).

ou encore un fichier .ini c'est good aussi.



bonne chance pour ton applic

Yves
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006

Je pencherais plutot pour l'utilisation de WriteComponentResFile et ReadComponentResFile avec le dfm.

j!nH
Messages postés
73
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
24 juillet 2005

Merci pour vos solutions ....

juste 2 petites remarques ...

1) le WriteComponentResFile et ReadComponentResFile sont bien pour des composants or TTabSheet est une classe.

2) Je ne sais pas cmt m'y prendre avec le xml ... ca marche cmt ?



Alexis
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006

le WriteComponentResFile et ReadComponentResFile sont bien pour des composants or TTabSheet est une classe.



TTabSheet descend bien logiquement de TComponent, c'est un
composant graphique.Bien sur que TTabSheet est une classe,vu qu' un
objet est une instance d'une Classe.



Tout ça pour dire que tu peux bien utiliser WriteComponentResFile et
ReadComponentResFile,qui peuvent directement travailler avec le
dfm(même format).






j!nH
Messages postés
73
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
24 juillet 2005

Ok merci, je viens juste de tester (car j'ai eu une journée chargée ...)

Ok ca marche mais ca n'enregistre que les propriétés du TTabSheet et pas des ss-objet :s



Est-ce normal ...



Mnt j'ai découvert la procedure Read/WriteComponent(Res) d'un TFileStream.

Mais j'ai une erreur lors de WriteComponentRes.

mon code : (les lignes qui foirent commencent par )



var t : TFileStream;

begin

t.Create('c:\resfile.crf',fmcreate or fmopenwrite);

t.Size:=SizeOf(ts1); // ts1 = TabSheet1

t.WriteComponent(ts1);

// OU

//t.WriteComponentRes('tab',ts1);

t.Free;

end;



Alexis
Messages postés
73
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
24 juillet 2005

Je ne sais pas pourquoi main mnt ca marche ...

bref, je ne suis tjs pas plus avancé car je ne sais pas lire mes objets.

qqn pourrai me fournir un exemple (avec Stream si possible car je doit écrire 12 objects) .



Alexis
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006

Salut,




t.Size:=SizeOf(ts1);



Cette ligne risque de poser problème. En effet SizeOf(ts1) renverra toujours 4.



Si tu veux vraiment fixer la taille(inutile, je pense que c'est fait
directement par WriteComponent et ReadComponent), utilises
ts1.InstanceSize.



Pour le reste, je vais essayer de faire un petit exemple...

j!nH
Messages postés
73
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
24 juillet 2005

Voilà mon code pour l'écriture :



var t : TFileStream;

begin

t:=TFileStream.Create('cr.crf',fmcreate);

t.Size:=ts1.InstanceSize;

t.WriteComponentRes('tab0',ts1);

t.WriteComponentRes('tab1',idLabel4);

t.WriteComponentRes('tab2',idf);

t.Free;

end;



Maintenant c'est la lecture
qui pose problème, car ReadComponentRes demande un paramètre de type
TComponent et c'est tout ! mais cmt il sais que c'est ce composant la
qui doit lire ?



Alexis
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006

Il le sait pa rapport à la position dans le stream.



Lis les dans l'ordre où tu les as écrit en transtypant par rapport au composant que tu veux lire (TTabSheet, Tlabel).

j!nH
Messages postés
73
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
24 juillet 2005

Je pense que j'ai trouvé ma solution ...



TFrame que je crée dans un TTabSheet.



Je teste et je donne des nouvelles



Alexis