Je continue sur ce que dit Qwazerty, mais soit tu peux regénérer les menus via une Base de données, ou via un Fichier mais il te faut une source, donc si ton utilisateur ajoute des menus, et qu'il veut les revoir, il faut les sauvegarder ... ou alors, tu lance ce fameux code systématiquement
Sinon, si cela intéresse, une Astuce pour enregistrer un Menu et le chargement ultra simplement via un fichier qui sera ni plus ni moins un bout de DFM !
Tu sauvegarde le noeud qui contient les item à sauvegarder, le mieux c'est que ce noeud soit lui même générer par code, si il y n'y a pas de fichier
Donc écriture du Noeud
WriteDFMStringInFile(ComponentToString(RootMenu), 'FichierTruc.DFM');
Puis à la seconde execution tu fait
ASuperMenu.Add(StringToComponent(ReadDFMStringFromFile('FichierTruc.DFM')) as TMenuItem);
en sachant que ASuperMenu aurait du être le Parent de RootMenu, mais comme il y a un fichier il ne faut pas créer RootMenu, car celui-ci va se créer via le fichier ...
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
| procedure WriteDFMStringInFile(const AString, FileName: string);
var
FLNC: File;
begin
AssignFile(FLNC, FileName);
Rewrite(FLNC, 1);
try
BlockWrite(FLNC, AString[1], Length(AString));
finally
CloseFile(FLNC);
end;
end;
FileSize(var F)
function ReadDFMStringFromFile(const FileName: string): string;
var
FLNC: File;
begin
AssignFile(FLNC, FileName);
Reset(FLNC, 1);
try
SetLength(Result, FileSize(FLNC));
BlockWrite(FLNC, Result[1], Length(Result));
finally
CloseFile(FLNC);
end;
end; |
bon, il faudrait faire une variante de ComponentToString/StringToComponent, en utilisant un TFileStream, je les ai quelques part, mais je sais pas où ...
code de l'Aide Delphi, ben oui, ce n'est que dans l'aide, étrange car utile ...
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 30 31 32 33 34 35 36 37 38 39 40 41 42
| function ComponentToString(Component: TComponent): string;
var
BinStream: TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(s);
try
BinStream.WriteComponent(Component);
BinStream.Seek(0, soFromBeginning);
ObjectBinaryToText(BinStream, StrStream);
StrStream.Seek(0, soFromBeginning);
Result := StrStream.DataString;
finally
StrStream.Free;
end;
finally
BinStream.Free
end;
end;
function StringToComponent(const Value: string): TComponent;
var
StrStream:TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result := BinStream.ReadComponent(nil);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end; |
Partager