Announcement

Collapse
No announcement yet.

Mehrere gleiche Frames dynamisch erzeugen ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mehrere gleiche Frames dynamisch erzeugen ?

    hallo leute,

    ich arbeite an einem Form, das eine PageControl enthält. Die TabSheets sind alle gleich und enthalten alle <br>
    den gleichen, vorher entworfenen Frame mit Kontrollelementen. Je nach Situation kann die Anzahl dieser TabSheets <br>
    unterschiedlich sein. Deshalb möchte ich TabSheets wie auch die Frames dynamisch erzeugen.<br>
    Das Funktioniert aber nur bei dem ersten! beim nächsten kommt wärend der Laufzeit der Fehler<br>
    "Eine komponente mit dem Namen FrameBlaBla existiert bereits."

    Meine Vermutung lautet folgendermassen:<br>
    Wenn ich ein Form mit dem Designer entwerfe, werden Informationen in die *.dfm eingetragen. Plaziere<br>
    ich bspw. 2 FrameBlaBla dann kriegen die automatisch den Objektnamen FrameBlaBLa1 und FrameBlaBla2, wenn <br>
    in der Frameklasse als "Name" FrameBlaBla angegeben war.<br>
    Bei dynamischem Erzeugen mit <B>new</B> findet in der "dynamischen *.dfm" (ich weiss nicht, wie ich es sonst nennen soll, <br> offenbar keine solche automatische Namesvergabe statt. Deswegen kommt es beim zweiten <B>new</B> offenbar<br> zur Kollision. <br>

    Ich suche jetzt nach einem Trick! Oder muss ich wirklich die Maximal möglie Anzahl der Frames per Hand draufsetzen und <br>
    verstecken und wärend der Laufzeit die benötigten plazieren und anzeigen?.

    Wer hat eine Idee?<br>

    Gruss Joachim<br>

  • #2
    Hallo Joachim!

    Ich habe haargenau das gleiche Problem. Aber: muß man den TabSheets eigentlich unbedingt einen Namen geben? Ich meine, die TabSheets müssen doch bei jedem Start der Anwendung neu erzeugt werden. Kann mich zwar irren, aber das könnte auch ohne Name gehen. (Sollte ich Unsinn verzapft haben, lasse ich mich gerne belehren)

    Gruß Irmgar

    Comment


    • #3
      In diesem Beispiel wird ein TPageControl-Objekt dynamisch erstellt und mit einer Reihe von Registerkarten gefüllt.

      #include <Comctrls.hpp>

      TPageControl* ppc;

      TTabSheet* pts[MAXTABS];

      const char * ppcTabTitles[] =
      { "Kunden", "Aufträge", "Posten", "Bestellnummern" };

      int iTabTitles = sizeof(ppcTabTitles)/sizeof(ppcTabTitles[0]);

      void __fastcall TForm1::FormCreate(TObject *Sender)

      {
      ppc = new TPageControl(this);

      ppc->Parent = this;

      ppc->Align = alClient;

      for (int i=0;i<iTabTitles;i++)

      {
      pts[i] = new TTabSheet(this);

      pts[i]->PageControl = ppc;

      pts[i]->Name = AnsiString("pts") + ppcTabTitles[i];

      pts[i]->Caption = ppcTabTitles[i];

      }

      }

      void __fastcall TForm1::FormDestroy(TObject *Sender)

      {
      for (int i=0;i<iTabTitles;i++)

      delete pts[i];

      delete ppc;

      Christian

      Comment


      • #4
        hallo, Christian und Irmgard,<br>
        <br>
        Das mit der PageControl und den dynamischen tabSheets Funktioniert. <br>Ich mach es so wie Christian oben. Das Problem sind aber, die Frames, die ich dynamisch darauf setzen will.<br>

        Auf meinem ersten Tabsheet, das immer da ist, sitzen mehrere, per Hand <br>plazierte FramesLaserSlider. Auf den weiteren Tabsheet sollen nun <br>dynamisch jeweils ein grosser Frame (frameGauge genannt), der das <br>ganze Tabsheet ausfüllt draufgesetzt werden. FrameGauge enthält <br>aber auch einen FrameLaserSlider. Dieser scheint bei der dyn. <br>erzeugung mit new mit den bereitz vorhandenen zu kollidiern. <br>
        Es handelt sich nicht um einen Fehler beim compilieren! Sonder er weid <br>beim erzeugen der Objekte ausgeworfen.<br>

        Gruss Joachi

        Comment


        • #5
          Hi,

          ich denke du irrst dich nicht! Sie dir nur den Code von Christian an!

          Gruss, Joachi

          Comment


          • #6
            Hallo Joachim,
            Hallo Christian,

            bei mir funktioniert das nicht. Ich bekomme eine Zugriffsverletzung an Adresse FFF... oder so ähnlich und es wird die Zeile mit dem Namen angezeigt

            pts[i]->Name = AnsiString("pts") + ppcTabTitles[i];

            Ein Name wird doch eigentlich nur vergeben, um die Komponente im PROJEKT abzuspeichern - oder nicht??

            Gruß Irmgar

            Comment


            • #7
              Ein Name wird doch eigentlich nur vergeben, um die Komponente im PROJEKT abzuspeichern - oder nicht??

              Nein, jede Komponente braucht immer einen Namen. Jedenfalls nach Borlands-Hinweise
              Christian

              Comment

              Working...
              X