2010-03-18 9 views
1

Dans mon projet Delphi, je veux avoir un bouton 'Paramètres' qui, lorsqu'on clique dessus, ouvre un second formulaire (je pense que c'est le bon terme, je veux essentiellement une nouvelle fenêtre pour ouvrir) pour les paramètres.Plusieurs formes dans delphi

Lorsque l'utilisateur a fini de modifier les paramètres de ce nouveau formulaire, je souhaite que le formulaire se ferme en cliquant sur un bouton.

Les paramètres dans lesquels l'utilisateur saisira devront également être accessibles par le premier formulaire «principal». Ainsi, par exemple, si mon programme consistait en une forme principale, cela calculait 'A' + 'B' (A et B étant des variables entières), avec la forme de paramétrage permettant à l'utilisateur de définir des valeurs pour A et B , comment ferais-je cela?

Répondre

4

Ce n'est pas trop difficile si vous comprenez le modèle d'objet de Delphi. Un formulaire est un objet qui descend de TObject, soutenu par un fichier DFM pour faciliter la configuration de la mise en page. Les contrôles sur ce sont d'autres objets, et par défaut ils sont publiquement visibles à d'autres objets d'autres unités, comme votre autre forme. Il y a deux façons de faire ça.

Le moyen le plus simple est d'avoir le code de votre autre formulaire lire directement les valeurs des contrôles une fois que vous avez terminé avec le premier formulaire. Juste utiliser des choses comme MyString := Form2.EditBox.Text;. Ce n'est pas particulièrement bon style, mais cela fonctionne. La bonne façon de le faire est soit de mettre des propriétés publiques sur votre formulaire qui récupèrera les valeurs des contrôles, soit une fonction qui les lira et retournera une sorte d'objet ou d'enregistrement contenant tous les paramètres. Cela prend un peu plus de travail, mais il en résulte un code plus propre qui est moins susceptible de causer des problèmes si vous modifiez les choses sur la route.

EDIT: En réponse à la question dans le commentaire:

Pour faire une forme afficher et masquer une autre, vous appelez afficher et masquer sur elle. Ou si vous voulez l'afficher dans une boîte de dialogue modale, appelez la méthode ShowModal, qui prend soin de vous cacher, à condition de créer un bouton qui définit ModalResult. (Voir le fichier d'aide pour plus de détails sur le fonctionnement de ces méthodes.)

Bien sûr, le formulaire doit avoir été créé en premier. Soit il peut être créé automatiquement par le DPR, ce qui est bon pour les programmes simples mais pas si génial une fois que vous obtenez beaucoup de formulaires dans votre application, ou vous pouvez le créer en code. Henk a un exemple de la façon de faire cela, bien que je ne recommanderais pas d'utiliser le mot-clé avec. Et si vous avez créé le formulaire vous-même, assurez-vous de le libérer ensuite.

+0

Merci! Je vais essayer la manière complexe et propre je pense .... Si j'ai deux formes dans un programme cependant, Form1 et Form2, comment puis-je faire un spectacle ou cacher de l'autre forme. J'ai essayé Form2. de Form1 mais cela n'a pas fonctionné. – chendriksen

+0

@ Hendriksen123: Voir ma modification. –

0

Je créerais un des paramètres des objets dans form1 et l'envoyer pour former 2:

TSettings = class 
private  
    FPropA: integer; 
    FPropB: string; 
published 
    property PropA: integer read FPropA write FPropA: 
    property PropB: string read FPropB write FPropB: 
end; 

... 
form2.EditSettings(ASettings); 
2

Je conçois généralement les paramètres formulaire et ajouter une fonction de classe exécuter à elle, qui modifie un enregistrement contenant des champs pour les paramètres comme ceci:

Tf_MySettings = class(TForm) 
    // ... 
private 
    procedure SetData(const _Settings: TSettingsRec); 
    procedure GetData(out _Settings: TSettingsRec); 
public 
    class function Execute(_Owner: TComponent; var _Settings: TSettingsRec): boolean; 
end; 

implementation 

function Tf_MySettings.Execute(_Owner: TComponent; var _Settings: TSettingsRec): boolean; 
var 
    frm: Tf_MySettings; 
begin 
    frm := Tf_MySettings.Create(_Owner); 
    try 
    frm.SetData(_Settings); 
    // for this to work, the OK button must have ModalResult=mrOK 
    Result := frm.ShowModal = mrOK; 
    if Result then 
     frm.GetData(_Settings); 
    finally 
    frm.Free; 
    end; 
end; 

procedure Tf_MySettings.SetData(const _Settings: TMySettingsRec); 
begin 
    ed_Name.Text := _Settings.Name; 
    // ... 
end; 

procedure Tf_MySettings.GetData(out _Settings: TMySettingsRec); 
begin 
    _Settings.Name := ed_Name.Text; 
    // ... 
end; 

Vous l'appelez comme ceci:

if Tf_MySettings.Execute(self, _Settings) then begin 
    // settings have been changed 
end; 
Questions connexes