Ouvrir une fiche de façon dynamique

Signaler
-
cs_walidlam
Messages postés
111
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
-
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

19 réponses

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

essaie comme ça :

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



cantador

bonjour,

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


cantador

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;
Messages postés
111
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
1
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);
.
.



@+

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'
Messages postés
111
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
1
salut!!!
normalement Nclass=>form1=tform1..frm=tfrm
remplacez
NomClass:= QueryFiche.FieldByName('Class').AsString;
par:
NomClass:='T'+QueryFiche.FieldByName('NomFiche').AsString ;

@+

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
Messages postés
111
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
1
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!!!
@+
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
11
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
Messages postés
111
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
1
salut!!!
@cantador
bien fait avec cette démonstration
une petite correction dans la code si vous me permettez:
MyClass := TFormClass(FindClass('T'+FormName));


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

cantador
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
11
et le code fonctionne bien...

cantador

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
Messages postés
111
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
1
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
@+
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
11
@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

@ 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
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
11
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
Messages postés
111
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
1
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
@+