"unter-formulare" kreieren - wie?



  • super, hat mir sehr geholfen.
    hab noch eine andere frage: was ist die beste möglichkeit ein programm bzw ein soches formular abzuspeichern? ich will alle möglichen änderungen gespeichert haben. muss ich da alles zb in ein txt hineinschreiben und danach wieder auslesen, oder gibt es bequemere varianten?



  • Hallo

    Du must schon selber für Speichern und Laden sorgen. Siehe TStringList/TFileStream...

    bis bald
    akari



  • hab jetzt mal etwas gebastelt:

    void __fastcall TForm1::Neu1Click(TObject *Sender)
    {
      TForm*Form = new TForm(Application);
      Form->Parent = Form1;
      Form->Show();
      Form->FormStyle = fsMDIChild;
      Form->Name = "Neu"+IntToStr(FileName);
      FileName++;
    }
    

    funktioniert bis dahin eigentlich gut, aber jetzt hab ich das problem, dass sich diese formulare nicht schliessen lassen und auch beim maximieren und minimieren passen sie sich nicht ganz an.



  • schau dir mal das Beispiel zu MDI-Anwendungen an, im Menü bei Datei -> Neu -> Andere -> Projekte -> MDI-Anwendung



  • hab ich, aber ich komme mit diesem nicht weiter. geht es auf meine weise nicht?



  • doch geht, wenn man die Fehler rausnimmt und ein OnClose-Event für das MDIChild generiert

    {
    TForm *Form = new TForm(Application);
    Form->FormStyle = fsMDIChild;
    Form->OnClose = FormOnClose;
    }
    
    void __fastcall TForm1::FormOnClose(TObject *Sender, TCloseAction &Action)
    {
    Action = caFree;
    }
    

    natürlich sollte man nicht vergessen die Funktion auch im Header zu definieren

    außerdem ist ein MainMenu oder ToolBar notwendig, um dem MDIChild eine obere Grenze zu geben, da sonst beim Maximieren die Systemmenüicons verschwinden



  • danke erstmal, aber leider kommt jetzt beim schliessen die meldung:
    "Benachrichtigung über Debugger-Exeption: Im Projekt ist eine Exeption der Klasse EAccessViolation aufgetreten. Meldung:'Zugriffsverletzung bei der Adresse... '" und so weiter.
    was hab ich jetzt falsch gemacht?



  • hast du wirklich das "Form->Parent = Form1;" rausgenommen? falls nicht liegt dort der Fehler



  • haste schon wieder recht. ich habs vergessen und jetzt funktionierts. mann, mann, mann...
    ist echt klasse dieses forum

    nun habe ich aber wieder ein problem:
    wie kann ich objekte in unterformularen vom hauptformular aus zur laufzeit erstellen?



  • Leg mal ein bisschen Eigeninitiative an den Tag und schau mal in die FAQ oder die Borlandhilfe.

    Gruss



  • hab jetzt eine ganze weile herumprobiert und stehe jetzt an folgendem punkt:
    wenn ich das erstellen eines formulars und das erstellen eines buttons (in der das eben erstellte formular) in die gleiche funktion nehme funktioniert alles optimal.
    jedoch kann ich jetzt nicht die beiden befehle in zwei verschiedene funktionen nehmen, obwohl ich die neue tform überall deklariert habe. irgendwie spricht der befehl Parent nicht an. kann man den umgehen?



  • Äh, könntest Du das ein klein wenig detailierter Beschreiben? Welcher Befehl? Welche Funktionen?

    Poste am Besten den relvanten Quellcode und eine genaue Fehlerbeschreibung (nicht aka Parent spricht nicht an!?). Was meint der Debugger?



  • also, das ist mein quellcode:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm *Form1;
    TForm *Form2;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Neu1Click(TObject *Sender)
    {
      TForm *Form2 = new TForm(Application);
      Form2->Show();
      Form2->Name = "Form2";
      Form2->FormStyle = fsMDIChild;
      Form2->OnClose = FormOnClose;
      Form2->Position =  poDefault;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormOnClose(TObject *Sender, TCloseAction &Action)
    {
      Action = caFree;         
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ToolButton1Click(TObject *Sender)
    {
      TButton *Button2 = new TButton(Application);    //knopf wird erstellt
      Button2->Parent =  Form2;                      //knopf sollte in form2 angeziegt werden
      Button2->Height = 25;                          //eigenschaften des buttons2
      Button2->Width = 75;
    }
    //---------------------------------------------------------------------------
    

    der debugger meint nichts, eigentlich funktioniert alles prima, eben nur, dass man den button einfach nicht sieht.

    (ich hoffe stresse dich nicht allzu sehr 😉 )



  • Warum wohl wird man den Button nicht sehen? Er ist sozusagen nicht sichtbar, also versteckt; 😉 und was macht man mit versteckten Objekten?

    Schau Dir mal die Eigenschaften und Methoden von TButton in der Hilfe genau an. Da etwas passendes zu finden, sollte kein Problem darstellen.



  • also, ich nehme an, du meinst die eigenschaft Visible. die auf true zu stellen bringt nichts...
    desweiteren wird Button2 nicht als element von form2 erkannt, wenn ich eine eigenschaft von ihm von ändern will in einer anderen funktion, als die erstellende (sorry, habe ich erst jetzt gemerkt). darum meine ich auch, dass der befehl parent nicht richtig anspricht, auch wenn es absurd klingt.



  • weißt du was der Gültigkeitsbereich von Variablen ist?
    denk mal bitte darüber nach was du in Zeile 19 machst und worauf du in Zeile 35 zugreifst
    wo gilt das eine und wo das andere Form2? oder sind beide gleich? order vielleicht doch nicht?



  • soll das heissen meine form2 ist nur lokal? ich hab keine ahnung, wie ich die global machen soll.



  • hast du dir die Seite mal angesehen/durchgelesen/nachvollzogen, die ich verlinkt habe? vor allem das Beispiel ab "var_3.cpp" ist hier interessant

    [Edit] wenn man auf der Seite die Maus auf den rötlichen oder grünen Balken (wo z.B. "var_1: Global" drinsteht) bewegt werden die Gültigkeitsbereiche in den gezeigten Quellcodeabschnitten farblich hinterlegt[/Edit]

    dein Form2 hast du in Zeile 10 schon globalisiert
    was mußt du also in Zeile 19 ändern?



  • super danke, jetzt hab ichs gecheckt.
    habs jetzt so geändert und jetzt funktionierts

    Form2 = new TForm(Application);
    

Anmelden zum Antworten