Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Seiten aus TPageControl entfernen


UweK - Di 05.05.20 16:49
Titel: Seiten aus TPageControl entfernen
Hallo,
Ich erstelle zur Laufzeit mehrere TTabSheet mit verschiedenen Inhalten und füge sie in ein TPageControl ein, das ich schon zur Entwurfszeit im Formular platzierte:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var MyTabSheets: array of TTabSheet;

SetLength(MyTabsheets, 10);
for I:= 0 to 9 do
begin
  TabSheets[I]:= TTabSheet.Create(MyPageControl);
  TTabSheet[I].PageControl:= MyPageControl;
{... irgendwelche verschiedene VCL-Komponenten in jedes TTabSheet setzen mit TTabSheet[I].InsertControl ...}
end;


Jetzt möchte ich mittendrin eins der TTabSheet aus TPageControl wieder eintfernen, so dass die nachfolgenden TTabSheet in der Anzeige von TPageControl aufrücken und TPageControl dann eine Seite weniger anzeigt. Mit z.B.


Delphi-Quelltext
1:
MyPageControl.RemoveControl(MyTabSheets[3])                    


verschwindet aber nur der Inhalt dieses TTabSheet in der Anzeige. An der Stelle verbleibt eine leere Seite, und die Gesamtzahl der Seiten in TPageControl ist immer noch dieselbe. Was geht da schief?

Vielen Dank für Tipps.


Th69 - Di 05.05.20 17:50

Hallo,

lies mal die Beschreibung zu RemoveControl [http://docwiki.embarcadero.com/Libraries/Rio/de/Vcl.Controls.TWinControl.RemoveControl].
Man sollte einfach den Parent setzen, also

Delphi-Quelltext
1:
MyPageControl.Parent := nil;                    

Und du solltest die Page auch wieder mit Free freigeben.

Bedenke auch, wenn du eine Page mittendrin löschst, daß dann dein eigenes Array MyTabSheets nicht mehr passend dazu ist (bzgl. der Indizes). Brauchst du überhaupt dieses Array?
Oder ist das nur ein lokales Array? Aber auch dann wäre dies so besser:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var tabSheet: TTabSheet;

for I:= 0 to 9 do
begin
  tabSheet := TTabSheet.Create(MyPageControl);
  tabSheet.PageControl := MyPageControl;
  {... irgendwelche verschiedene VCL-Komponenten in jedes TTabSheet setzen mit tabSheet.InsertControl ...}
end;


UweK - Mi 06.05.20 12:14

Hallo Th69,

Den Tipp habe ich probiert, aber das Ergebnis bleibt zunächst mal dasselbe:


Delphi-Quelltext
1:
2:
3:
4:
5:
for I:= 1 to 9 do
begin
  MyPageControl.RemoveControl(MyTabSheets[I]);
  MyTabSheets[I].Parent:= nil;
end;


Egal ob ich in der Schleife den einen, den anderen oder beide Befehle stehen habe, bleiben im TPageControl die leeren Seiten übrig. Erst wenn ich in der Schleife als dritte Zeile


Delphi-Quelltext
1:
  MyTabSheets[I].Free;                    


hinzufüge, verschwinden diese Leichen in TPageControl. So ist mein Problem zwar technisch gelöst, aber verstanden hätte ich diesen Effekt schon gern. Ist das eine bekannte Eigenart von TPageControl?

Das mit dem Rauslöschen mittendrin im Array ist mit bewusst. Die nachfolgenden Elemente des Array schiebe ich darum nach dem Löschen mittendrin um einen Index nach vorn, und setze zum Schluss die Länge des Array um Eins herunter. Ein bisschen umständlich, aber das Array brauche ich, um später auf die eingefügten Komponenten in den verschiedenen TTabSheet gezielt zugreifen zu können. In meinem Fall enthält jedes TTabSheet ein TDirectoryListBox für viele spezielle Einzelverzeichnisse, die an einer Stelle übersichtlich einstellbar sein sollen:


Delphi-Quelltext
1:
2:
DirectoryListBox:= TDirectoryListBox.Create(Self);
MyTabSheet[I].InsertControl(DirectoryListBox);


Auf diese kann ich dann mit


Delphi-Quelltext
1:
MyTabSheets[I].DirectoryListBox.Directory                    


gezielt zugreifen. Würde das auch in deinem angegebenen Beispiel ohne Array irgendwie gehen? Dann könnte ich mir die Array-Verwaltung sparen.

Dank + Gruß, Uwe


Th69 - Mi 06.05.20 12:36

Das mit der leeren Seite kann ich dir leider auch nicht erklären (da scheinen die beiden Klassen TPageControl und TTabSheet irgendwie [eigenartig] miteinander gekoppelt zu sein).

Du kannst doch jederzeit mittels

Delphi-Quelltext
1:
2:
3:
var tabSheet : TTabSheet;

tabSheet := MyPageControl.Pages[i];

auf die einzelnen Seiten zugreifen (bzw. dir eine Funktion dafür erstellen).


jaenicke - Mi 06.05.20 17:28

An der Stelle noch ein Hinweis:
Falls du Seiten dynamisch ein- und ausblenden möchtest, kannst du auch die Eigenschaft TabVisible der einzelnen Seiten auf True oder False setzen.