cs_bonanux
Messages postés11Date d'inscriptionlundi 21 avril 2003StatutMembreDernière intervention19 février 2012
-
19 janv. 2011 à 14:47
cs_bonanux
Messages postés11Date d'inscriptionlundi 21 avril 2003StatutMembreDernière intervention19 février 2012
-
30 janv. 2011 à 12:59
Bonjour,
J'aurais une question et potentiellement un problème sur lequel je suis sec ...
J'ai fait un petit formulaire de saisie d'info de coordonnées dans une TForm (TFormInputIndivAdress).
J'ai une autre TForm (TFormShowPanelInfo) qui crée un certain nombre d'occurrences de TFormInputIndivAdress
procedure TFormShowPanelInfo.CreateAdressBox(Adresse:TAdresse);
var
FormInputIndivAdress:TFormInputIndivAdress;
begin
FormInputIndivAdress:=TFormInputIndivAdress.create(bsSkinScrollBoxAdress);
FormInputIndivAdress.Parent:=bsSkinScrollBoxAdress;
FormInputIndivAdress.Name:='InputIndivAdress'+Adresse.ID;
FormInputIndivAdress.BorderStyle:=bsNone;
FormInputIndivAdress.Align:=alTop;
//Renseignement de la form
FormInputIndivAdress.SetIndivAdress(Adresse);
FormInputIndivAdress.ShowIndivAdress(False,False);
FormInputIndivAdress.Show;
end;
Jusque là tout marche parfaitement. Une question tout de même, est ce dans les "bonnes pratiques" de faire ce genre de création de TForm fille d'un composant appartenant à une autre TForm ? Serait-il plus judicieux de travailler tout en dynamique ou bien d'utiliser une TFrame ?
Tout mon design fonctionne bien jusqu'au moment ou j'ai besoin qu'une de mes occurrences de TForm fille (TFormInputIndivAdress) appele une procédure appartenant à la TForm parente "TFormShowPanelInfo" pour exécuter du code sur l'ensemble des TForm filles.
Pour illustrer, je souhaite avoir une notion "d'épinglage" (Spin) unique de mes TForm filles, il faut donc que je retire l'activation de l'épinglage de toutes mes TFormInputIndivAdress avant d'en fixer une.
J'ai donc fait ce bout de code :
procedure TFormShowPanelInfo.DisableAllSpin();
var
FormInputIndivAdress:TFormInputIndivAdress;
i:Integer;
begin
for i:=0 to bsSkinScrollBoxAdress.ComponentCount-1 do
if bsSkinScrollBoxAdress.Components[i] is TFormInputIndivAdress then
TFormInputIndivAdress(bsSkinScrollBoxAdress.Components[i]).DisableSpin;
end;
J'ai bien évidement une erreur lors de l'exécution de la procédure lorsque c'est une de mes TForm fille qui l'appel et je conçoit que ca soit tout à fait normal (Le projet xxx.exe a déclenché la classe d'exception EAccessViolation avec le message 'Violation d'accès à l'adresse 00804D49 dans le module 'xxx.exe'. Lecture de l'adresse 000003A0'.)
J'imagine que je dois indiquer des directives particulières concernant ces TForm filles ...
quelqu'un saurait'il comment faire pour que cet appel fonctionne ou bien c'est fondamentalement impossible ?
solilog
Messages postés273Date d'inscriptionsamedi 13 juin 2009StatutMembreDernière intervention18 avril 201510 22 janv. 2011 à 17:05
Bonjour,
1- est-il judicieux de créer des forms à la volée ? oui mais pas comme ça!
FormFille := TFormFille.create(FormMere);
va mettre FormFille.parent = FormMere. Un FormMere.Free va tuer les FormFille existantes.
2 - appeler une proc d'une autre form (mere ou pas).
tu mets un uses uFormMere; en debut de la partie IMPLEMENTATION de uFormFille.
C'est tout.
cs_bonanux
Messages postés11Date d'inscriptionlundi 21 avril 2003StatutMembreDernière intervention19 février 2012 29 janv. 2011 à 11:36
Bonjour,
Merci pour ces infos rassurantes.
Je pensais de le créateur d'une TForm pouvait être autre qu'une TForm...
Ceci étant dit, mon erreur subsiste mais elle ne se trouve pas ici. J'ai refait mon code à part et il fonctionne bien semble t'il..
Je vais revoir un peu tout ca de fond en combles ;-)
bonanux
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 30 janv. 2011 à 02:42
Moi ce qui me chiffone c'est d'avoir besoin d'autant de fiches alors qu'en général, on évite d'en avoir "trop" surtout des fenêtres de saisie.
Ne serait il pas plus judicieux d'utiliser un tableau pour stocker les données (adresses ?) et d'utiliser une et une seule fiche de saisie (FrmInputAdress) qui possèderait une procedure "Execute" (pour coller a l'utilisation des Dialogs) le tout en showModal :
TFrmInputAdress=class(TForm)
EditAdress: TEdit;
ButtonOk: TButton; // ModalResult = mrOk
ButtonAbort: TButton; // ModalResult = mrAbort/mrCancel
private
public
function Execute(const aAdress: string=''):boolean;
end;
implementation
function TFrmInputAdress.Execute(const aAdress:string):boolean;
begin
BringToFront;
EditAdress.Text := aAdress;
result :ShowModal mrOk;
end;
Utilisation :
procedure TFrmMain.AddAdress(Sender: TOjbect);
begin
if FrmInputAdress.Execute then
ListBox1.add(FrmInputAdress.EditAdress.Text);
end;
procedure TFrmMain.EditAdress(Sender: TObject);
var I: integer;
begin
I := ListBox1.ItemIndex;
if FrmInputAdress.Execute(ListBox1.Items[I]) then
ListBox1.Items[I] := FrmInputAdress.EditAdress.Text;
end;
solilog
Messages postés273Date d'inscriptionsamedi 13 juin 2009StatutMembreDernière intervention18 avril 201510 30 janv. 2011 à 09:58
Bonjour tous,
Oui, sans doute, pourquoi de nombreuses forms ?
Mais le prob n'etait pas là, j'ai répondu à la question: comment utiliser une proc d'une mère dans une fille ... Ce qui est indispensable à savoir.
Sur ta remarque F0xi, oui bien sûr.
Salut ...
solilog
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_bonanux
Messages postés11Date d'inscriptionlundi 21 avril 2003StatutMembreDernière intervention19 février 2012 30 janv. 2011 à 12:59
Bonjour,
Je suis fondamentalement d'accord avec vous, mais ca ne peut être vrai que dans le monde idéal des "Bisounours" !!! ;-)
Quand chacun des champs doit avoir des règles métier différentes avec éventuellement des informations calculées ou issue de sélection db (ex CDP<=>ville), ou encore avec des syntaxes particulières comme les codes INSEE et autres joyeusetés, c'est un peu difficile de procéder ainsi, surtout quand on nous demande d'avoir un look & feel extrêmement dynamique et bien trop animé pour respecter les standards ;-)
A noter que ma problématique n'était pas tant l'utilisation d'une proc d'une mère dans une fille mais plutôt l'utilisation d'une proc d'une mère (utilisant des proc filles) depuis l'une fille ... ce qui revient sans doute au même. L'erreur que j'avais me portait à croire que la portée de le permutait pas sans instruction particulière, ce qui n'est apparemment pas le cas. Je soupçonne le composant de skin de ma forme d'être à l'origine de mon pb, il me faut un peut de temps pour confirmer ca !