Eine einzelne Pages im TPageControl sperren



  • Hallo,

    ich möchte in einem TPageControl (frm1_tabReiter) die erste
    Pages 'Liste' (frm1_tabListe) nur sperren, nicht ausblenden,
    was mit

    frm1_tabReiter->Pages[0]->TabVisible=!o1;
    

    auch einwandfrei funktioniert.

    Ich möchte aber den Reiter sichtbar lassen; aber eben nicht auswählbar.
    Mit diesen Einstellungen klappt es überhaupt nicht:

    frm1_tabReiter->Pages[0]->PageControl->Enabled=false;  // hier sperrt er das gesamte  Control, also alle Pages!?
     frm1_tabReiter->Pages[0]->Enabled=false;               // das sollte doch eigentlich gehen... 
     frm1_tabListe->Enabled=false;                          // und das eigentlich auch.. grübel?
    

    Wo ist mein Denkfehler? 😞

    MfG Stefan Scholz



  • wenn du nicht willst das das Tab ausgewählt wird schau dir mal das Ereignis OnChanging von TPageControl an,
    falls du allerdings nur alle Elemente auf dem PageControl nicht auswählbar/änderbar machen willst bietet sich ein Panel an auf dem du alle Elemente plazierst und dann Enabled auf true oder false setzt



  • @Linnea

    Danke die Antwort; aber mich würde interessieren,
    warum die Enableds nicht funktionieren!? Mit
    OnChanging usw. klar, machbar. Aber es würde den
    Pages-Reiter selbst auch nicht gesperrt darstellen
    (also die Beschriftung 'Liste' in grau).

    Gruss Stefan Scholz



  • Beschriftung selber zeichnen!?

    Allerdings wird es wohl einen Grund geben, dass sich der Tab nicht "visuell disablen" lässt: es verstösst wahrscheinlich gegen etablierte GUI-Richtlinien.
    Ich habe jedenfalls noch kein Programm mit einem derartigen Feature gesehen.



  • @Jansen

    Warum bietet die Komponente dann verschiedene Enabled-Funktionen an?
    Bei

    frm1_tabReiter->Pages[0]->PageControl->Enabled=false;
    

    macht er ja was; sperrt aber unsinnigerweise das TPageControl
    komplett, obwohl der Bezug vorher mit Pages[0] eigentlich
    nur für den 1. Reiter gelten dürfte...

    Das selbst zeichnen, abfangen mit OnChanging usw. ist zwar
    kein zu grosses Problem, aber lästiger Zusatzcode ohne echten
    Nutzen... grummel...

    Danke für Eure Antworten..
    MfG Stefan Scholz



  • frm1_tabReiter->Pages[0]->PageControl ist eine Art zirkulärer Bezug. Die PageControl-Property von TTabSheet zeigt auf das Eltern-PageControl, in deinem Fall also auf frm1_tabReiter. Ein einzelnes Sheet dis/enablest du mit Pages[x]->Enabled.

    Stefan7124 schrieb:

    ohne echten Nutzen...

    Wenn du das selber einsiehst, warum versteifst du dich dann auf die Funktionalität? 😉

    TTabSheet ist ein passiver Container, der nicht visuell auf Benutzereingaben reagiert, vergleichbar z.B. mit TGroupBox. Deshalb muss beim Disablen auch nichts ausgegraut werden.
    Im Gegensatz dazu muss z.B. bei einer deaktivierten CheckBox dem Benutzer sichtbar klargemacht werden, dass ein Anklicken nichts bringen wird, sonst würde er einen Programmfehler vermuten.



  • Hallo,

    habe die Reiter jetzt grau, wenn ich sie disable.

    Allerdings habe ich ein Problem mit der OnChanging Funktion!

    Mit AllowChange=false kann ich das wechseln ja blocken;
    leider gibt mit das TPageControl aber in allen Funktionen
    immer nur den aktiven Reiter wieder (also mit TabIndex;
    ActivePageIndex usw.) Ich brauche aber für die Abfrage, ob
    der Reiter (=Pages[x]) Enabled/Disabled ist, den Reiter, der vom
    Benutzer gerade angeklickt wurde. Der einzige Beitrag hier im Forum
    bezieht sich zwar im Endeffekt auf das gleiche Problem, verweist aber
    auch "nur" auf das OnChanging Problem...

    Wie bekomme ich also die Pages/Index raus vom angeklickten Reiter???

    😕

    Grüsse, Stefan



  • Dann nimm doch OnChange statt OnChanging. Dann stimmt auch der TabIndex. OnChanging wird ja aufgerufen bevor der neue Reiter gewählt wird. Das Ereignis kann also gar nicht wissen was danach kommt.



  • @Braun

    Aber im ChangeEreigniss ist der Reiter bereits ausgewählt und
    es gibt keine AllowChange=false Übrigens macht dann das OnChanging
    Ereigniss ja keinen Sinn. Oder stehe ich mittlerweile komplett auf
    dem Schlauch?

    MfG Stefan



  • Du kannst dir z.B. beim Ereignis OnChanging merken welches das letzte verwendete Tab war und dann im Ereignis OnChange das neu ausgewählte Tab abfragen (TabIndex) und dann nach deinen Bedingungen entweder den ActivePageIndex lassen oder falls diese Tab nicht angezeigt werden soll den ActivePageIndex neu setzen

    [Edit] in der BCB-Hilfe zu OnChanging steht übrigends wozu es gut ist...



  • Wenn du verhindern willst, ein Tab auszuwählen, setze doch gleich dort Visible auf false. Dann ist es gar nicht erst sichtbar. Mich als Nutzer würde das sehr irritieren, wenn ein Tab sichtbar ist, ich ihn aber nicht anwählen kann.



  • Hallo,
    Danke für alle Tips und Hinweise.

    Habe es jetzt so gelöst; finde es nicht sehr elegant, aber gut..

    void __fastcall TForm1::frm1_tabReiterChanging(TObject *Sender,  bool &AllowChange)
    {frm1_tabReiter->Tag=frm1_tabReiter->ActivePageIndex;                           // akt. Index merken für frm1_tabReiterChange()
    }
    void __fastcall TForm1::frm1_tabReiterChange(TObject *Sender)
    {Integer i2,iTag;                                                               // Vars definieren
    
     i2=frm1_tabReiter->ActivePageIndex;                                            // aktuelle Seite Index?
     if(frm1_tabReiter->Pages[i2]->Enabled==false) {                                // ist gesperrt
      iTag=frm1_tabReiter->Tag;                                                     // letzter aktiver Reiter
      frm1_tabReiter->Pages[iTag]->Show();                                          // und diesen wieder aktivieren
     }                                                                              // ende if(frm1_
    }
    

    Grüsse, Stefan


Anmelden zum Antworten