TabControl erzeugen



  • Ellek schrieb:

    devil81 schrieb:

    Ansonsten liefert GetTab nur einen Zeiger auf CDialog zurück,
    du Müsstest also evtl. noch auf deine spezielle Klasse casten.

    Ich hab ehrlich gesagt keine Ahnung, was du damit meinst. 😕

    Das Problem ist folgendes:

    Ich habe mehrere Kerteireiter auf denen verschiedene Einstellungmöglichkeiten zu machen sind (zu jeder Kategorie ein Tab). Nun nöchte ich alle Einstellungen mit einem Button auf dem Hauptdialog speichern.

    Die Informationen etc. über die Steuerelemente liegen ja in den Instanzen deiner Klassen.
    DynTabCtrl speichert aber nur CDialog* Pointer, da die Klasse ja alle Dialoge darstellen
    soll, und nicht nur die eines typs, d.h. du musst dann den Pointer noch
    in die richtige Klasse casten. Dafür musst du wissen, welche Klasse auf welchem
    Tab liegt.

    ((CMyDlg*)m_tabctrl.GetTab(0))->*zugriff auf membervars oder funktionen*

    Devil



  • Hallo,

    Ich habe auch mal deine Klasse zum testen verwendet, allerdings musste ich das hier ändern, damit ich Zugriff auf die einzelnen Tab-Dialoge hatte:

    Aus

    CDialog* DynTabCtrl::GetTab(int itab)
    {
    	if(m_tabs.size() < itab && itab > -1)
    		return m_tabs[itab];
    	return NULL;
    }
    

    muss

    CDialog* DynTabCtrl::GetTab(int itab)
    {
    	if(m_tabs.size() > itab && itab > -1)
    		return m_tabs[itab];
    	return NULL;
    }
    

    werden, sonst bekommt man immer NULL anstatt des Pointers auf einen Dialog zurückgeliefert (die Nummer des Tab-Dialogs kann nicht größer als die größe des Vektors sein 😉 )

    nur so als Anmerkung...



  • Danke für den Fehlerhinweis, war mir garnicht aufgefallen...

    Ich hab die Klasse nochmals überarbeitet, es ist jetzt möglich
    die einzelnen Tabs zu löschen, entweder ein beliebiges Tab,
    oder nur das was gerade den Focus hat. Standardmässig ist
    das jedoch abgeschaltet, mann muss es entweder im Konstruktor
    aktivieren, oder DynTabCtrl::SetDeleteTab(true) aufrufen.

    Devil



  • Also eine gaaanz dumme frage:

    wie kann ich machen, dass, wenn ich einen button drücke, ein tab entfernt wird?!
    bitte genauste anleitung, da noob am werk 😉



  • Du must nur die Nummer des Tabs welches du löschen willst wissen,
    und dann einfach DeleteItem(nummer) aufrufen.

    In der Neusten Version ist es aber auch so implementiert
    das man sie über Rechtsklick schliessen kann. Schaus dir einfach an.

    Devil



  • Und was mache ich, wenn ich bereits einen kompletten Dialog fertig habe und diesen nun in eine Registerkarte einfügen möchte? Sprich: Wie bekomme ich all´ die Ressourcen in das neue Projekt, so dass auch alle Funktionen noch einwandfrei laufen?

    Gruß,
    Holger



  • Den Dialog müsstest du importieren können, oder Copy & Paste müsste auch funktionieren,
    wenn du beide Projekte offen hast.
    Dann musst du noch die entsprechenden Dateien für die Dialogklasse dem Projekt hinzufügen.

    Der Dialog muss dann noch in den Resourcen so eingestellt sein, das er keinen Rand
    hat, und untergeordnet ist.

    Devil



  • Hallo devil81!
    Ich habe eine frage zu deinem Anleitung!
    Zu punkt 3: In welcher Klasse muss ich die Membervariable erstellen?



  • Im Dialog wo das TabCtrl liegt.



  • Hallo zusammen,

    finde die Klasse auch ganz praktisch!

    Nur leider stehe ich an:

    Ich möchte die Tabs vom Programm her ansteuern. Das heisst soviel wie, ich befinde mich gerade in einem Tab und möchte beim anklicken eines bestimmten Buttons direkt in ein anderes Tab wechseln...

    hab bisher leider nichts rausbekommen, bin für gute Ratschläge offen.

    Gruss



  • Da ist mir gerade noch was aufgefallen:

    Wenn man mit den Pfeiltasten die Tabs auswählt, wechselt der Dialog nicht...



  • aCCa schrieb:

    Da ist mir gerade noch was aufgefallen:

    Wenn man mit den Pfeiltasten die Tabs auswählt, wechselt der Dialog nicht...

    Würde mich auch interessieren wie man den Dialog-Wechsel durch die Pfeiltasten realisiert



  • normal sollte sowas mit [strg]+[tab] gehen.. zumindest bei den normalen CTabCtrl... aber sowas sollte man wissen.... depp 😉



  • (D)Evil schrieb:

    normal sollte sowas mit [strg]+[tab] gehen.. zumindest bei den normalen CTabCtrl... aber sowas sollte man wissen.... depp 😉

    das checkt johnny nicht so ganz. was meinst du mit [strg]+[tab]? es geht darum die funktionalität hinzuzufügen, dass mit den pfeiltasten zwischen den tabs gwechselt werden kann in (innerhalb des CTabCtrl)!



  • aCCa schrieb:

    Da ist mir gerade noch was aufgefallen:

    Wenn man mit den Pfeiltasten die Tabs auswählt, wechselt der Dialog nicht...

    Weiß jemand wie das geht?



  • Hi
    Ich habe DynTabCtrl in eine SDI -anwendung mit Formview ansicht
    gepackt . Wenn ich diese anwendung schliesse kommen immer die Meldungen:

    Freigeben des Tabsheets fehlgeschlagen

    für jedes Tab.

    Wie kann ich diese Tabs freigeben bevor das Fenster geschlossen wird ?

    Danke für die Hilfe



  • phlox81 schrieb:

    1. TabCtrl auf dialog setzen.
    2. Klasse DynTabCtrl in Projekt einbinden.
    3. Membervariable auf TabCtrl erstellen (entweder direkt DynTabCtrl, oder CTabCtrl und danach im Header mit DynTabCtrl ersetzen)
    4. Mach dir ein paar dialog, welche in den eigenschaften Untergeordnet und randlos sind.
    5. Die Dialogklassen von CDialog ableiten
    6. Den Header der Tab-Dialoge in die Datei des Hauptdialog einbinden(Da wo die TabCtrl ist).
    7. m_dynTabCtrl.InsertItem(new myDialog(), "Lustiger Titel", IDD_DIALOG1) aufrufen,
    um eine Tab hinzuzufügen.

    Bin auch gerade dabei, einen TabControl zu erstellen. Aber ich verstehe Punkt 4 und 5 nicht ganz: Wo erstelle ich einen neuen Dialog? Ausserhalb oder innerhalb meines Projektes? Ich bin eben einfach in der Resource Ansicht / "Dialog" auf "Insert Dialog" gegangen und habe nun ein neues IDD_DIALOG1, welches nun auch randlos und untergeordnet ist. Aber da gibts keine Header-Datei zu und wo muss ich da etwas ableiten? Wenn mir jemand Punkt 4 und 5 näher erläutern könnte, wäre ich sehr dankbar 🙂



  • Innerhalb des Projektes musst du den neuen Dialog machen, hast du also schon richtig gemacht. 🙂

    Und dann tust du das, was du sonst auch machst und erstellst eine Klasse für den Dialog.
    Die soll von CDialog abgeleitet sein, das ist sie aber fast automatisch, da musst du nur im Assistenten gucken, dass er das richtige macht.



  • estartu schrieb:

    Und dann tust du das, was du sonst auch machst und erstellst eine Klasse für den Dialog.

    Genau da verlassen sie mich ja schon, weil ich noch Neuling bin 😉 Es verwirrt mich ja schon, dass in der Datei "myApplicationDlg.cpp" die Klasse CAboutDlg deklariert wird, obwohl doch der Haupt-Dialog die Hauptsache hier ist und nicht diese "Randerscheinung" der About-Box.

    Wie lege ich denn eine neue Klasse an? Datei/Neu/Quelldatei und dann das ganze nochmal für die Header-Datei? Was muss dann darein? Gibts einen Assistenten der das übernimmt?



  • VC6? oder höher?


Anmelden zum Antworten