Autor Beitrag
UweK
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22

Win 7
Delphi Enterprise XE6
BeitragVerfasst: Di 05.05.20 15:49 
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:

ausblenden 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4298
Erhaltene Danke: 925

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: Di 05.05.20 16:50 
Hallo,

lies mal die Beschreibung zu RemoveControl.
Man sollte einfach den Parent setzen, also
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22

Win 7
Delphi Enterprise XE6
BeitragVerfasst: Mi 06.05.20 11:14 
Hallo Th69,

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

ausblenden 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

ausblenden 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:

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


Auf diese kann ich dann mit

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4298
Erhaltene Danke: 925

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: Mi 06.05.20 11: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
ausblenden Delphi-Quelltext
1:
2:
3:
var tabSheet : TTabSheet;

tabSheet := MyPageControl.Pages[i];

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

Für diesen Beitrag haben gedankt: UweK
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18881
Erhaltene Danke: 1666

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 06.05.20 16: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.