Wie erstelle ich ein TabControl?



  • Hi,

    ich möchte dynamisch ein TabControl erstellen. Zunächst möchte ich erwähnen dass ich die Suche schon verwendet habe und auch fündig geworden bin, leider funktionieren die gefundenen Wege bei mir nicht.

    Zunächst wollte ich das mit PropertySheet und PropertyPage machen, aber sobald ich eine dieser beiden Klassen in meiner Anwendung verwende, wird beim Programmstart ausgegeben, dass "eine Ressource nicht vorhanden ist".

    Das mit dem Normalen TabControl habe ich so verstanden: Das Contorl selbst beinhaltet keine Seiten oder Dialoge sondern löst nur ein Event aus wodurch man dann die gewünschte Seite anzeigen muss.

    Wie ich die Events abfange, habe ich verstanden, aber wie erzeuge ich die einzelnen Fenster und assoziiere diese mit dem Tab-Control. Das hab ich noch nicht ganz raus.

    Vielleicht kann mir ja jemand auf die Sprünge helfen.

    Lg Kerberos





  • Hi Flockig,

    vielen Dank für deine Antwort!

    Leider funktioniert das bei mir nicht ganz und ich weiss nicht was ich falsch mache?

    Meine Vorgehensweise:

    1. Da ich meine Tabs dynamisch gestallten möchte habe ich mit der Assistenten ein Template-Dialog erstellt. In diesem Dialog habe ich lediglich folgendes verändert:
    - Border: None
    - Style: Child
    Daraus habe ich eine Klasse erstellt (CTabDialogs)

    2. In meinem GuiView (CFormView) habe ich zum Testen zwei Member der Klasse CTabDialogs im Header deklariert. Des Weiteren habe ich auf der GuiView mit dem GUI-Editor ein CTabCtrl erstellt (m_TabControl).

    3. In der OnInitialUpdate Mehtode der Klasse GuiView wollte eigentlich die Dialoge erstellen und zum TabControl hinzufügen.

    m_TabControl.InsertItem(0, "Seite 1");
    m_TabControl.InsertItem(1, "Seite 2");
    
    m_Page1.Create(1505, &m_TabControl);
    m_Page2.Create(1506, &m_TabControl);
    

    Und an dieser Stelle bekomm ich eine Fehlermeldung "Debug Assertion failed ..."

    Was mache ich falsch?

    Lg Kerberos



  • Du musst für jede neue Registerseite in deinem TabCtrl eine eigene Klasse definieren!

    Das Tutorial ist wirklich straight-forward, einfach aufmerksam lesen und genauso umsetzen!



  • Aber wenn für jedes Tab eine eigene Klasse definieren muss, dann kann ich garnicht dynamisch meine Seiten generieren.

    Also was ich damit sagen will, ist das es nicht möglich wäre eine Anwendung mit beliebig vielen Tabs zu schreiben?

    Lg Kerberos



  • Doch, natürlich kannst du auch beliebig viele Registerseiten als Instanz von einer Klasse erzeugen. Ist aber für den Einstieg vielleicht etwas viel. Setz doch mal das Tutorial um und versuch es dann auf deine Bedürfnisse hin anzupassen



  • Hi,

    ich hab das Tutorial durchgelesen und die Beispiele in meinen Source-Code übernommen -> der gleiche Fehler 😞
    Sobald ich die Initialisieren()-Methode aus dem Beispiel aufrufe kracht es.

    Woran kann das liegen?

    Ich probiere es jetzt nochmal an nem neuen ("leeren") Projekt und schau ob es da geht.

    Lg Kerberos



  • Hi,

    ich hab jetzt rausgefunden wo der Fehler liegt, wie man ihn behebt allerdings noch nicht 😞

    void CMyTabCtrl::Initialisierung()
    {
            m_aktuelleSeite=0;
            m_tabellenSeite[0]->Create(IDD_SEITE1, this);
            m_tabellenSeite[1]->Create(IDD_SEITE2, this);
            m_tabellenSeite[0]->ShowWindow(SW_SHOW);
            m_tabellenSeite[1]->ShowWindow(SW_HIDE);
    
            SetRec();
    }
    

    Wenn ich meine Seiten dynamisch erstelle muss ich ja auch dynamisch eine ID verteilen. Daran scheitert es:

    m_tabellenSeite[0]->Create(IDD_SEITE1, this);
    

    Wenn ich den Dialog vorher im Ressourcen-Editor erstellt habe, dann wir ja automatisch in der Resource.h eine ID reserviert z. B. IDD_SEITE1. Gebe ich diese ID an, funktioniert es tadellos. Gebe ich jeoch beispielsweise folgenden Code an:

    m_tabellenSeite[0]->Create(1500, this);
    

    bekomme ich die Fehlermeldung.

    Das Problem ist nun dass ein Dialog ein Dialog-Box-Template benörtigt (ID oder Name):

    lpszTemplateName
    Contains a null-terminated string that is the name of a dialog-box template resource.

    nIDTemplate
    Contains the ID number of a dialog-box template resource.

    Wenn ich nun meine Seiten dynamisch gestalten will, kann ich ja nicht für jede Seite ein Template erstellen?

    Wie muss ich vorgehen, wenn ich das ohne ein Template lösen will? Muss ich dann den Standard-Konstruktor der CDialog Klasse verwenden -> aber wie setze ich dann die Eigenschaften Style, Border, ...?

    LG KERBEROS

    Lg Kerberos



  • warum willst du neue ids verwenden?
    du kannst doch von einer id, mehrere seiten einfügen, die dann natürlich alle gleich aussehen



  • Hi,

    erstmal Danke für Deine Antwort!

    Sorry dass ich erst so spät antworte, hab nicht gesehen dass es neue Beiträge gibt.

    warum willst du neue ids verwenden?
    du kannst doch von einer id, mehrere seiten einfügen, die dann natürlich alle gleich aussehen

    Ich dachte dass es sich - wie z. B. bei einem CButton - um eine Id für das Control selbst handelt, nicht um die Id für ein Template.

    Lg Kerberos



  • und? hast du es mit der gleich id probiert?

    ich denke es müsste gehen.


Anmelden zum Antworten