program testGUI;
uses
System, Controls, GraphWPF;
begin
Window.Title := 'GUI Mode with WPF';
var edit1 := TextBoxWPF.Create(40,30,'Type your name:',100);
var button1 := ButtonWPF.Create(40,80,'Click me!',100,12);
edit1.FontSize := 13;
button1.Height := 30;
// I thought it would be like this, but this does not work obviously
button1.Click := () -> begin
// show another window
var form1 := Form.Create;
var button2 := ButtonWPF.Create(40,80,'Click me!',100,12);
form1.AppendControl(button2);
// or draw using GraphABC
form1.Pen.Color := clNavy;
form1.DrawCircle(100,100,40);
form1.Show;
end;
end.
Now, if I click on button1, I want to create and show another window (form) that has its own controls or draw upon itu using GraphABC methods. The new form definition could be in the same program file or in another file (unit).
Well i wanted for devs to give answer because i’m not entirely sure, but i think units like GraphWPF were only made for single-window programs.
You can create multiple windows by using WPF directly. Though you would probably also need to create another AppDomain for each window (except the first one).
Here is a bit of sample shitcode (you really shouldn’t use it in production like this):
uses System.Windows;
uses System.Windows.Controls;
{$reference PresentationFramework.dll}
{$reference PresentationCore.dll}
{$reference WindowsBase.dll}
{$apptype windows}
begin
var w := new Window;
var b := new Button;
w.Content := b;
b.Content := 'Click me';
b.Click += (o,e)->
begin
var thr := new System.Threading.Thread(()->System.AppDomain.CreateDomain('Domain for second window').DoCallBack(()->
begin
var w2 := new Window;
Application.Create.Run(w2);
end));
thr.ApartmentState := System.Threading.ApartmentState.STA;
thr.Start;
end;
Application.Create.Run(w);
end.
Well, it works. But each window act as two different applications that run independently, not as part of a single application. The boiler code to do it is also too much for newbies. I think it’s not a suitable solution for newbies.
Like other multi window application which the main form acts as the main app. If you close it, all the other subforms are closed too. But if we close a subform, the main form still exists.
This behavior is usually added manually. Event handler for close button saves everything and shut’s down whole application, so other windows would die too.
No, I’ve tested it with Delphi. Only the main form acts as the application. If I close the main form, all the subforms are closed as well. It’s the other way around. If you close the main form but want to keep the application running, you have to give the main form handle to the subform which you must do it manually.