Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TPageControl und dynamische anzahl TTabsheets (https://www.delphipraxis.net/8122-tpagecontrol-und-dynamische-anzahl-ttabsheets.html)

Illuminator-23-5 29. Aug 2003 07:40


TPageControl und dynamische anzahl TTabsheets
 
Ich habe eine TPageControl auf meinem form
darauf habe ich ein TTabsheet. darauf befinden sich jede menge Buttons, edits und checkboxen. nun möchte ich aber während der laufzeit ein neues Tabsheet erstellen, mit den gleichen buttons, edits und checkboxen.
wie geht das?
(ich möchte danach auch noch weitere erstellen können)
ich hab mir dann sowas gedacht:
Delphi-Quellcode:
var
  Form1: TForm1;
  Seiten: array of TTabSheet;

procedure TForm1.Button1Click(Sender: TObject);
begin
  setLength(Seiten, length(Seiten) + 1);
  Seiten[length(Seiten)-1] := TTabsheet.Create(Form1);
{ab hier weiß ich nicht mehr weiter. wie kann ich jetzt dieses Tabsheet meinem Pagecontrol hinzufügen und sagen, welche comps draufsein sollen?}
end;

Tom 29. Aug 2003 07:49

Re: TPageControl und dynamische anzahl TTabsheets
 
Sofern ich Dein Problem richtig verstehe: Nimm ein TabControl statt PageControl.

Tpercon 29. Aug 2003 07:54

Re: TPageControl und dynamische anzahl TTabsheets
 
Das Ding brauch noch nen Parent, Name (eindeutig sein muß)...
Der Weg stimmt aber.
Wobei, erstell die TabSheets so und mit nem Array. Ansprechen kannst du sie ja mit FindComponent.

Illuminator-23-5 29. Aug 2003 11:51

Re: TPageControl und dynamische anzahl TTabsheets
 
@Tom: wie kann man das mit 'nem TabControl machen?
@Tpercon:
Ich habs jetzt so weit gebracht:
Delphi-Quellcode:
  setLength(Sites, length(Sites) + 1);
  Sites[high(Sites)] := TTabSheet.Create(Form1);
  Sites[high(Sites)] := ts_Localhost;
  Sites[high(Sites)].Name := 'seite' + IntToStr(pg_Main.PageCount);
  Sites[high(Sites)].TabVisible := true;
  Sites[high(Sites)].Caption := 'test';
  Sites[high(Sites)].PageControl := pg_Main;
  pg_Main.InsertComponent(Sites[High(sites)]);
eine Seite kann ich schon hinzufügen
wenn ich eine 2. Hinzufügen will, bringt er eine fehlermeldung (exception) und setzt den 'zeiger' auf die Zeile, wo ich versuch, den Namen zuzuweisen!

wenn ich dich nicht falsch verstanden hab, hast du gemeint, dass ich nicht einen array machen soll
wie solls ohne array gehn???

Matze 29. Aug 2003 12:10

Re: TPageControl und dynamische anzahl TTabsheets
 
Ohne Array geht das nicht, das musst du falsch verstanden haben. ;)

Tpercon 29. Aug 2003 12:11

Re: TPageControl und dynamische anzahl TTabsheets
 
Die Idee mit dem TabControl ist schlecht, da der Zugriff darauf ziemlich schlecht geht.
Hier mal schnell was zum Erstellen der Tabs:
Delphi-Quellcode:
var MyTabSheet: TTabSheet;
    i: integer;
begin
  for i := 1 to 10 do begin
    MyTabSheet := TTabSheet.Create(PageControl1);
    MyTabSheet.Parent := PageControl1;
    MyTabSheet.Name := 'TabSheet'+InttoStr(i);
    MyTabSheet.Caption := 'TabSheet'+InttoStr(i);
    MyTabSheet.Tag := i;
    MyTabSheet.Visible := true;
    MyTabSheet.PageControl := PageControl1;
  end;

end;
Ansprechen kannst du sie jetzt mit FindComponent.

@ Matze: Sind falsch verstanden deine Lieblingswörter? :) (nicht böse gemeint)

Matze 29. Aug 2003 12:12

Re: TPageControl und dynamische anzahl TTabsheets
 
Nimm doch anstatt "pg_Main.PageCount" einfach die Variable, die in den [] steht, oder habe ich da jetzt was falsch verstanden. :gruebel:

Illuminator-23-5 29. Aug 2003 12:38

Re: TPageControl und dynamische anzahl TTabsheets
 
funzt perfekt,
nur: wie krieg ich die ganzen komponenten da rein??

Tpercon 29. Aug 2003 12:47

Re: TPageControl und dynamische anzahl TTabsheets
 
