2010-12-11 41 views
1

Supposons que je souhaite créer une procédure dans une unité que j'ai créée pour afficher et masquer les formulaires par leur nom (transmis en tant que paramètre).Comment puis-je passer un formulaire à une procédure en tant que paramètre et manipuler ses propriétés?

Comment pourrais-je faire cela et quelle est la syntaxe?

Merci.

EDIT

Je cherche quelque chose comme: Popup (FormMy, 'Show'); de l'intérieur de mon unité.

+1

Qu'est-ce que Popup? Et pourquoi n'écrivez-vous pas simplement FormMy.Show? Je pense que vous devez élaborer votre question afin que nous puissions vous aider. –

+0

Je montre des formes avec des effets de type messager, donc je ne veux pas écrire le code pour ça dans chaque forme. C'est pourquoi Popup appelle Form.Show mais aussi en plaçant le formulaire au bon endroit et en faisant l'effet. – emurad

Répondre

0

Vous pouvez écrire une procédure comme celui-ci

procedure ShowMyForm(Form: TForm; Show: Boolean); 
begin 
    if Show then 
    Form.Visible := True 
    else 
    Form.Visible := False; 
end; 

et appelez votre formulaire par ShowMyForm(MyForm, True); et assurez-vous que votre appareil Comme David a dit que vous pouvez le faire

procedure ShowMyForm(Form: TForm; Show: Boolean); 
begin 
    Form.Visible := Show 
end; 
+1

@Bharat: Vous n'avez pas besoin d'une procédure pour cela, vous venez d'écrire MyForm.Visible: = True –

+0

@David: Vous avez raison, mais si j'ai plusieurs formulaires, pour lesquels je dois montrer/cacher, cela sera utile. – Bharat

+0

@Bharat: Non ce ne sera pas. La routine telle qu'écrite est complètement interchangeable avec la propriété Visible. En fait, vous pouvez écrire le corps de votre fonction en tant que Form.Visible: = Montrer ce qui rend plus clair que c'est nugatoire. –

0

En supposant que les formulaires ont été créés avec le formulaire parent en tant que propriétaire [.Create (Self)], cela devrait fonctionner:

procedure ShowFormByName(const ParentForm: TForm; const FormName: String; ShowForm: Boolean); 
var 
    i: Integer; 
begin 
    for i := 0 to pred(ParentForm.ComponentCount) do 
    begin 
    if (ParentForm.Components[i] is TForm) and ParentForm.Components[i].Name = FormName) then 
    begin 
     if ShowForm then 
     TForm(ParentForm.Components[i]).Show 
     else 
     TForm(ParentForm.Components[i]).Hide; 

     Break; 
    end; 
    end; 
end; 
+0

Ce code fonctionne maintenant, je pense. Je pense que vous voulez dire ParentForm au lieu de Component. Aussi le cas TForm n'est pas nécessaire puisque le nom est introduit dans TComponent si je me souviens correctement. –

+0

Correction, merci David – norgepaul

+0

Et je pense que vous pouvez juste affecter ShowForm à 'ParentForm.Components [i] .Visible' – CodesInChaos

0

Vous pouvez boucle autour de la propriété CustomForms (il y a CustomFormCount d'entre eux) de l'objet Screen global. Cela énumère simplement tous les formulaires VCL dans l'application qui peuvent être ce que vous voulez.

Si vous êtes à la recherche pour le code que ce serait quelque chose comme ceci:

for i := 0 to Screen.CustomFormCount-1 do begin 
    Form := Screen.CustomForms[i]; 
    if Form.Name=TargetName then begin 
    DoSomething(Form); 
    break; 
    end; 
end; 
0
function GetFormByName(const FormName: string): TForm; 
var 
    i : Integer; 
begin 
    Result := nil; 
    for i := 0 to Screen.FormCount - 1 do 
    begin 
    if SameText(Screen.Forms[i].Name,FormName) then 
    begin 
     Result := Screen.Forms[i]; 
     Break; 
    end; 
    end; 
end; 
+2

Si le 'FormName' n'est pas trouvé, cela retournera le dernier formulaire dans' Screen.Forms'. Si vous changez le 'Break' à' Exit', et déplacez le 'AForm: = nil' vers le bas, cela devrait fonctionner. – jasonpenny

+0

@jasonpenny, vous avez raison, merci. J'ai écrit le code rapidement, et je ne l'ai pas testé. J'ai mis à jour le post pour résoudre ce problème. – vcldeveloper