2009-03-06 10 views
3

Quel fichier physique stocke le nom de formulaire principal pour une application Delphi?Où est le nom "Formulaire principal" stocké dans Delphi?

par exemple. MyApplication a un formulaire MyForm qui est défini comme "Formulaire principal" via les options du projet. Où est stockée l'information "Main Form = MyForm"?

Dans l'IDE Delphi, l'application "Formulaire principal" est spécifiée via le menu: Project | Options | Forms.

Le fichier évident serait le .bdsproj ou le .dpr mais il ne semble y avoir rien dans l'un de ces deux qui indique quelle forme est la "principale".

Répondre

15

Il se trouve dans le fichier projet (.DPR). Le premier appel à Application.CreateForm() avec un formulaire en tant que paramètre identifie le formulaire principal de l'application.

Notez qu'un TDataModule ne satisfait pas à la condition ci-dessus; C'est utile, car vous pouvez créer automatiquement un datamodule avant votre formulaire principal, puis accéder à ce datamodule dans le constructeur du formulaire principal.

+0

J'avais des souvenirs de quelque chose à voir avec la commande quelque part. L'astuce est que c'est le premier CreateForm (TForm, ...). L'application que je regarde a eu la création de formulaire enfouie parmi les créations de module de données de sorte qu'il n'était pas évident qu'il était le premier. Merci pour le rappel :) – WileCau

+0

Oui, les datamodules ne sont pas éligibles pour être des formulaires principaux (évidemment), et ils sont exclus de la règle du "premier appel" que j'ai mentionnée. Je vais modifier mon message pour refléter cette correction. –

+0

@Ken: Pourquoi est-ce que l'auto-création de modules de données pour y accéder dans le constructeur du formulaire principal serait meilleure que de les créer là? – mghie

0

Juste pour ajouter à la réponse de Ken White.

Si vous regardez la source CreateForm:

procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference); 
var 
    Instance: TComponent; 
begin 
    Instance := TComponent(InstanceClass.NewInstance); 
    TComponent(Reference) := Instance; 
    try 
    Instance.Create(Self); 
    except 
    TComponent(Reference) := nil; 
    raise; 
    end; 
    if (FMainForm = nil) and (Instance is TForm) then 
    begin 
    TForm(Instance).HandleNeeded; 
    FMainForm := TForm(Instance); 
    end; 
end; 

Vous voyez que la fonction (malgré son nom) peut être utilisé pour créer d'autres composants. Mais seul le premier composant qui est un TForm et qui est créé avec succès, peut être la forme principale.

Et puis une diatribe sur les variables globales.

Les globals globaux sont souvent incorrects, mais pour un objet application et un objet mainform, vous pouvez créer une exception. Bien que vous pouvez omettre le global pour la mainform mais vous devez modifier le DPR fichier vous-même:

Change:

begin 
    Application.Initialize; 
    Application.CreateForm(TMyMainForm, MyMainFormGlobal); 
    Application.Run 
end. 

Pour:

procedure CreateMain; 
var 
    mainform : TMyMainForm; 
begin 
    Application.CreateForm(TMyMainForm, mainform); 
end; 

begin 
    Application.Initialize; 
    CreateMain; 
    Application.Run 
end. 

Et vous avez perdu toutes les formes mondiales.

+0

@Gamecat: Typo dans votre dernier bloc de code. Vous avez déclaré "mainform", mais utilisé l'ancien "MyMainFormGlobal" dans l'appel CreateForm(). Vous pourriez vouloir corriger cela. –

+0

Etes-vous sûr que le dernier code fonctionne? L'EDI ne l'aime pas quand le code qui apparaît comme s'il appartient au bloc de début principal apparaît ailleurs dans le fichier DPR. C'est un hasard si l'IDE vous permettra de compiler le projet si vous faites les mauvais changements. –

+0

Oui cela fonctionne. (J'ai essayé en utilisant 2006). Je sais que l'IDE ne l'aime pas, mais il n'aime pas d'autres constructions juridiques aussi. Donc, tant qu'il compile et fonctionne, il n'y a pas de problème pour moi. –

Questions connexes