Du erweiterst die Funktion noch etwas:
Delphi-Quellcode:
begin
  for i := 1 to 10 do begin
    MyTabSheet := TTabSheet.Create(PageControl1);
    MyTabSheet.Parent := PageControl1;
    MyTabSheet.Name := 'TabSheet'+InttoStr(i);
    MyTabSheet.Caption := 'TabSheet'+InttoStr(i);
    MyTabSheet.Tag := i;
    MyTabSheet.Visible := true;
    MyTabSheet.PageControl := PageControl1;
    for j := 1 to 10 do begin
      MyButton := TButton.Create(MyTabSheet);
      MyButton.Parent := MyTabSheet;
      MyButton.Name := 'Button'+InttoStr(i)+'-'+InttoStr(j);
      MyButton.Caption := 'Button'+InttoStr(i)+'-'+InttoStr(j);
      MyButton.Width := 50;
      MyButton.Left := j * MyButton.Width + 10;
    end;
  end;

end;
Alles ungetestet, sollte aber das Prinzip klar machen. besondere Aufmerksamkeit gilt halt der Namensverteilung (doppelte,...)!

Illuminator-23-5 29. Aug 2003 12:51

Re: TPageControl und dynamische anzahl TTabsheets
 
geht das nicht anders? (ich hab da 12 Buttons, 6 Edits und 18 Checkboxen!!)!

Tpercon 29. Aug 2003 12:55

Re: TPageControl und dynamische anzahl TTabsheets
 
Nö, dynamisch heißt halt "Schreibarbeit".

Adler 29. Aug 2003 13:12

Re: TPageControl und dynamische anzahl TTabsheets
 
Zitat:

Zitat von Tpercon
Nö, dynamisch heißt halt "Schreibarbeit".

Das ist so nicht ganz richtig. Am einfachsten wird es sein wenn du dir eine neue Komponente schreibst und zwar vom Typ TTabSheet.

Delphi-Quellcode:
TMeinTabSheet = class(TTabSheet)
in diese Komponente fügst du alle Button usw. ein die du benötigst. Anschließend must du deiner Pagecontrol nur eine neue Instanz dieser Komponente hinzufügen.

Der Zugriff auf die neuen TabSheets kann dann entweder durch FindComponent erfolgen oder aber du fügst die neuen TabSheets in eine TList ein und kannst dann darüber auf die TabSheets zugreifen.

MfG
Adler

Illuminator-23-5 29. Aug 2003 13:13

Re: TPageControl und dynamische anzahl TTabsheets
 
super adler! thx!

Tpercon 29. Aug 2003 13:17

Re: TPageControl und dynamische anzahl TTabsheets
 
Zitat:

Zitat von Adler
nicht ganz richtig

OK, nur da mußt du dich jawohl auch um das Erzeugen der ganzen Komponenten kümmern. Und da das Erzeugen bei jedem TabSheet gleich ist und in ner Schleife abgearbeitet wird, macht es keinen Unterschied. Somit gibt es keine (mir bekannte) Lösung ohne viel Aufwand.

Illuminator-23-5 29. Aug 2003 15:40

Re: TPageControl und dynamische anzahl TTabsheets
 
ich hab das problem jetzt anders gelöst:
in der Win 3.1-Palette gibts ein TTabSet
das hab ich genommen, und jedesmal, wenn die Seite gewechselt wird, wird der aktuelle Zustand in einem Array gespeichert und für die entsprechende Seite geladen->ich brauch nur die buttons usw. einmal in der Entwicklungsphase auf das Formular setzen
*VorLauterBäumeDenWaldNichtGesehen*

(habs gepostet, falls jemand ein ähnliches problem hat/haben wird)

Marko 12. Okt 2003 17:50

Re: TPageControl und dynamische anzahl TTabsheets
 
Ich hab ein ähnliches Problem. Ich hab mir ebenfalls einen neuen Typ von TTabsheet erstellt, so wie Adler sagte. Nun kann ich problemlos unmengen von Tabsheets erzeugen, aber ich möchte sie ja auch mal wieder schließen.
Dazu habe ich einen Button auf alle Tabsheets gesetzt und in die onclick-prozedur geschrieben: "Form1.pagecontrol1.activepage.free"
Das schließt zwar die Seite, aber das Programm stürzt jedesmal mit einer Zugriffsverletzung ab.
Wenn ich aber dasselbe mit einem Button außerhalb des Tabsheets mache, funzt alles perfekt.
Kann mir irgendjemand sagen, was ich falsch mache?

Marko 17. Okt 2003 12:15

Re: TPageControl und dynamische anzahl TTabsheets
 
OK, ich hab das ganze jetzt mit einem Button außerhalb des Tabsheets gelöst.
Trotzdem würde mich wirklich interessieren, was ich mit meinem anderen Ansatz falsch mache.
Sorry, das ist vielleicht eine blöde Frage, aber ich bin halt nur ein Teilzeithobbyprogrammierer, der gerne etwas dazulernen möchte. :wink:

Nalincah 17. Okt 2003 12:31

Re: TPageControl und dynamische anzahl TTabsheets
 
