Thema: Delphi Tabs organisieren

Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#3

Re: Tabs organisieren

  Alt 13. Feb 2007, 17:18
Hi,
am leichtesten kannst Du Dein Problem lösen, wenn Du kurz überlegst, was deinen Editor ausmacht. Du hast Tabs und zu jedem Tab gehört ein Editoren-Feld. Der Satz ist nicht all zu spektakulär, also hoffe ich einfach mal, dass Du dem so zustimmst?!

Unter der Annahme das dem so ist (sonst einfach nochmal nachfragen), kannst Du genau diese Beziehung auch in Delphi modellieren. Dazu erzeugst Du Dir einfach eine Klasse, TEditorTabSheet. Diese Klasse muss dann alle Eigenschaften besitzen, die Du Dir halt für ein Tab in deinem Editor so wünschst. Das wären aktuell wohl die Eigenschaften eines TTabSheet, die Du aber zusätzlich um ein Editoren-Feld erweiterst. Da Du damit nur ein neues (spezielleres) TTabSheet erzeugst, kannst Du die einfach von TTabSheet erben lassen (die erbt einfach alle Eigenschaften).

Delphi-Quellcode:
type
  TEditorTabSheet = class(TTabSheet)
    private
      FEditorFeld: TEditorFeld;
    public
      constructor Create(AOwner: TComponent);
      destructor Destroy; override;
    published
      property EditorFeld: TEditorFeld read FEditorFeld;
  end;

....

constructor TEditorTabSheet.Create(AOwner: TComponent);
begin
  inherited Create(AOwner); // geerbten Konstruktor aufrufen
  
  // hier jetzt die neue Eigenschaft initialisieren
  // Da jedes TEditorTabSheet immer ein und das selbe TEditorFeld besitzen
  // kann dies einmalig im Konstruktor erzeugt und im Destruktor frei gegeben
  // werden
  self.FEditorFeld := TEditorFeld.Create;
  // ...
  self.insertControl(self.FEditorFeld);
end;

destructor TEditorTabSheet.Destroy;
begin
  self.FEditorFeld.Free;

  inherited destroy;
end;
Ja, das wäre wohl grob der Weg. Das mit dem Array/den Arrays solltest Du an sich hier lieber lassen. Arrays sind recht statische Konstrukte. MIttels setLength kannst Du natürlich ihre Größe ohne weiteres anpassen, aber hinter dieser Methode verbirgt sich eine Menge Arbeit. So muss das System erst freien Speicher der entsprechenden Größe finden und allozieren. Dann werden die Elemente des alten Arrays in diesen neuen Speicher kopiert und zu guter letzt wird das alte Array aus dem Speicher entfernt.
Wichtig ist dabei zu wissen, dass dieser Overhead nahezu konstant ist. Ob Du dein Array um ein, zehn oder 100.000 Elemente vergrößerst, der Aufwand ist nahezu gleich. Der Overhead pro Element sinkt also mit der Anzahl der neuen Elemente ab.
Genau das nutzen Klassen wie TList und TObjectList aus. Hierbei handelt es sich um dyn. Strukturen, die ihre Größe automatisch für der Anzahl der gespeicherten Elemente anpassen. Intern verwalten sie für Dich nur ein dyn. Array. Dessen Größe wird immer dem Füllstand angepasst, ohne dass Du etwas dafür tun musst. Ist die Anzahl der Elemente (z.B. Tabs), die Du speichern möchtest unbekannt, so eignen sich Listen viel besser zum speichern!

Für dein Problem sieht die Sache aber noch viel einfacher aus, TTabSheet gehört immer zu einem TPageControl. Zu den Eigenschaften eines TPageControl zählen dann u.A.
  • ActivePage
  • ActivePageIndex
  • PageCount
  • Pages

In Pages stecken dann schon alle Seiten, die in dem TPageControl angezeigt werden, ActivePage gibt Dir zudem das aktuell ausgewählte TTabSheet zurück. Damit hast Du dann auch alles was Du brauchst.

Mittels TEditorTabSheet.Create(...) kannst Du leicht eines der neuen TTabSheets erzeugen. Das kannst Du wie eine normales TabSheet (auf gewohnte/geerbte Weise) einfügen und anzeigen lassen.
Um an das EditorFeld des aktiven Tabsheet zu kommen, holst Du Dir einfach mit der Eigenschaft ActivePage die aktive Seite (als TTabSheet) und castest die in ein TEditorTabSheet. Nach diesem cast kannst Du dann mit der entsprechenden Eigenschaft auf das Editorfeld zugreifen.

Gruß Der Unwissende
  Mit Zitat antworten Zitat