Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Erstellen einer MDI Anwendung (https://www.delphipraxis.net/6166-erstellen-einer-mdi-anwendung.html)

DBman 1. Jul 2003 21:03


Erstellen einer MDI Anwendung
 
Hallo , ich möchte eine MDI Anwendung erstellen
(Also ein Hauptformular mit Menü und Toolbar und dann dadrin Fenster)

Wenn ich auf der Toolbar einen Punkt auswähle soll sich das entsprechende Fenster öffnen , und wenn ich das Fenster schließe soll es nicht mehr sichtbar sein...
Nur leider geht diese Visible=false eigenschaft bei MDI-Child fenstern ja nicht...

Wie macht man sowas denn vernünftig?
Hab mir nur mal sone professionelle MDIapplication angeguckt und da is viel mit Vererbung hantiert worden , sah für mich auf den ersten blick etwas komplexer aus , aber geht anscheinend nur so..
vielleicht kann mir ja mal jemand kurz erklären wie man die MDIchild fenster denn professionell erscheinen und verschwinden lässt :freak:
Wäre cool :nerd:

flomei 1. Jul 2003 21:06

Vielleicht mit
Delphi-Quellcode:
MDIChild.Create;
und
Delphi-Quellcode:
MDIChild.Close;
MDIChild.Destroy;
Oder so ähnlich... :roll:

MfG Florian :hi:

DBman 1. Jul 2003 21:30

So ähnlich eher..... Ne in die Richtung hatte ich auch gedacht.
Aber was du da sagst funktioniert SO bestimmt nich...

Hm kann mir denn da keiner helfen?
Naja vielleicht morgen. :roll:

flomei 1. Jul 2003 21:39

Naja war auch geraten... :roll:

Mein (schlaues) Delphi-Buch meint folgendes:
Zitat:

Create - ...erzeugt eine Formularinstanz (Konstruktor) und löst OnCreate Ereignis aus.

Destroy - ...entfernt die Formularinstanz (Destruktor) und löst OnDestroy Ereignis aus.

Close - ...ruft CloseQuery auf und schließt das Formular, wobei OnClose Ereignis ausgelöst wird.
Aus: Delphi 6 Grundlagen und Profiwissen

Da stehen noch ein paar andere Befehle drin. Kann ich dir ja vielleicht morgen oder so per PN schicken wenn es dir hilft.

MfG Florian :hi:

Daniel B 1. Jul 2003 21:43

Hallo,
Zitat:

Zitat von flomei
Naja war auch geraten... :roll:
Mein (schlaues) Delphi-Buch meint folgendes:
Da stehen noch ein paar andere Befehle drin. Kann ich dir ja vielleicht morgen oder so per PN schicken wenn es dir hilft.

Ich hab Dir von anfang an gesagt, mit dem Buch kommst Du nicht weiter! *kopfschüttel*
Wiedem auch sei, beim Create, Destroy usw., brauchst Du einen Index!
MDIChildren[0].Create();
Zudem hast Du das Show vergessen, nur Createn wird Dir nichts bringen.
MDIChildren[0].Show;

Grüsse, Daniel :hi:

flomei 1. Jul 2003 21:52

Zitat:

Zitat von Daniel B
Ich hab Dir von anfang an gesagt, mit dem Buch kommst Du nicht weiter! *kopfschüttel*

Ist manchmal aber doch ganz praktisch... :D

Zitat:

Zitat von Daniel B
Wiedem auch sei, beim Create, Destroy usw., brauchst Du einen Index!
MDIChildren[0].Create();
MDIChildren[0].Show;

:oops: Hab ich wohl überblättert. :mrgreen:

Zitat:

Zitat von Daniel B
Zudem hast Du das Show vergessen, nur Createn wird Dir nichts bringen.

:???: Darauf hätte man vielleicht auch so noch kommen können ;)

Zitat:

Zitat von DBMan
und wenn ich das Fenster schließe soll es nicht mehr sichtbar sein...
Nur leider geht diese Visible=false eigenschaft bei MDI-Child fenstern ja nicht...

Aus meinem absolut nutzlosen Delphi-Buch: ;)
Zitat:

Hide - ...versteckt das Formular (Visible = False).
Show - ...setzt Visible = True und zeigt das Formular im Vordergrund an.
:P Daniel vielleicht doch nicht ganz so schlecht... ;)

MfG Florian :hi:

Marco Haffner 1. Jul 2003 21:55

Zum schließen mußt Du im MDI-Kindfenster die Action-Eigenschaft des OnClose-Ereignisses setzen.
Delphi-Quellcode:
procedure TFormMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  { Action := caNone;
    Das Formular darf nicht geschlossen werden, daher geschieht nichts.

    Action := caHide;
    Das Formular wird nicht geschlossen, sondern lediglich verborgen.
    Die Anwendung kann nach wie vor auf das Formular zugreifen.

    Action := caFree;
    Das Formular wird geschlossen und sein Speicher freigegeben.

    Action := caMinimize;
    Das Formular wird nicht geschlossen, sondern als Symbol angezeigt. }

  Action := caFree;
end;

DBman 2. Jul 2003 09:43

Ihr habt mir schon beachtlich weitergeholfen. :lol:
Mit dem .Hide geht das aber trotzdem nich , dann kommt die Fehlermeldung , dass man MDIKindformulare nicht verstecken kann.

Habe dennoch nochmal eine Frage:

Wie mache ich dass denn jetzt dass ich am Anfang , also quasi beim FormCreate des Hauptformulars das MDIKindFenster gar nicht sehe..
Weil das ist ja automatisch beim Start sichtbar...
?

:|

DBman 2. Jul 2003 09:44

und noch was...
 
und noch was...
Der Befehl :

