Skip to content

Commit 11b60f7

Browse files
committed
Creational mechanism for resourced and non-resourced FMX forms
1 parent 2ef7531 commit 11b60f7

File tree

1 file changed

+52
-2
lines changed

1 file changed

+52
-2
lines changed

Source/fmx/WrapFmxForms.pas

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
interface
66

77
uses
8-
FMX.Forms, PythonEngine, WrapDelphiClasses, WrapFmxTypes, WrapFmxControls;
8+
System.Classes, FMX.Forms,
9+
PythonEngine, WrapFmxTypes, WrapDelphiClasses, WrapFmxControls;
910

1011
type
1112
TPyDelphiApplication = class(TPyDelphiComponent)
@@ -23,7 +24,9 @@ TPyDelphiCommonCustomForm = class(TPyDelphiFmxObject)
2324
private
2425
function GetDelphiObject: TCommonCustomForm;
2526
procedure SetDelphiObject(const Value: TCommonCustomForm);
27+
function HasFormRes(const AClass: TClass): boolean;
2628
public
29+
function CreateComponent(AOwner: TComponent): TComponent; override;
2730
// Class methods
2831
class function DelphiObjectClass: TClass; override;
2932
// Properties
@@ -88,7 +91,7 @@ TPyDelphiScreen = class(TPyDelphiComponent)
8891
implementation
8992

9093
uses
91-
WrapDelphi;
94+
WrapDelphi, System.Types;
9295

9396
{ Register the wrappers, the globals and the constants }
9497
type
@@ -153,6 +156,46 @@ procedure TPyDelphiApplication.SetDelphiObject(const Value: TApplication);
153156

154157
{ TPyDelphiCommonCustomForm }
155158

159+
function TPyDelphiCommonCustomForm.CreateComponent(
160+
AOwner: TComponent): TComponent;
161+
type
162+
TCommonCustomFormClass = class of TCommonCustomForm;
163+
var
164+
LClass: TClass;
165+
LFormClass: TCommonCustomFormClass;
166+
LClassName: string;
167+
begin
168+
//if we have a subclass of our Form wrapper, then check if we can find a
169+
//Delphi class that would have the same name as the Python class.
170+
//This would allow Python to instanciate an existing Delphi form class,
171+
//insted of only using a blank form.
172+
if (ob_type <> PythonType.TheTypePtr) then begin
173+
LClassName := string(ob_type.tp_name);
174+
LClass := GetClass(LClassName);
175+
if not Assigned(LClass) then
176+
LClass := GetClass('T' + LClassName);
177+
if Assigned(LClass) and LClass.InheritsFrom(TCommonCustomForm) then
178+
LFormClass := TCommonCustomFormClass(LClass);
179+
end else begin
180+
//get de default form class
181+
if DelphiObjectClass.InheritsFrom(TCommonCustomForm) then
182+
LFormClass := TCommonCustomFormClass(DelphiObjectClass);
183+
end;
184+
185+
//if it's not a design form, so we create it as a non-resourced form,
186+
//using the non-resourced constructor.
187+
//if the Owner is TApplication, then we have to call its CreateForm method,
188+
//otherwise we won't have a mian form defined, as the main form is the first
189+
//created form. Of course, this is a concern only when Python controls all the
190+
//GUI and calls Apllication.Run by itself.
191+
if not HasFormRes(LFormClass) then
192+
Result := LFormClass.CreateNew(AOwner)
193+
else if (AOwner = Application) then
194+
Application.CreateForm(LFormClass, Result)
195+
else
196+
Result := LFormClass.Create(AOwner);
197+
end;
198+
156199
class function TPyDelphiCommonCustomForm.DelphiObjectClass: TClass;
157200
begin
158201
Result := TCommonCustomForm;
@@ -163,6 +206,13 @@ function TPyDelphiCommonCustomForm.GetDelphiObject: TCommonCustomForm;
163206
Result := TCommonCustomForm(inherited DelphiObject);
164207
end;
165208

209+
function TPyDelphiCommonCustomForm.HasFormRes(const AClass: TClass): boolean;
210+
begin
211+
Result := FindResource(
212+
FindResourceHInstance(FindClassHInstance(AClass)),
213+
PChar(AClass.ClassName), PChar(RT_RCDATA)) <> 0;
214+
end;
215+
166216
procedure TPyDelphiCommonCustomForm.SetDelphiObject(
167217
const Value: TCommonCustomForm);
168218
begin

0 commit comments

Comments
 (0)