![]() |
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; |
Re: TPageControl und dynamische anzahl TTabsheets
Sofern ich Dein Problem richtig verstehe: Nimm ein TabControl statt PageControl.
|
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. |
Re: TPageControl und dynamische anzahl TTabsheets
@Tom: wie kann man das mit 'nem TabControl machen?
@Tpercon: Ich habs jetzt so weit gebracht:
Delphi-Quellcode:
eine Seite kann ich schon hinzufügen
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)]); 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??? |
Re: TPageControl und dynamische anzahl TTabsheets
Ohne Array geht das nicht, das musst du falsch verstanden haben. ;)
|
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:
Ansprechen kannst du sie jetzt mit FindComponent.
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; @ Matze: Sind falsch verstanden deine Lieblingswörter? :) (nicht böse gemeint) |
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:
|
Re: TPageControl und dynamische anzahl TTabsheets
funzt perfekt,
nur: wie krieg ich die ganzen komponenten da rein?? |
Re: TPageControl und dynamische anzahl TTabsheets
Du erweiterst die Funktion noch etwas:
Delphi-Quellcode:
Alles ungetestet, sollte aber das Prinzip klar machen. besondere Aufmerksamkeit gilt halt der Namensverteilung (doppelte,...)!
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; |
Re: TPageControl und dynamische anzahl TTabsheets
geht das nicht anders? (ich hab da 12 Buttons, 6 Edits und 18 Checkboxen!!)!
|
Re: TPageControl und dynamische anzahl TTabsheets
Nö, dynamisch heißt halt "Schreibarbeit".
|
Re: TPageControl und dynamische anzahl TTabsheets
Zitat:
Delphi-Quellcode:
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.
TMeinTabSheet = class(TTabSheet)
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 |
Re: TPageControl und dynamische anzahl TTabsheets
super adler! thx!
|
Re: TPageControl und dynamische anzahl TTabsheets
Zitat:
|
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) |
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? |
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: |
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 |
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 |
Re: TPageControl und dynamische anzahl TTabsheets
Ja, sowas hatte ich schon vermutet. Dann muß ich wohl damit abfinden. Aber trotzdem danke! :)
|
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 |
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* |
Re: TPageControl und dynamische anzahl TTabsheets
Hi ich habe genau das gleiche Problem!
Zitat:
|
Re: TPageControl und dynamische anzahl TTabsheets
Zitat:
d.h., er hats eigentlich nicht wirklich gelöst, sondern ist es einfach nur umgangen!ote] |
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? |
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*)
![]() 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