Bonjour,
Après avoir délaissé FMX pendant un moment je m'y replonge . Je me suis mis en tête de faire un menu dans une ListView (en fait une TMSFMXListView mais le principe est le même), les Items de ce menu étant dans une Table .
Jusque là pas de soucis majeur (j'ai même trouvé la solution pour mettre plusieurs images dans un TlistBoxItem ce que je ne réussissais pas à faire lors de la rédaction de mon tuto sur les styles Firemonkey) .
Chaque Item appelle une frame différente
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 procedure TMainForm.FormCreate(Sender: TObject); var Item : TTMSFMXTableViewItem; uns : TMemoryStream; begin ADConnection1.Connected:=true; ADQuery1.Active:=true; Menu.BeginUpdate; Menu.Items.Clear; while not ADQuery1.EOF do begin Item:=Menu.Items.Add; Item.CanDelete:=False; Item.Caption:=AdQuery1.FieldByName('LIBELLE').AsString; Item.Description:=AdQuery1.FieldByName('DESCRIPTION').AsString; try uns:=TMemoryStream.Create; TBlobField(AdQuery1.FieldByName('ICONE')).SaveToStream(uns); Item.Bitmap.LoadFromStream(uns); finally uns.Free; end; ADQuery1.Next; end; Menu.EndUpdate; // répertorie les frames RegisterClass(TPays); ..... end;
Mon problème est sur le mode d'appel des ces frames selon le nom
plutôt que d'utiliser un case of etc... j'ai voulu :
a) recenser les frames dans le create de la forme principale (j'aurais pu utiliser des TForms mais puisque XE4 propose des Frames ...)
b) et dans le code du dessous créer la frame en fonction de son nom de classe
Si dans mon code AItem.Caption:='Pays' , la classe est bien trouvée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 procedure TMainForm.MenuItemClick(Sender: TObject; AItem: TTMSFMXTableViewItem); var FrameACreer: TFrame; ClasseAUtiliser: TFrame; NomClasseFrame: string; begin NomClasseFrame := 'T' + AItem.Caption; // ok ClasseAUtiliser := TFrame(FindClass(FrameNameToUse)); // ok if Assigned(ClasseAUtiliser) then // ok begin FrameACreer := ClasseAUtiliser.Create(nil); // violation d'accès FrameACreer.Parent:=FrameContainer; end; end;
Si je fais : FrameACreer:=TPays.Create(nil) pas de soucis , ça passe
=> c'est bien le create qui foire (pour l'instant une frame simple avec un bouton et un edit)
je n'arrive pas a mettre le doigt sur la faille
un petit coup de main serait bienvenu
Partager