Ouvrir la form portant le nom contenu dans un TLabel

Signaler
Messages postés
138
Date d'inscription
vendredi 28 février 2003
Statut
Membre
Dernière intervention
29 février 2008
-
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
-
Bonjour,

J'aimerai ouvrir une form portant le nom contenu dans mon TLabel.

J'ai essayé Label1.Caption.Show mais biensur ça ne marche pas car delphi ne sait pas que je veut indiquer par Label1.Caption, le nom d'une form.

J'aimerai donc savoir ce qu'il faut que je fasse?

Merci bcp

3 réponses

Messages postés
12
Date d'inscription
samedi 15 juin 2002
Statut
Membre
Dernière intervention
30 août 2007

Pas sur d avoir vraiment compris ton probleme
mais si jai bien compris ....

procedure TForm1.FormActivate(Sender: TObject);
begin
form1.Caption := label1.Caption ;
end;
Messages postés
138
Date d'inscription
vendredi 28 février 2003
Statut
Membre
Dernière intervention
29 février 2008

Merci pour ton aide mais c pas tout a fait ça mon prob.

Je me réexplique :) :

Je vais essayer d'etre plus clair:

Disons que j'ai une string s'appelant NomForm

NomForm:=Ma_page;

je veut donc savoir comment ouvrir la Form Ma_page mais sans faire appel a la fonction Ma_page.show car la valeur de NomForm change constament suivant la Form active

Je veut donc savoir comment ouvrir la form dont le nom est contenu dans NomForm

Merci
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Effectivement, le problème est un peu plus complexe et voici ma réponse commentée :
procedure TForm1.btnFindClassClick(Sender: TObject);
var
  FormClass : TFormClass;
  Existing: boolean;
  i: integer;
begin
  //Rechercher si la classe existe à l'aide de GetClass qui
  //a l'avantage de ne pas déclencher d'exception
  //s'il ne parvient pas à trouver la classe, contrairement
  //à FindClass
  FormClass :=  TFormClass(GetClass(Label1.Caption));
  //Si le classe est enregistrée
  if FormClass <> nil then
  begin
    Existing := False;
    //Rechercher la première fenêtre de la classe
    for i := 0 to Screen.FormCount - 1 do
      if Screen.Forms[i] is FormClass then
      begin
        //Montrer la fenêtre
        Screen.Forms[i].Show;
        //Restaurer ses dimensions
        ShowWindow(Screen.Forms[i].Handle, SW_Restore);
        Existing := True;
        break;
      end;
    //S'il n'y a pas de fenêtre visible de ce type
    if not Existing then
      //alors, il faut en créer une
      with FormClass.Create(Self) do
        Show;
  end;
    
end;


Et, de plus, pour ne pas référencer, dans l'unité qui contient ce code, toutes les unités que l'on est susceptible d'appeler, il faudra faire appel à la function RegisterClass dans chaque unité que l'on veut pouvoir appeler. Comme la classe appelée doit être connue dès le départ, il est préférable de mettre l'appel à RegisterClass dans une section Initialization.

Exemple, dans Unit2 qui contient Form2 de type TForm2 :
Unit2

type
  TForm2  = Class(TForm);
  end;
var
  Form2: TForm2;
implementation

// etc

initialization
  RegisterClass(TForm2);

end.


En résumé, si Label1.Caption (dans Form1) est égal à TForm2, alors, le code recherchera s'il existe une classe de ce nom. Si la classe est trouvée, alors on recherche si une fiche de ce type existe en mémoire et, si oui, on l'affiche et si non, on la crée.

Ce code fait appel à la notion de référence de classe (ici TFormClass).
Quand je vois que tu écris Label1.Caption.Show, je ne suis pas sûr que cette notion te soit familière.

Alors, un petit tour dans l'aide en ligne sur le Pascal Objet (voir "références de classe") t'aidera à comprendre la démarche employée ici, pas évidente au premier abord.

May Delphi be with you