Ouvrir une fiche de façon dynamique

- - Dernière réponse : cs_walidlam
Messages postés
111
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
- 27 mars 2013 à 12:48
Bonjour,

en faite j'ai une liste des fiches ainsi que une liste des classes 'Class' , les fiches sont des fiches disponibles et non pas des fiches auto-crées, je veux ouvrir de façon dynamique la liste des fiches sachant que le nom de la fiche ainsi que le nom de la class je les récupères à partir d'une table BD , voila mon code :

NomFiche := QueryFiche.FieldByName('NomFiche').AsString ;
NomClass := QueryFiche.FieldByName('Class').AsString ;
Fiche := TForm(Application.FindComponent(NomFiche));
NClass := TFormClass(Application.FindComponent(NomClass));
if Fiche = Nil then
Application.CreateForm(NClass, Fiche);
Fiche.ShowModal ;

Mais ça marche pas :/ SVP veuillez m'aider . Merciii d'avance
Afficher la suite 

19 réponses

Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
bonsoir,

essaie comme ça :

  if not Assigned(NomFiche) then
    Application.CreateForm(NClass, NomFiche);
  NomFiche.ShowModal;



cantador
Commenter la réponse de cs_cantador
0
Merci
bonjour,

non ça marche pas :/ toujours il y a une erreur de violation d'accès !!
Commenter la réponse de nadiasghaier
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
mets le code complet


cantador
Commenter la réponse de cs_cantador
0
Merci
voila mon code :

procedure TFMain.Ouvrir(Sender: TObject);
var       NomMenu               : String ;
          NomClass              : String ;
begin
NomMenu   :=TMenuItem(Sender).Caption;
QueryFiche.Close;
QueryFiche.SQL.Clear;
QueryFiche.SQL.Text :='Select Fiche.NomFiche, Fiche.Class From Menu, Fiche where Menu.CodeFiche=Fiche.CodeFiche and Menu.NomMenu='+QuotedStr(NomMenu);
QueryFiche.Open;
NomFiche                       := QueryFiche.FieldByName('NomFiche').AsString ;
NomClass                       := QueryFiche.FieldByName('Class').AsString ;
Fiche                          := TForm(Application.FindComponent(NomFiche));
NClass                         := TFormClass(Application.FindComponent(NomClass));
if  Fiche  = Nil then
Application.CreateForm(NClass, Fiche);
Fiche.ShowModal ;
end;
Commenter la réponse de nadiasghaier
Messages postés
111
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
1
0
Merci
salut!!!
essayer ça

declarez les unites :
implementation
uses unitx,...
var
 NClass  :Tformclass;
 NomClass:string;
begin
  try
    NomClass:= QueryFiche.FieldByName('Class').AsString;
    NClass := tformclass(findClass(NomClass));
      with NClass.create(self) do
      showModal;
  except
    raise;
  end;


mais il faut tu mais tous les fiches que vous désirez l’appelé en évènement formcreate ou formshow
//exemple form1,form2..
RegisterClass(tform1);
RegisterClass(tform2);
.
.



@+
Commenter la réponse de cs_walidlam
0
Merci
en faite l'exécution se plante au niveau de ce ligne :
with NClass.create(self) do
      showModal;


avec un message d'erreur : Une exception dans la classe EReadError avec le message 'Valeur de propriété incorrecte'
Commenter la réponse de nadiasghaier
Messages postés
111
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
1
0
Merci
salut!!!
normalement Nclass=>form1=tform1..frm=tfrm
remplacez
NomClass:= QueryFiche.FieldByName('Class').AsString;
par:
NomClass:='T'+QueryFiche.FieldByName('NomFiche').AsString ;

@+
Commenter la réponse de cs_walidlam
0
Merci
OUI déjà fait dés le début , je vais vous donner un exemple :
NomFiche : FTextesLois
NomClass : TFTextesLois

mais toujours il y a une erreur
Commenter la réponse de nadiasghaier
Messages postés
111
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
1
0
Merci
salut!!!
alors pas de message d'erreur de violation d'accès???
EreadError est declanché si un composant lit incorrectement la ressource fiche ou parce que la ressource est corrompue.

