Appel de procédure sur form parente [Résolu]

cs_bonanux 11 Messages postés lundi 21 avril 2003Date d'inscription 19 février 2012 Dernière intervention - 19 janv. 2011 à 14:47 - Dernière réponse : cs_bonanux 11 Messages postés lundi 21 avril 2003Date d'inscription 19 février 2012 Dernière intervention
- 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
Afficher la suite 

5 réponses

Répondre au sujet
solilog 273 Messages postés samedi 13 juin 2009Date d'inscription 18 avril 2015 Dernière intervention - 22 janv. 2011 à 17:05
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de solilog
cs_bonanux 11 Messages postés lundi 21 avril 2003Date d'inscription 19 février 2012 Dernière intervention - 29 janv. 2011 à 11:36
0
Utile
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
Commenter la réponse de cs_bonanux
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 30 janv. 2011 à 02:42
0
Utile
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 ?
Commenter la réponse de f0xi
solilog 273 Messages postés samedi 13 juin 2009Date d'inscription 18 avril 2015 Dernière intervention - 30 janv. 2011 à 09:58
0
Utile
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
Commenter la réponse de solilog
cs_bonanux 11 Messages postés lundi 21 avril 2003Date d'inscription 19 février 2012 Dernière intervention - 30 janv. 2011 à 12:59
0
Utile
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
Commenter la réponse de cs_bonanux

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.