Ouvrir une fiche de façon dynamique

nadiasghaier - 21 mars 2013 à 09:58
cs_walidlam Messages postés 107 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

19 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
21 mars 2013 à 19:29
bonsoir,

essaie comme ça :

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



cantador
0
nadiasghaier
22 mars 2013 à 08:36
bonjour,

non ça marche pas :/ toujours il y a une erreur de violation d'accès !!
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
22 mars 2013 à 23:35
mets le code complet


cantador
0
nadiasghaier
23 mars 2013 à 11:10
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;
0

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

Posez votre question
cs_walidlam Messages postés 107 Date d'inscription lundi 30 mai 2011 Statut Membre Dernière intervention 29 avril 2013 1
23 mars 2013 à 18:58
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);
.
.



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

@+
0
nadiasghaier
24 mars 2013 à 12:37
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
0
cs_walidlam Messages postés 107 Date d'inscription lundi 30 mai 2011 Statut Membre Dernière intervention 29 avril 2013 1
24 mars 2013 à 18:17
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!!!
@+
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
25 mars 2013 à 17:17
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
0
cs_walidlam Messages postés 107 Date d'inscription lundi 30 mai 2011 Statut Membre Dernière intervention 29 avril 2013 1
25 mars 2013 à 18:32
salut!!!
@cantador
bien fait avec cette démonstration
une petite correction dans la code si vous me permettez:
MyClass := TFormClass(FindClass('T'+FormName));


@+
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
25 mars 2013 à 23:22
non
pas vraiment nécessaire puisque je stocke la Classe...

cantador
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
25 mars 2013 à 23:28
et le code fonctionne bien...

cantador
0
nadiasghaier
26 mars 2013 à 09:38
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
0
cs_walidlam Messages postés 107 Date d'inscription lundi 30 mai 2011 Statut Membre Dernière intervention 29 avril 2013 1
26 mars 2013 à 12:44
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
@+
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
26 mars 2013 à 14:17
@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
0
nadiasghaier
27 mars 2013 à 08:27
@ 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
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 mars 2013 à 12:14
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
0
cs_walidlam Messages postés 107 Date d'inscription lundi 30 mai 2011 Statut Membre Dernière intervention 29 avril 2013 1
27 mars 2013 à 12:48
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
@+
0
Rejoignez-nous