je crois que le problème dans les propriétés des composants dans les fiches
essayer avec une autre fcihe!!!
@+
Commenter la réponse de cs_walidlam
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMainForm = class(TForm)
    ListBox1: TListBox;
    MyCreateButtonForm: TButton;
    procedure FormCreate(Sender: TObject);
    procedure MyCreateButtonFormClick(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;


var
  MainForm: TMainForm;


implementation

uses Unit2, Unit3,Unit4; {seule MainForm est créée à l'ouverture, les autres ne doivent pas être créées automatiquement}

{$R *.dfm}

procedure MyCreateForm(const FormName: string);
var
  MyClass: TFormClass;
  MyForm: TForm;
begin
  MyClass := TFormClass(FindClass(FormName)); {FindClass pour retrouver une classe d'objet}
  MyForm := MyClass.Create(Application);
  MyForm.Show;   { ou ShowModal si on veut que le forme soit obligatoire
comme une boite de dialogue..)
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  RegisterClass(TForm1); {permet de rencenser la classe}
  RegisterClass(TForm2);
  RegisterClass(TForm3);
end;

procedure TMainForm.MyCreateButtonFormClick(Sender: TObject);
var
  MyStr: string;
begin
  MyStr := ListBox1.Items[ListBox1.ItemIndex];
  MyCreateForm(MyStr);     {créé dynamiquement la forme dont le nom est sélectionné dans la ListBox}
end;

// avec items dans ListBox : TForm1, TForm2 et TForm3
end.


cantador
Commenter la réponse de cs_cantador
Messages postés
111
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
1
0
Merci
salut!!!
@cantador
bien fait avec cette démonstration
une petite correction dans la code si vous me permettez:
MyClass := TFormClass(FindClass('T'+FormName));


@+
Commenter la réponse de cs_walidlam
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
non
pas vraiment nécessaire puisque je stocke la Classe...

cantador
Commenter la réponse de cs_cantador
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
et le code fonctionne bien...

cantador
Commenter la réponse de cs_cantador
0
Merci
Toujours il y a des erreurs, le code se plante au niveau :
MyForm := MyClass.Create(Application);

avec ces deux messages :
1- le projet à provoqué une exception dans la classe EReadError avec le message 'Valeur de propriété incorrecte'
2- le projet à provoqué une exception dans la classe EReadError avec le message 'Erreur de lecture de FTextesLois.OnActivate'



Sachant qu'avec une nouvelle fiche vide ça fonctionne normalement
Commenter la réponse de nadiasghaier
Messages postés
111
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
1
0
Merci
salut!!!
@cantador
ah oui j'ai pas vu
avec items dans ListBox : TForm1, TForm2 et TForm3

je m’excuse mais quand j'ai vu
{créé dynamiquement la forme dont le nom est sélectionné dans la ListBox}

j'ai crus que l'appelle du procédure avec la valeur du nom de la fiche
@nadiasghaier
peut etre l'erreur est déclenchée si une (ou plusieurs) propriété ne peut pas être lue correctement lors de la création d'une fiche
couper le code dans FTextesLois.OnActivate et copier le dans FTextesLois.OnShow
@+
Commenter la réponse de cs_walidlam
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
@nadiasghaier:

Il suffit de mettre quelques points d'arrêt et
de tester les variables..

On ne peut pas régler ce souci en lisant quelques bribes de codes éparpillés..

je ne répond plus puisque tu ne mets
toujours pas le code complet..

cantador
Commenter la réponse de cs_cantador
0
Merci
@ cantador
En faite, j'ai fait le même code que le tien :

procedure TFMain.MyCreateForm(const FormName: string);
var
  MyClass: TFormClass;
  MyForm: TForm;
begin
  MyClass := TFormClass(FindClass(FormName)); {FindClass pour retrouver une classe d'objet}
  MyForm := MyClass.Create(Application);
  MyForm.Show;
end;


procedure TFMain.Button16Click(Sender: TObject);
Var       NomClass : String ;
begin
NomMenu   :=TMenuItem(Sender).Caption;
QueryFiche.Close;
QueryFiche.SQL.Clear;
QueryFiche.SQL.Text :='Select Fiche.NomFiche, Fiche.Class From Menu, Fiche where Menu.CodeFiche=Fiche.CodeFiche and Menu.NomMenu='+QuotedStr(NomMenu);
QueryFiche.Open;
NomClass                       := QueryFiche.FieldByName('Class').AsString ;
MyCreateForm(NomClass);
end;


Sachant que NomClass retourne : T+'nom du form'
Mais toujours il y a des erreurs
Commenter la réponse de nadiasghaier
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
ce n'est pas tout à fait le même code...

vérifies si tes noms de classe des formes correspondent à ceux transmis par NomClass

attention, un exemple :

la forme n°1 son name doit être form1 et non TForm1
et le nom de sa classe est Tform1 du type TForm

donc, NomClass doit te renvoyer TForm1, Tform2, Tform3 etc.

cantador
Commenter la réponse de cs_cantador
Messages postés
111
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
1
0
Merci
salut!!!
peut être vous n'avez pas enregistré les classes ...
essayer de recenser tout les classes qui se trouve dans queryfiche
Initialization
RegisterClass(TFTextesLois)
   .
   .
   .
RegisterClass(t..);

finalization
UnRegisterClass(TFTextesLois);
   .
   .
   .
UNRegisterClass(T...);
end.


je crois que ce n'ai pas un probleme de creation de fiche mais probleme de lecture des proprietes...
verifier tous les fiches et les composants et recompiler le projet
@+
Commenter la réponse de cs_walidlam