Ich hab mir nicht alles durch gelesen und weiß auch nicht ob ihr schon ne lösung gefunden habt...Aber ich hab ein ähnliches Problem gehabt und es so gelöst:

Einen Frame erstellt in dem ich die Komponenten reingepackt hab die ich später im tabsheet haben will
dann zu laufzeit ein leeres tabsheet erstellt in das ich dann das Frame erstellt hab. Fertig...Ansteuern mit PageControl.Pages[PageControl.ActivePageIndex].Tag. Das ist eindeutig

woki 17. Okt 2003 13:44

Re: TPageControl und dynamische anzahl TTabsheets
 
HI,

@Marco: Deine Beobachtung ist richtig: Grundsätzlich kann sich keine Komponente in einer eigenen Ereignisbehandlung selbst zerstören, da die Methode einen Zeiger auf das aufrufende Objekt hält, und der zeigt dann nach der Rückkehr plötzlich ins Leere, also gibt es eine Schutzverletzung. Von woanders geht es natürlich.

Zur dynamischen Anzahl Tabsheets:

Wenn zur Desingzeit bereits das Aussehen der einzelnen Tabsheets bekannt ist, muss man die natürlichnicht vollständig von Hand tippen, vielmehr gibt es da diverse Möglichkeiten, sich das Leben zu vereinfachen:

- Alles visuell fertigmachen, und nur das was benötigt wird anzeigen,

oder

- dynamisch: Auch alle Tabsheets soweit bekannt zu Designzeit fertig machen, GExperts frei aus dem Netz holen, Tabsheet etc markieren, Mnuepunkt ComponentsToCode auswählen, den Code für die echte dynamische Erzeugung in den Editor pasten, und man hat es perfekt dynamisch.

Grüsse
Woki

Marko 17. Okt 2003 14:27

Re: TPageControl und dynamische anzahl TTabsheets
 
Ja, sowas hatte ich schon vermutet. Dann muß ich wohl damit abfinden. Aber trotzdem danke! :)

woki 17. Okt 2003 14:52

Re: TPageControl und dynamische anzahl TTabsheets
 
ach so,

der Vollständigkeit halber:

Forms stellen von sich aus eine Lösung für das Problem zur Verfügung, die Methode release

Grüsse
Wolki

marodeur 19. Okt 2003 14:31

Re: TPageControl und dynamische anzahl TTabsheets
 
Hi,

ich hab auch so ein ähnliches Prob.

ich erstelle auf meinem PageControl eine dynamische Anzahl an TabSheets und möchte diese dann über ein PopupMenue schließen.

Alles gut und fein, erstelle ich mir ein PopupMenue mit einer Procedure die das aktive TabSheet killt, funtzt auch super.

Nun mein Anliegen: wie stelle ich es an, dass wenn man mit der Maus auf irgendein TabSheet rechts oder links klickt, dieses TabSheet aktiviert wird um dann dieses TabSheet zu schließen.


EDIT:
hab mir hier im forum mal einige threads durch gelesen und eine lösung gefunden *yeppie*

RX3 2. Jun 2004 09:59

Re: TPageControl und dynamische anzahl TTabsheets
 
Hi ich habe genau das gleiche Problem!

Zitat:

Zitat von Illuminator-23-5

(habs gepostet, falls jemand ein ähnliches problem hat/haben wird)

Aber wo hast du es denn geposted ?? Oder bin ich blind ? :(

Devil 2. Jun 2004 11:41

Re: TPageControl und dynamische anzahl TTabsheets
 
Zitat:

Zitat von RX3
Hi ich habe genau das gleiche Problem!

Zitat:

Zitat von Illuminator-23-5

(habs gepostet, falls jemand ein ähnliches problem hat/haben wird)

Aber wo hast du es denn geposted ?? Oder bin ich blind ? :(

Wahrscheinlich meint er damit, dass er die Problemlösung mit dem TTabSet gelöst hat!
d.h., er hats eigentlich nicht wirklich gelöst, sondern ist es einfach nur umgangen!ote]

RX3 10. Jun 2004 21:17

Re: TPageControl und dynamische anzahl TTabsheets
 
Hi ich hab zwar mittlerweile eine Lösung gefunden, aber das is sauviel schreibarbeit bei ner Riesenanzahl an KOmponenten!

Gibts da nicht irgendwie was einfacheres?
Mit Objektklassen, etc?
Ein fertiges Tabsheet mit allen Komponenten, welches dann einfach vererbt wird oder ähnliches?
Oder bin ich da aufm Holzweg?

Nicodius 10. Jun 2004 21:25

Re: TPageControl und dynamische anzahl TTabsheets
 
zum dynamisch komponenten kreeiren habe ich ein Tkleines tut gemacht(wird ja auch echt jeden 2. tag gefragt *g*)

Kleines Tut

das musst du ein bisschen umschreiben


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz