Öffnen von MDI Child Fenster

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Robologe
Beiträge: 20
Registriert: Di 2. Mai 2017, 13:00

Öffnen von MDI Child Fenster

Beitrag von Robologe »

Ich hab da Probleme mit dem Öffnen eines Child Fensters ... FSStyle:Form1 MDIForm Form2 MDIChild
Es kommt kein Fehler aber Fenster wird auch nicht geöffnet Lazarus 1.6.4 Win7 Home
hat jemand eine Idee ??

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus, Unit2;

type

{ TForm1 }

TForm1 = class(TForm)
MainMenu1: TMainMenu;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem;
OpenDialog1: TOpenDialog;
procedure MenuItem2Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.MenuItem2Click(Sender: TObject);
begin
TForm2.Create(Form1);
end;

end.




unit Unit2;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, SynEdit, PrintersDlgs, Forms, Controls, Graphics,
Dialogs, Menus;

type

{ TForm2 }

TForm2 = class(TForm)
FindDialog1: TFindDialog;
MainMenu1: TMainMenu;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem;
PrintDialog1: TPrintDialog;
PrinterSetupDialog1: TPrinterSetupDialog;
ReplaceDialog1: TReplaceDialog;
SaveDialog1: TSaveDialog;
SynEdit1: TSynEdit;
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure MenuItem2Click(Sender: TObject);
procedure SynEdit1Change(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.lfm}

{ TForm2 }


procedure TForm2.MenuItem2Click(Sender: TObject);
begin

end;

procedure TForm2.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
Action:=caFree;
end;

end.
Win 7 FPC 3.2.0 Laz 2.0.12

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: Öffnen von MDI Child Fenster

Beitrag von gladio »

da fehlt doch irgendwo die Routine zum Anzeigen deines Formulars
sowas wie FormXYZ.show oder FormXYZ.ShowModal
nach dem Erzeugen mit .Create

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Öffnen von MDI Child Fenster

Beitrag von wp_xyz »

Weil du mit MDI arbeitest, nehme ich an, dass du mehrere Instanzen von TForm2 erzeugen willst. Dann wäre das der richtige Code:

Code: Alles auswählen

procedure TForm1.MenuItem2Click(Sender: TObject);
begin
  with TForm2.Create(self) do
    Show;
end;

