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

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

Votre réponse

5 réponses

Meilleure réponse
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Dernière intervention
18 avril 2015
- 22 janv. 2011 à 17:05
3
Merci
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

Merci solilog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de solilog
Messages postés
11
Date d'inscription
lundi 21 avril 2003
Dernière intervention
19 février 2012
- 29 janv. 2011 à 11:36
0
Merci
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
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
- 30 janv. 2011 à 02:42
0
Merci
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
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Dernière intervention
18 avril 2015
- 30 janv. 2011 à 09:58
0
Merci
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
Messages postés
11
Date d'inscription
lundi 21 avril 2003
Dernière intervention
19 février 2012
- 30 janv. 2011 à 12:59
0
Merci
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.