2017-12-05 2 views
0

Ich beginne mit den DUnit-Tests, also entschuldige mich im Voraus für Anfängerfehler. Wenn ich versuchte, einfache Tests auszuführen, und der Compiler das SetUp meiner Testklasse ausführt, beendet es das Zurückgeben der Nachricht "kann Formular nicht erstellen". Derzeit sind keine MDI-Formulare aktiv '.DUnit-Test - Formular kann nicht erstellt werden. Derzeit sind keine MDI-Formulare aktiv

Nach einigen Recherchen fand ich einige Erklärungen, aber keine zu meinem Problem.

Das Problem scheint zu sein, wenn ich die Create-Methode meines Kindes Ursprung Klasse aufrufen - nach Herkunft meine ich die Klasse, wo ich alle Prozeduren und Funktionen zu testen haben, können wir es von TfrmFoo nennen. Und meine Testklasse sollte der TestTfrmFoo sein. Das TFrmFoo hat ein Elternteil mit einigen grundlegenden Codes, dem TfrmParentFoo.

Ich rufe die Methode wie folgt erstellen:

... 

implementation 

procedure TestTfrmFoo.SetUp; 
begin 

    FfrmParentFoo := TfrmParentFoo.Create(nil); 

    FfrmFoo := TfrmFoo.Create(FfrmParentFoo);  

end; 

procedure TestTfrmFoo.TearDown; 
begin 
    FfrmFoo.Free; 
    FfrmFoo := nil; 
end; 

... 

Danach wird die Create-Methode der TfrmFoo Klasse aufgerufen wird und der folgende Fehler auftritt: "nicht Formular erstellen. Derzeit sind keine MDI-Formulare aktiv '.

Ich habe bereits versucht, das Erstellen meiner untergeordneten Klasse TfrmFoo zu überschreiben, indem ich die FormStyle-Eigenschaft auf 'fsNormal' statt 'fsMDIChild' und nichts setze. Ich habe auch ein paar Ideen über Schlaf (500) gefunden, aber das Problem geht weiter.

Edited: Nach dem Remy Lebeau Beitrag habe ich den SetUp Test geändert, um das übergeordnete Formular zu erstellen, bevor das Kind rief, und als Parameter an das Erstellen Kind mit. Gleiche Fehlermeldung. Habe ich etwas falsch gemacht?

Weitere Tipps? Tks!

Antwort

1

Wenn ein TForm hat seinen FormStyle Satz fsMDIChild, hat das Projekt MUST ein FormStyle erstellt Application.MainForm deren auf fsMDIForm gesetzt. Dies ist eine hartcodierte Anforderung der VCL, nicht das zugrunde liegende MDI-System (obwohl es einen Weg zu circumvent this limitation mit manueller Arbeit gibt).

Der Fehler, den Sie sehen, bedeutet, dass Ihr Projekt keine Application.MainForm vor allen fsMDIChild Formen fsMDIForm erstellt und festgelegt hat geschaffen. Sie müssen das beheben.

das Kind einstellen Form der FormStyle in seinem Konstruktor oder OnCreate Ereignis zu spät ist, da der Fehler passiert, wenn das Kind Form seine HWND erstellt, die früh im DFM-Streaming-Prozess auftritt, bevor Create/OnCreate einen oppurtunity muss versuchen, Zuweisen die FormStyle.

+0

Danke, ich werde das versuchen. Der Nachteil besteht darin, dass alle Referenzen, die mit dem Elternteil kommen, manuell in der .dpr-Datei abgelegt werden müssen, sobald dies nicht automatisch erfolgt und ich keinen Weg gefunden habe, einen ganzen spezifischen Ordner abzubilden. – DTondin

0

Nach ein paar Versuchen, entfernte ich nur das Kind Create Methode
FfrmFoo := TfrmFoo.Create(FfrmParentFoo); und arbeitete wie ein Charme: D.

Das Problem lag daran, dass ich versuchte, eine neue untergeordnete Instanz zu erstellen, auch nachdem ein neues Elternelement erstellt wurde.Der endgültige Code wurde wie folgt vor:

... 

implementation 

procedure TestTfrmFoo.SetUp; 
begin 

    FfrmParentFoo := TfrmParentFoo.Create(nil);  

end; 

procedure TestTfrmFoo.TearDown; 
begin 
    FfrmFoo.Free; 
    FfrmFoo := nil; 
end; 

... 

Dank Remy Lebeau für die Einsicht.

Verwandte Themen