Comment puis-je créer dynamiquement
des pages dans un tpagecontrol ?
Créer un nouveau projet,
Première étape: Enregistrer la classe TTabsheet
registerclasses([TTabSheet * );
Deuxièmement: Mettre un composant
tpagecontrol sur la fiche principale, créer
une nouvelle page dans le tpagecontrol et mettez
les composants souhaités dans cette page.
Troisièmement: Créer le fichier
de ressources contenant la page qui sera
affichée à l'exécution.
Suivez les instructions ci-dessous
Vous devez changer la propriété parent
des composants que vous avez sur la page à
afficher dynamiquement. Ici, "Self" est la fiche
principale.
var i:integer; c:Tcomponent;
begin
for i := 0 to tabsheet1.Controlcount - 1 do
begin
c := tabsheet1.Controls[i * ;
Self.RemoveComponent(c);
tabsheet1.InsertComponent(c);
end;
saveToStream(Sender);
end;
Quatrièmement, vous devez enregistrer
la page dans un fichier.
procedure TForm1.SaveToStream(Sender: TObject);
var
AStream: TMemoryStream;
begin
if SaveDialog1.execute then
begin
//GuiToObject;
AStream := TMemoryStream.Create;
try
AStream.WriteComponent(tabsheet1);
AStream.SaveToFile(SaveDialog1.FileName);
finally
AStream.free;
end;
end;
end;
Vous devez mettre ce fichier dans un fichier
de resource. Créer un nouveau fichier.
Appelez-le Tabsheet.rc
MyTabSheet RCDATA "NomFichierEtape4"
Run this command
brcc32 tabsheet.rc
Vous obtenez "tabsheet.res"
Enregistrez le projet si vous le souhaitez.
Vous êtes; prêt à créer
des pages dynamiques dans votre application.
Cinquièmement, vous enregistrez la classe TPageControl
et la classe des composantes que vous avez
placez dans votre page
RegisterClasses([TTabSheet * );
RegisterClasses([TListView * );
//Si vous avez mis un tlistview
Donc, pour créer une page dans
un Tpagecontrol, vous appelez la fonction
OpenNewTab with comme premier paramètre
"MyTabSheet"
uses classes, windows;
function OpenNewTab(resourcename:string;
pagecontrol:TPageControl;
sheetcaption:string):TTabSheet;
//retourne une page (TTabsheet)
var
ms: TMemoryStream;
sheet: TTabSheet;
begin
sheet:=nil;
ms := TMemoryStream.Create;
try
GetResourceInStream(resourcename,ms);
sheet := ms.ReadComponent(nil) as TTabsheet;
sheet.Pagecontrol := pagecontrol;
//Vous attachez la page au TPagecontrol
sheet.Caption := sheetcaption;
//Vous lui donnez un titre
sheet.TabVisible:=true;
finally
ms.free
end;
result:=sheet;
end;
function GetResourceInStream(resourcename:string;
stream:TMemoryStream):boolean;
var
ResHandle : THandle;
MemHandle : THandle;
ResPtr : PByte;
ResSize : Longint;
begin
ResHandle := FindResource(0,
PAnsiChar(resourcename),RT_RCDATA);
MemHandle := LoadResource(Hinstance, ResHandle);
ResPtr := LockResource(MemHandle);
ResSize := SizeOfResource(Hinstance, ResHandle);
stream.SetSize(ResSize);
stream.Write(ResPtr^, ResSize);
FreeResource(MemHandle);
stream.position:=0;
end;
N.B : Si vous voulez fermer une page, vous devez mettre la propriété parent à nil avant d'appeler la méthode "free" ou vous aurez des violations d'accès