Appel de procédure sur form parente

Résolu
cs_bonanux Messages postés 11 Date d'inscription lundi 21 avril 2003 Statut Membre Dernière intervention 19 février 2012 - 19 janv. 2011 à 14:47
cs_bonanux Messages postés 11 Date d'inscription lundi 21 avril 2003 Statut Membre Dernière intervention 19 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 ?

En vous remerciant.
bonanux

5 réponses

solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
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.

solilog
3
cs_bonanux Messages postés 11 Date d'inscription lundi 21 avril 2003 Statut Membre Dernière intervention 19 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
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
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;




________________________________________________________
besoin de câbles audio, vidèo, informatique pas cher ?
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_bonanux Messages postés 11 Date d'inscription lundi 21 avril 2003 Statut Membre Dernière intervention 19 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 !

bonanux
0
Rejoignez-nous