Delphi-Quellcode:
MDIChildren[0].Create;
funktioniert so nicht , der erwartet da mehr Paramter , aber was soll ich denn da übergeben? Habs schon mit Application probiert aber das wird nur Mist... :angle:

DBman 2. Jul 2003 10:28

Mit Self funktioniert das.

Aber wie kann ich das denn machen dass ich jedes Formular nur einmal erzeugen kann? Das is doch total der Schwachsinn eigentlich dass man ein Formular beliebig oft mal öffnen kann.(zumindest bei den meisten Anwendungen) ?

Also ich find diese mdi anwendungen irgendwie ziemlich umständlich :freak:

Christian Seehase 2. Jul 2003 12:10

Moin DBman,

Zitat:

Zitat von DBman
Wie mache ich dass denn jetzt dass ich am Anfang , also quasi beim FormCreate des Hauptformulars das MDIKindFenster gar nicht sehe..

In der Projektdatei die Zeile mit dem Erzeugen des MDI Child Formulares löschen.

Zitat:

Zitat von DMman
Aber wie kann ich das denn machen dass ich jedes Formular nur einmal erzeugen kann?

Das könntest Du mit einem Flag je Formulartyp (ggf. auch ein array, wenn's viele sind) erledigen. Flag gesetzt Formular wurde schon erzeugt, darf nicht mehr.

Zitat:

Zitat von DBman
Das is doch total der Schwachsinn eigentlich dass man ein Formular beliebig oft mal öffnen kann.(zumindest bei den meisten Anwendungen) ?

:shock:

Das MDI für Multiple Document Interface steht ist Dir aber bekannt? ;-)
Bei solchen Anwendungen ist es nun einmal der Witz, dass man für eine, mehr oder weniger, beliebige Anzahl von Dokumenten, eine ebenso grosse Anzahl, ansonsten gleicher, Fenster öffnen kann.

flomei 2. Jul 2003 13:17

Zitat:

Zitat von Christian Seehase
Bei solchen Anwendungen ist es nun einmal der Witz, dass man für eine, mehr oder weniger, beliebige Anzahl von Dokumenten, eine ebenso grosse Anzahl, ansonsten gleicher, Fenster öffnen kann.

...Word, Excel, Powerpoint, Photoshop, net.Demon, mIRC um nur ein paar zu nennen die sich auf meiner Festplatte befinden. :D

MfG Florian :hi:

bixi400 2. Jul 2003 13:27

Wenn das MDIChild Form2 Heißt:

Delphi-Quellcode:
TForm2.Create(Self);
:wink:

Alexander 2. Jul 2003 13:52

Ich weiß nicht, ob es schon gepostet worden ist. Aber bei Delphi liegt eine einfache Demo eines MDI-Editors bei. sollte dir helfen.

DBman 2. Jul 2003 15:58

Ja dass MDI für MultiDocumentInterface steht weiss ich auch..
Nur ich weiss halt nich ob das für meine Zwecke so toll ist...

Ich habe ja nich sone Anwendung á la Word wo man ein Hauptfenster hat und dann da beliebig viele Dokumente öffnen will , ich will eine Anwendung wo ich ein Hauptfenster habe mit Menü und Toolbar und dann im Menü mir die Programmteile auswählen kann (z.b.) Adressverwaltung und das jeweilige Fenster dann auch nur 1x erscheint , wäre ja quatsch wenn da 2 adressverwaltungen sind...

Ich dachte das geht halt n bissel einfacher.
Aber kann man ja eigentlich nur mit MDIform und MDIchild machen , anders wird das einfach unübersichtlich wenn man da nur "normale" formulare nimmt..

sakura 2. Jul 2003 16:04

Hi,

sorry - aber den Rest habe ich nicht gelesen. Aber ich wollte nur mal auf das doch recht einfache, aber gute Delphi-Beispiel zum Thema MDI hinweisen. Das befindet sich im Verzeichnis $(Delphi)\Demos\Doc\TextEdit. Vielleicht hilft es ja.

...:cat:...

Alexander 2. Jul 2003 16:21

siehe mein Posting ;-)

sakura 2. Jul 2003 16:25

Zitat:

Zitat von alexander
siehe mein Posting ;-)

Wie gesagt, ich hatte es nicht durchgelesen ;-) Aber immerhin habe ich den genauen Pfad angegeben :-D

...:cat:...

Alexander 2. Jul 2003 16:38

stimmt. War ja auch nicht böse gemeint ;-)
Wie gesagt doppelt hält besser :mrgreen:

DBman 2. Jul 2003 19:01

Ja aber wie gesagt , das was ich machen will ist keine Anwendung , wo ich beliebig viele Textfenster öffnen kann , sondern ich will ganz einfach ein Hauptformular haben von dem aus ich dann meine Menüpunkte anwählen kann und sich jeweils ein und NUR ein Fenster davon öffnet...habe schon nach Flags und so geschaut , aber habs noch nicht hinbekommen.
Deswegen das Beispiel hatte ich mir auch schon angeschaut aber hat mir nicht wirklich viel gebracht :?

sakura 2. Jul 2003 21:06

Folgender Code-Auschnitt sollte verdeutlichen, wie Du überprüfst, ob ein bestimmtes Formular bereits existiert. Wenn es existiert, wird es nach vorn gebracht, wenn nicht, dann wird es erstellt.
Delphi-Quellcode:
procedure TForm1.mniShowFormTyp1(Sender: TObject);
var
  I: Integer
begin
  for I := 0 to Pred(MDIChildCount) do
    if MDIChildren[I] is TMDIFormTyp1 then
    begin
      MDIChildren[I].BringToFront;
      Exit;
    end;
  TMDIFormTyp1.Create(Self);
end;
Ich hoffe, daß es Dir weiterhilft.

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz