Difficile à résumer en une phrase :)

Résolu
nicobara Messages postés 11 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 6 octobre 2004 - 6 oct. 2004 à 09:23
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 - 6 oct. 2004 à 18:29
Bonjour à tous.
Voila, j'ai un problème (non sans blague), voila mon code :
procedure TFModifUtil.GestAffNiveauUtil(NiveauUtil : integer);
var i : integer;
begin
//----------------------------------------------------------------------------
// Fais appel aux fontions d'affichage de toutes les fiches de l'application
// Pour gérer les accès des utilisateurs (rendre les bp inactif...)
// efface toutes les lignes de la table TblFenetre
QueryListFiches.SQL.Clear;
QueryListFiches.sql.Add('Select * From TblFenetre');
QueryListFiches.open;
for i:=0 to QueryListFiches.RecordCount -1 do
begin
try
//TForm(application.FindComponent(QueryListFiches['NomFenetre'])).OnCreate(application.FindComponent(QueryListFiches['NomFenetre']));
TForm(application.FindComponent(QueryListFiches['NomFenetre'])).GestAffUtil(GroupUtilCourant);
except
end;
QueryListFiches.Next;
end;
end;

Dans ma base de données TblFenetre, sont listées certaine fenêtre de mon appli. Dans ces fenêtres, j'ai implenté une procedure GestAffUtil(int).
Ce que je veux, c'est :
- parcourir ma table : ca v'y arrive
- Acceder à l'objet Form : ca v'y arrive aussi
//TForm(application.FindComponent(QueryListFiches['NomFenetre'])).OnCreate(application.FindComponent fonctionne tres bien
- Faire appel à la procedure GestAffUtil : c'est là que ca coince.
Le compilateur me dit que l'indentificateur n'est pas déclaré.
Je comprend pourquoi, mais je voudrais savoir comment faire pour que ca passe, changer ma ligne de commande ou forcer le compilateur à l'accepter... la je coince.
Je souhaite pouvoir réutiliser ce code pour mes futures appli, donc la solution de lister les fenêtres une par une ne me convient pas... enfin je prefererai trouver une autre solution.
Merci pour vos réponse.

10 réponses

nicobara Messages postés 11 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 6 octobre 2004
6 oct. 2004 à 17:54
Héhé, j'ai trouvé une solution :

type
TExecute = procedure of object;
TFModifUtil = class(TForm)

procedure TFModifUtil.GestAffNiveauUtil(NiveauUtil : integer);
var i,j : integer;
s : string;
Routine: TMethod;
Execute: TExecute;
begin
QueryListFiches.close;
QueryListFiches.SQL.Clear;
QueryListFiches.sql.Add('Select * From TblFenetre');
QueryListFiches.open;
for i:=0 to QueryListFiches.RecordCount -1 do
begin
Routine.Code := TForm(application.FindComponent(QueryListFiches['NomFenetre'])).MethodAddress('GestAffUtil');
if Routine.Code = nil then
begin
showmessage('failed');
Exit;
end;
Execute := TExecute(Routine);
Execute;
QueryListFiches.Next;
end;
end;

Le problème c'est que dans la méhode 'GesAffUtil', de la fenêtre FGeneral (par ex), je fais :
procedure TFGeneral.GestAffUtil();
begin
//Acces à la fenetre FAccesG1
if FModifUtil.CtrlDroitUtilCourant('FAccesG1')>=1 then
BpAccesG1.Enabled := true;
else
BpAccesG1.Enabled := false;
end;

Et au niveau des textes rouge ca plante :(.
Le projet à provoqué une classe d'exception EAccessViolation...
Donc j'ai compris que ca doit venir du fait que l'objet BpAccesG1 n'ai pas instancié ou qqchose du genre.
Je precise que si aulieu de passer par un pointeur (MethodAddress) j'appele directement la méthode de la fenêtre ben ca fonctionne.

J'abuse bcp de vous mais si vous aviez encore une idée ca m'interesse :).
3
nicobara Messages postés 11 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 6 octobre 2004
6 oct. 2004 à 18:07
Dsl d'avoir poster pour rien, j'ai trouvé mon erreur :

Routine.Data := Pointer(application.FindComponent(QueryListFiches['NomFenetre']));
Routine.Code := TForm(application.FindComponent(QueryListFiches['NomFenetre'])).MethodAddress('GestAffUtil');

Enfin pas pour rien, j'espere que jmp77 aura vue la solution
3
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
6 oct. 2004 à 10:34
Effectivement j'ai eu le même souci. Et je suis passé par la solution de lister les fenêtres malheureusement.
Donc si quelqu'un a la solution je serai bien entendu preneur.

Désolé de pas pouvoir te dépanner.

Bonne prog,
JMP.
0
nicobara Messages postés 11 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 6 octobre 2004
6 oct. 2004 à 11:27
JMP, c'est pas grave, mais j'espere que qq'un d'autre pourras, ca ferrai 2 heureux :)
0

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

Posez votre question
Loulibier Messages postés 309 Date d'inscription jeudi 6 juin 2002 Statut Membre Dernière intervention 24 septembre 2008 2
6 oct. 2004 à 11:53
salut,

si je comprends bien tu as une procedure GetAffUtil ou tu dois lui passer un integer en paramètre. De quel type est GroupUtilCourant ?

Bonne Prog, ;)

Olivier

PS : Lorsqu'une réponse vous convient, n'oubliez pas de la validée.
0
nicobara Messages postés 11 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 6 octobre 2004
6 oct. 2004 à 12:08
GroupUtilCourant est un integer, mais mon pb ne viens pas de là.
Comme TForm(application.FindComponent(QueryListFiches['NomFenetre'])) est une Form "pas connu" pour le compilateur, il ne connais pas non plus GestAffUtil.
Pour essayer d'etre plus clair un exemple :
- Dans la table TblFenetre j'ai un enregistrement avec comme 'NomFenetre' => Fmafenetre
- Dans mon appli j'ai une fenetre qui s'apelle Fmafenetre, ds laquel j'ai rejouté une pocedure GestAffUtil, donc je peux faire Fmafenetre.GestAffUtil

Donc au final TForm(application.FindComponent(QueryListFiches['NomFenetre'])) = Fmafenetre
et je voudrai pouvoir faire TForm(...).GestAffUtil
mais j'y arrive pas :(
0
cs_phoenyx Messages postés 31 Date d'inscription vendredi 11 octobre 2002 Statut Membre Dernière intervention 8 mars 2007
6 oct. 2004 à 12:22
salut,

c'est normal
GestAffUtil n'est pas une procedure de TForm mais de TFModifUtil (qui est un descendant de TForm)
donc ce n'est pas TForm(...).GestAffUtil qu'il faut faire mais TFModifUtil(...).GestAffUtil

>:) PhoenyX >:)
0
Loulibier Messages postés 309 Date d'inscription jeudi 6 juin 2002 Statut Membre Dernière intervention 24 septembre 2008 2
6 oct. 2004 à 12:28
Je viens de comprendre, en fait la compilation de ton programme ne se fait pas car tu essais d'appeler une procedure inexistante dans la Classe TForm. (normal ;) )

Le problème est que Fmafenetre n'est pas une TForm, mais elle dérive de TForm. Il est donc plus judicieux de vérifier si la fenetre que tu cherche est une Tmafenetre.

exemple :
procedure TFModifUtil.GestAffNiveauUtil(NiveauUtil : integer);
var i : integer;
begin
//----------------------------------------------------------------------------
// Fais appel aux fontions d'affichage de toutes les fiches de l'application
// Pour gérer les accès des utilisateurs (rendre les bp inactif...)
// efface toutes les lignes de la table TblFenetre
QueryListFiches.SQL.Clear;
QueryListFiches.sql.Add('Select * From TblFenetre');
QueryListFiches.open;
for i:=0 to QueryListFiches.RecordCount -1 do
begin
try
//TMaFenetre(application.FindComponent(QueryListFiches['NomFenetre'])).OnCreate(application.FindComponent(QueryListFiches['NomFenetre']));
TMaFenetre(application.FindComponent(QueryListFiches['NomFenetre'])).GestAffUtil(GroupUtilCourant);
except
end;
QueryListFiches.Next;
end;
end;


Le seul Hic, c'est que si tu as crées plusieurs form avec la procedure GestAffUtil. Il te faudra tester de quel type est ton composant.

exemple :
if application.FindComponent(QueryListFiches['NomFenetre']) is TMafenetre then
  TMaFenetre(application.FindComponent(QueryListFiches['NomFenetre'])).GestAffUtil(GroupUtilCourant);


Bonne Prog, ;)

Olivier

PS : Lorsqu'une réponse vous convient, n'oubliez pas de la validée.
0
nicobara Messages postés 11 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 6 octobre 2004
6 oct. 2004 à 13:42
merci bien Loulibier et phoenyx
Donc si je comprend bien, comme j'ai plusieurs fenêtres j'ai deux solutions.
1- Je créer une dérivée de TForm en y ajoutant une méthode GestAffUtil (que je pourrais modifier en fonction de la form) et je déclare mes fenêtre comme faisant partie de la classe dérivée
2- Soit quand je parcoure ma table, je regarde si le composant correspondant est de type Tmafenetre 1 ou Tmafenetre2... dans ce cas là autant lister mes fenêtres.

Je débute en delphi (2semaines), la dérivation de classe ce fait "facilement"?

En tout cas merci bcp pour vos réponses aussi rapides
0
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
6 oct. 2004 à 18:29
Merci nicobara c'est impec.

Bonne continuation et ç charge de revanche.

++,
JMP.
0
Rejoignez-nous