Dennoch wirst du damit kein echtes MDI-Verhalten (Form2 in Form1 eingebettet) sehen, weil Lazarus MDI-Formulare und -Fenster nicht vollständig implementiert. Nimm stattdessen MultiDoc/MultiFrame (http://wiki.lazarus.freepascal.org/MultiDoc).

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Öffnen von MDI Child Fenster

Beitrag von Warf »

Nur so am Rand, finger Weg von MDI. Microsoft würde am liebsten MDI in der Windows Forms API komplett entfernen, wenn es nicht Aufgrund von Kompaitibität drin bleiben müsste. Allerdings wird an MDI nichts mehr verbessert, und neue Funktionen der Windows Forms API schaffen es oftmals nicht, oder nur Dummyweise in MDI Formulare (z.B. Glass Frames und Opacity). Ich weiß Pascalentwickler verwenden gerne Technologien die seit 20 Jahren tot sind, aber MDI tut niemanden einen Gefallen. Benutz lieber normale Fenster, so wie Lazarus (ohne Anchordocking) es verwendet.

Außerdem ist MDI afaik nicht Cross kompatibel mit OSX oder GTK, nur zwischen QT und Windows. Falls du unbedingt MDI verwenden musst (naja außer das dich jemand bedroht wenn dus nicht machst fällt mir kein Grund ein MDI überhaupt anzufassen), dann verwende wenigstens Lazarus Interne Lösungen wie Mutlidoc, aber auf gar keinen Fall verwende die Systemschnittstelle. Um mal ein weiteres Argument anzuführen, für jedes MDI Programm mehr, hat Microsoft einen Grund mehr sich mit der Wartung dieser Schnittstelle zu beschäftigen, und damit wird der Preis von Windows teurer.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Öffnen von MDI Child Fenster

Beitrag von Mathias »

Nur so am Rand, finger Weg von MDI. Microsoft würde am liebsten MDI in der Windows Forms API komplett entfernen,

MDI war eines der wenigen Sachen, die M$ gut machte, und ausgerechnet dies soll verschwinden. :cry:

Ich fand es noch recht praktisch, man konnte sehr schnell 2 Fenster neben/unter einander legen. Oder auch überlappen.
Für einen Texteditor fand ich dies sehr praktisch. Turbp-Pascal hatte dies schon sehr gut hingekriegt, obwohl es im Text-Modus lief,.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

jc99
Beiträge: 29
Registriert: Fr 19. Mai 2017, 18:04
OS, Lazarus, FPC: Win10x64, L 1.8rc3, FPC3.0.2
CPU-Target: 64
Wohnort: Nord-Baden
Kontaktdaten:

Re: Öffnen von MDI Child Fenster

Beitrag von jc99 »

@Warf: Wenn Du schon auf Multidoc verweist dann solltest Du auch erwähnen, daß das ebenfalls seit Jahren nicht mehr weiterentwickelt wird. Und dem Packet eine wichtige Komponente (ich meine lMDI) fehlt. Mit etwas Mühe habe ich beides gefunden. und versuche dies grad in die Lazarus-CCR einpflegen zu lassen. Aber dort scheint kein großen Interesse daran zu bestehen.
https://bugs.freepascal.org/view.php?id=31924
Sparta_MDI steht in den jedoch in den Startlöchern um diese Lücke zu füllen.
OS: ...-Win10 x64
Laz: ...-1.8rc1
https://github.com/joecare99/public
'~| . . /'' . .
,_|oe \_,are

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Öffnen von MDI Child Fenster

Beitrag von Warf »

Mathias hat geschrieben:
Nur so am Rand, finger Weg von MDI. Microsoft würde am liebsten MDI in der Windows Forms API komplett entfernen,

MDI war eines der wenigen Sachen, die M$ gut machte, und ausgerechnet dies soll verschwinden. :cry:

Ich fand es noch recht praktisch, man konnte sehr schnell 2 Fenster neben/unter einander legen. Oder auch überlappen.
Für einen Texteditor fand ich dies sehr praktisch. Turbp-Pascal hatte dies schon sehr gut hingekriegt, obwohl es im Text-Modus lief,.


Das kann man mit nicht MDI Fenstern auch, und damit kann man sogar gleichtzeitg die Windows Taskbar und multiple Bildschirme Unterstützen, was mit MDI nicht geht.

jc99 hat geschrieben:@Warf: Wenn Du schon auf Multidoc verweist dann solltest Du auch erwähnen, daß das ebenfalls seit Jahren nicht mehr weiterentwickelt wird. Und dem Packet eine wichtige Komponente (ich meine lMDI) fehlt. Mit etwas Mühe habe ich beides gefunden. und versuche dies grad in die Lazarus-CCR einphlegen zu lassen. Aber dort scheint kein großen interesse daran zu bestehen.
https://bugs.freepascal.org/view.php?id=31924

ich kenne mich selbst damit nicht gut aus, ich habe es nur angeführt weil es das erste war was ich gefunden hab was LCL intern läuft.

jc99
Beiträge: 29
Registriert: Fr 19. Mai 2017, 18:04
OS, Lazarus, FPC: Win10x64, L 1.8rc3, FPC3.0.2
CPU-Target: 64
Wohnort: Nord-Baden
Kontaktdaten:

Re: Öffnen von MDI Child Fenster

Beitrag von jc99 »

Warf hat geschrieben:Das kann man mit nicht MDI Fenstern auch, und damit kann man sogar gleichtzeitg die Windows Taskbar und multiple Bildschirme Unterstützen, was mit MDI nicht geht.

Das ist leider nur die halbe Wahrheit, es funktioniert mit noch mit 4-5 offenen Fenstern, jetzt stell dir aber Lazarus ohne Docking und Tabbing(Ist so eine Unter-Art von MDI) vor mit einem richtig großen Projekt, z.B: der FP-IDE mit 30-40 Dateien. Eventuell auch noch mit separaten Form-Designern. Das alles willst du über die Task-Bar regeln ? Das mit mehreren Monitoren ist ein Argument. Lazarus und andere IDE lösen das indem man ein zweites Fenster aufmacht und die benötigten Dateien dann in das zweite Fenster schiebt.
OS: ...-Win10 x64
Laz: ...-1.8rc1
https://github.com/joecare99/public
'~| . . /'' . .
,_|oe \_,are

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Öffnen von MDI Child Fenster

Beitrag von Warf »

jc99 hat geschrieben:
Warf hat geschrieben:Das kann man mit nicht MDI Fenstern auch, und damit kann man sogar gleichtzeitg die Windows Taskbar und multiple Bildschirme Unterstützen, was mit MDI nicht geht.

Das ist leider nur die halbe Wahrheit, es funktioniert mit noch mit 4-5 offenen Fenstern, jetzt stell dir aber Lazarus ohne Docking und Tabbing(Ist so eine Unter-Art von MDI) vor mit einem richtig großen Projekt, z.B: der FP-IDE mit 30-40 Dateien. Eventuell auch noch mit separaten Form-Designern. Das alles willst du über die Task-Bar regeln ? Das mit mehreren Monitoren ist ein Argument. Lazarus und andere IDE lösen das indem man ein zweites Fenster aufmacht und die benötigten Dateien dann in das zweite Fenster schiebt.


Man muss die tastbar ja nicht verwenden, aber man kann. Darauf wollte ich hinaus. Man kann ohne MDI mit normalen Fenstern das selbe erreichen wie mit MDI, aber ohne die Limitierungen von MDI

Und außerdem, habe ich eh nie mehr als 5-6 Dateien gleichzeitig offen, ich kann eh maximal 3-4 gleichzeitig betrachten, also habe ich auch nur diese offen

Toni7878
Beiträge: 3
Registriert: Sa 20. Mai 2017, 21:51

Re: Öffnen von MDI Child Fenster

Beitrag von Toni7878 »

Warf hat geschrieben:Nur so am Rand, finger Weg von MDI. Microsoft würde am liebsten MDI in der Windows Forms API komplett entfernen, wenn es nicht Aufgrund von Kompaitibität drin bleiben müsste. Allerdings wird an MDI nichts mehr verbessert, und neue Funktionen der Windows Forms API schaffen es oftmals nicht, oder nur Dummyweise in MDI Formulare (z.B. Glass Frames und Opacity). Ich weiß Pascalentwickler verwenden gerne Technologien die seit 20 Jahren tot sind, aber MDI tut niemanden einen Gefallen. Benutz lieber normale Fenster, so wie Lazarus (ohne Anchordocking) es verwendet.

Außerdem ist MDI afaik nicht Cross kompatibel mit OSX oder GTK, nur zwischen QT und Windows. Falls du unbedingt MDI verwenden musst (naja außer das dich jemand bedroht wenn dus nicht machst fällt mir kein Grund ein MDI überhaupt anzufassen), dann verwende wenigstens Lazarus Interne Lösungen wie Mutlidoc, aber auf gar keinen Fall verwende die Systemschnittstelle. Um mal ein weiteres Argument anzuführen, für jedes MDI Programm mehr, hat Microsoft einen Grund mehr sich mit der Wartung dieser Schnittstelle zu beschäftigen, und damit wird der Preis von Windows teurer.

Woher willst du es wissen?
in meinem Delphi7 Projekt (über 100.000 LOC, und knapp 100 Forms) nutze ich MDI-s.
Die Art wie MDI Forms in Freepascal behandelt werden ist , mild gesagt nicht schön. Beim übersetzen wird keine Fehlermeldung ausgegeben. Im Ablauf werden die Childs nicht innerhalb des Hauptfensters angezeigt und können auch nicht als Childs erkannt werden.
Die angebotene Alternative Multidoc funktioniert nicht (das Demoprogramm stürzt ab).

Also das Fette soll heißen:
Finger weg vom Lazarus, wenn man MDI Childs benutzen möchte.

Übrigens Visual Basic unterstützt MDI Childs!

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Öffnen von MDI Child Fenster

Beitrag von Warf »

Toni7878 hat geschrieben:Woher willst du es wissen?
in meinem Delphi7 Projekt (über 100.000 LOC, und knapp 100 Forms) nutze ich MDI-s.
Die Art wie MDI Forms in Freepascal behandelt werden ist , mild gesagt nicht schön. Beim übersetzen wird keine Fehlermeldung ausgegeben. Im Ablauf werden die Childs nicht innerhalb des Hauptfensters angezeigt und können auch nicht als Childs erkannt werden.
Die angebotene Alternative Multidoc funktioniert nicht (das Demoprogramm stürzt ab).

Also das Fette soll heißen:
Finger weg vom Lazarus, wenn man MDI Childs benutzen möchte.

Übrigens Visual Basic unterstützt MDI Childs!


Nun es gibt einige Indizien, z.B. der Satz (auf irgendeiner der MSDN Seiten bezüglich MDI): Seit Windows 95 findet man fast ausschließlich SDI Anwendungen, da Windows mittlerweile Dokumentzentriert ist. (Paraphrasiert, ich kenne den original Satz nicht auswendig)
Oder die Tatsache das für MDI seit Windows 95 keine neuen Features kamen, sondern jedwede Entwicklung nur zur Kompatiblitätserhaltung war.
Aber das stärkste Indiz ist mMn das Microsoft in WPF nicht mal ansatzweise MDI implementiert haben, und WPF soll unter .Net die Windows Forms fast komplett ersetzen (Windows Forms sollen nur noch in Spezialfällen verwendet werden, z.B. bei sehr geringer Rechenleistung).

Und diese 3 Indizien sprechen mMn dafür das Microsoft MDI am liebsten vergessen würde.

Außerdem, Delphi 7 ist nicht grade das beste Beispiel für State of the Art Entwicklung

jc99
Beiträge: 29
Registriert: Fr 19. Mai 2017, 18:04
OS, Lazarus, FPC: Win10x64, L 1.8rc3, FPC3.0.2
CPU-Target: 64
Wohnort: Nord-Baden
Kontaktdaten:

Re: Öffnen von MDI Child Fenster

Beitrag von jc99 »

Warf hat geschrieben:Außerdem, Delphi 7 ist nicht grade das beste Beispiel für State of the Art Entwicklung

Da hast Du recht Delphi 7 ist definitiv nicht State of the Art, eine deutlich bessere IDE bietet die Delphi XE - Serie (kann MDI), Eclipse sieht auch nach MDI aus, Visual Studio ebenfalls MDI (zumindest im Hintergrund) um nur ein paar zu nennen.
Ich seh MDI in allen "modernen" Programmen (ausser GIMP)
OS: ...-Win10 x64
Laz: ...-1.8rc1
https://github.com/joecare99/public
'~| . . /'' . .
,_|oe \_,are

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Öffnen von MDI Child Fenster

Beitrag von Warf »

jc99 hat geschrieben:
Warf hat geschrieben:Außerdem, Delphi 7 ist nicht grade das beste Beispiel für State of the Art Entwicklung

Da hast Du recht Delphi 7 ist definitiv nicht State of the Art, eine deutlich bessere IDE bietet die Delphi XE - Serie (kann MDI), Eclipse sieht auch nach MDI aus, Visual Studio ebenfalls MDI (zumindest im Hintergrund) um nur ein paar zu nennen.
Ich seh MDI in allen "modernen" Programmen (ausser GIMP)


Ob Delphi XE wirklich besser ist sei mal dahingestellt (Langsam, crasht regelmäßig), aber das eine IDE dessen Developer community zur Großen Teilen aus der Ära von MDI stammt MDI unterstützt ist nicht verwunderlich. Eclipse ist in Java geschrieben, und damit verwendet es keine Windows Forms, sondern eine unabhängiges von Java selbstgerendertes GUI, weshalb das mit Microsofts WindowsForms MDI nichts zu tun hat. Und das Visual Studio MDI verwendet wage ich stark zu bezweifeln, da zumindest die neueren Versionen von VS (>2012) mit WPF als GUI Framework geschrieben wurde, was wie bereits erwähnt, kein MDI unterstützt (außer mit extrernen Frameworks, welche eigentlich nur selbst gezeichnete Containerkomponenten verwenden, aber kein echtes MDI).

Was mittlerweile viel verwendet wird ist TDI (Tabbed Document Interface), bei dem die Funktionalität von MDI verwendet wird um Forms auf andere Controls zu schieben (hauptsächlich Tabs). Das hat den Vorteil das man Tabs und Fenster Funktionalitäten gleichwertig verwenden kann. Diese Funktionalität wird auch von Microsoft noch verwendet (auch in WPF), aber von dem Klassischen MDI (Also tatsächlich richtige Fenster mit Boarder, Movable, etc) stirbt (mMn zurecht) aus.
Also treffender wäre, es werden Teile von MDI verwendet um neue Technologien (wie TDI) zu realisieren, klassisches MDI ist aber mehr oder weniger tot, und nur noch Teile werden Recycled. Aber wenn ich mir eine Plastiktüte beim Supermarkt hole nenn ich das ja auch nicht Flasche, nur weil es vor dem Recycling mal eine gewesen ist.

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Öffnen von MDI Child Fenster

Beitrag von Timm Thaler »

Warf hat geschrieben:Seit Windows 95 findet man fast ausschließlich SDI Anwendungen, da Windows mittlerweile Dokumentzentriert ist.


Ja leider, war auch für mich der Grund ein großes Projekt von MDI weg auf Einzelfenster umzustellen.

MDI hatte für mich als Programmierer (z.B. Atmel Studio) immer den Vorteil, dass man verschiedene Dateien eines Projektes problemlos nebeneinander anordnen kann, auch schnell mal 4 Fenster in 4 Ecken. Inzwischen ist das ein Krampf, da muss man die Datei nochmal in einem extra Editor aufmachen, oder wie in Lazarus mit Dockingfenstern rummachen, oder bei Firefox mehrere Browser aufmachen. Im OpenOffice bekommt man auch pro Datei ein Fenster, letztens sass ich vor einem Fremdrechner, und der wollte mir partout die beiden Exceldateien nur in einem Fenster zeigen, ging also nicht nebeneinander. Oder der Krampf bei Gimp, 5 Fenster für Menu, Bild, Ebenen, Zeichenwerkzeuge und so offen und das was man braucht ist immer irgendwo verdeckt.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Öffnen von MDI Child Fenster

Beitrag von Mathias »

Es ist schon komisch, das von von den genialsten Sachen weg kommt. MDI war bei Win3.x die Highlight.
Wie du schon schreibst, man kann mehrere Fenster auf machen, aber dann ist das Ganze Menu und auch die Symbol-leiste, etc. mehrfach vorhanden. :evil:
Gut die Monitore werden immer grösser, aber ob das der Sinn der Sache ist. :roll:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten