![]() |
PageControl
HAllo Leuts,
in mühevoller Arbeit :lol: habe ich es endlich hinbekommen einen PageControl erfolgreich als Array auf ein Form zu zauber :
Code:
Aber jetzt, um Himmels Willen, wie spricht man einen einzelnen Tab so an, dass beim Klick auf einen Tab auch was passiert.
procedure TForm5.FormCreate(Sender: TObject);
var i: integer; begin with PageControl1 do for i := 0 to 12 do with TTabSheet.Create(Self) do begin PageControl := PageControl1; Caption := IntToStr(Pages[i].TabIndex); case Pages[i].Tabindex of 0 : Caption :='Einleitung'; 1 : Caption :='Gerechtigkeitsstreben'; 2 : Caption :='Kampfbereitschaft'; 3 : Caption :='Sicherheitsstreben'; 4 : Caption :='Harmoniebedürfnis'; 5 : Caption :='Fröhlichkeit'; 6 : Caption :='Fremdbestimmung'; 7 : Caption :='Sentimentalität'; 8 : Caption :='Hilfsbereitschaft'; 9 : Caption :='Intellektualität'; 10 : Caption :='Erfolgswille'; 11 : Caption :='Sensibilität'; 12 : Caption :='Selbstbestimmung'; end; end; end; In der Hilfe findet man ja gar nichts. Bite, bitte helft mir! Grüsse Privateer3000 |
Moin Privateer,
Du musst auch dem OnChange des PageControls noch eine Routine zuweisen. Oder allgemeiner gesagt: Wenn Du eine visuelle Komponente dynamisch erzeugst, musst Du alles, was Du sonst im Objektinspektor einstellen würdest per Programm einstellen. Das gilt für die Eigenschaften ebenso, wie für die Ereignisse. Eventuelle Routinen, wie eben z.B. die für das OnChange müssen dann natürlich schon exisiteren, damit sie zugewiesen werden können. |
@Privateer3000
Das ist im Prinzip ganz einfach: Komponente.onClick := MeinKlick - allerdings darfst Du nicht vergessen, Deine Prozedur muß alle erforderlichen Parameter für das jeweilige Ereignis aufweisen. Also zumindest das berühmte Sender as TObject muss vorhanden sein ;) :coder: |
Danke Christian und Alfons,
ich glaub da brauch ich ein praktisches Beispiel. Und ausserdem, muss diese Festlegung in der selben Schleife, also wo die Tabs erstellt werden hinzugefügt werden, oderwo anders? Grüsse |
Moin Privateer,
das könnte so aussehen:
Code:
type
TForm1 = class(TForm) PageControl1: TPageControl; TabSheet1: TTabSheet; procedure FormCreate(Sender: TObject); procedure MyTabSheetOnShowEventMethode(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); var i: integer; begin with PageControl1 do for i := 0 to 12 do with TTabSheet.Create(Self) do begin PageControl := PageControl1; Tag := i; // Caption := IntToStr(Pages[i].TabIndex); case Pages[i].Tabindex of 0 : begin Caption :='Einleitung'; OnShow := MyTabSheetOnShowEventMethode; end; 1 : Caption :='Gerechtigkeitsstreben'; 2 : Caption :='Kampfbereitschaft'; 3 : Caption :='Sicherheitsstreben'; 4 : Caption :='Harmoniebedürfnis'; 5 : Caption :='Fröhlichkeit'; 6 : Caption :='Fremdbestimmung'; 7 : Caption :='Sentimentalität'; 8 : Caption :='Hilfsbereitschaft'; 9 : Caption :='Intellektualität'; 10 : Caption :='Erfolgswille'; 11 : Caption :='Sensibilität'; 12 : Caption :='Selbstbestimmung'; end; end; end; procedure TForm1.MyTabSheetOnShowEventMethode(Sender: TObject); begin // Was auch immer dann passieren soll if Sender is TTabsheet then begin case TTabsheet(Sender).Tag of 0 : ShowMessage('Einleitung'); end; end; end; |
Danke Christian
Also muss die Eigenschaft beim Erstellen des Pagecontrol festgelegt werden (in der case).Aber statt "MyTabSheetOnShowEvenntMethode" muss das was anderes stehen?!
Ich meine welche Syntax... Mal noch ne Frage, was passiert eigentlich hier?
Code:
Kann das nicht nachvollziehen.
if Sender is TTabsheet then
begin case TTabsheet(Sender).Tag of 0 : ShowMessage('Einleitung'); end; Schönes Wochenende Privateer3000 |
Zitat:
Code:
Wird dem Tabsheet zugewiesen, was passieren soll bei OnShow. Und in der Prozedur MyTabSheetOnShowEventMethode (noch länger ging es nicht, was Mathias :wink: ) wird noch mal mittels der Tag Eigenschaft unterschieden welcher TabSheet geklickt wurde.
OnShow := MyTabSheetOnShowEventMethode;
|
Danke Luckie, das meint ich ja, das superultramegakosmischlange Wort
MyTabSheetOnShowEventMethode ein "eigenes" Wort ist. Sorry aba: Zitat:
Nix verstanden...Roger..over...out |
Zieh mal irgendein beliebiges Kontroll auf dein Formular und dann kuck mal im Obejktinspektor, dort findest du eine Eigenschaft "Tag". Dieser Eigenschaft kann ich einen beliebigen 32-Bit-Wert zuweisen. Und Mathias nutzt ihn, im die Einzelnen Sheets auseinander zu halten.
*tutu* *töfftöff* *pfeif* |
oki
sieht jetzt so aus:
Code:
wie identifizier ich jetzt diesen Klick in einer procedure?
0 : begin
Caption :='Einleitung'; OnShow := onclick; Tag := 1; end; HALT HALT HALT....habs begriffen in der case..richtig?? AHHHHHHHHHHH Danke an alle |
Genau mit der Tag-Eigenschaft werden die Sheet identifiziert.
|
Zu früh gefreut.
Nichts passiert beim Click auf einen Sheet...aber auch keine Fehlermeldung!! Weder beim Compilieren noch im laufenden Programm. Was fehlt noch?? |
Wenn ich dir jetzt sage: "Sollte aber.", dann hilft dir das auch nicht viel oder :mrgreen:?
Im Code von Chrischii sehe ich leider auch keinen Fehler :( . Hast du das Ereignis zu gewiesen? |
ok hier die ganze Unit
Code:
die letzte porcedure ist noch nicht vollständig..jaja
unit Unit5;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TForm5 = class(TForm) RichEdit1: TRichEdit; Label1: TLabel; PageControl1: TPageControl; procedure FormCreate(Sender: TObject); procedure Myclick (Sender: TObject); private { Private-Deklarationen } public end; var Form5: TForm5; implementation {$R *.DFM} procedure TForm5.FormCreate(Sender: TObject); var i: integer; begin PageControl1.MultiLine := True; with PageControl1 do for i := 0 to 12 do with TTabSheet.Create(Self) do begin PageControl := PageControl1; Caption := IntToStr(Pages[i].TabIndex); case Pages[i].Tabindex of 0 : begin Caption :='Einleitung'; OnShow := Myclick; Tag := 0; end; 1 : Caption :='Gerechtigkeitsstreben'; 2 : Caption :='Kampfbereitschaft'; 3 : Caption :='Sicherheitsstreben'; 4 : Caption :='Harmoniebedürfnis'; 5 : Caption :='Fröhlichkeit'; 6 : Caption :='Fremdbestimmung'; 7 : Caption :='Sentimentalität'; 8 : Caption :='Hilfsbereitschaft'; 9 : Caption :='Intellektualität'; 10 : Caption :='Erfolgswille'; 11 : Caption :='Sensibilität'; 12 : Caption :='Selbstbestimmung'; end; end; end; procedure TForm5.Myclick (Sender: TObject); begin if Sender is TTabsheet then case TTabsheet(Sender).Tag of 0 : ShowMessage('Jawoll'); end; end; aber trotzdem müsste beim click auf den 1. Tabsheet die Mesaage kommen |
Code:
Ohne Problem. Die Messagebox kommt beim Erzeugen, weil da auch schon OnShow aufgerufen wird und wenn du den Tab wechselst und wieder auf "Einführung" klickst.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls; type TForm1 = class(TForm) PageControl1: TPageControl; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } procedure Myclick (Sender: TObject); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); var i: integer; begin PageControl1.MultiLine := True; with PageControl1 do for i := 0 to 12 do with TTabSheet.Create(Self) do begin PageControl := PageControl1; Caption := IntToStr(Pages[i].TabIndex); case Pages[i].Tabindex of 0 : begin Caption :='Einleitung'; OnShow := MyClick; Tag := 0; end; 1 : Caption :='Gerechtigkeitsstreben'; 2 : Caption :='Kampfbereitschaft'; 3 : Caption :='Sicherheitsstreben'; 4 : Caption :='Harmoniebedürfnis'; 5 : Caption :='Fröhlichkeit'; 6 : Caption :='Fremdbestimmung'; 7 : Caption :='Sentimentalität'; 8 : Caption :='Hilfsbereitschaft'; 9 : Caption :='Intellektualität'; 10 : Caption :='Erfolgswille'; 11 : Caption :='Sensibilität'; 12 : Caption :='Selbstbestimmung'; end; end; end; procedure TForm1.Myclick (Sender: TObject); begin if Sender is TTabsheet then case TTabsheet(Sender).Tag of 0 : ShowMessage('Jawoll'); end; end; end. |
Mag Dich DEIN Compi mehr als mich meiner??
Bei mir passiert garnichts.Weder beim Show noc beim Klick. ISt zum verrückt werden... |
Delphi 5 Entendreck, Win2000 Sp2, 500'er Celeron, 384 MB Ram, DiamondViper V770 32 MB.
Mach mal ein ganz neues Projekt und nim mal nur meinen Code. Wenn das geht, dann machst du irgend wo noch was anderes. |
wenn ich deinen Code in einen neuem Projekt verwende werden die Tabsheets garnicht erzeugt..mmmmhh
|
Jetzt mach mich aber nicht irre. Da beschweren sich schon Leute, weil du meine Postingzahl nach obentreibst :mrgreen:. Warte ich schicke dir das mal per Mail. Dauert nur einen Moment, muß das noch mal programmieren.
|
Zitat:
Punkt A: Ist das hier ein Forum oder eine "Ichhabe mehrpostingsalsduätsch" Wettbewerbsverein? Punkt B: Wenn sowas Gegenstand der Diskussion wird sollte man es abschaffen Punkt C: Wenn das alles nichts hilft, bin ich hier wohl falsch |
Ups. Hast du den hier: :mrgreen: übersehen?
|
sorry für meine Gereiztheit..liegt alles an der Umweltverschmutzung
:mrgreen: habe zurückgemailt |
Ab D5 weirden die dfm's als textdatei gespeichert. D1 bis D4 kann aber nur dfm's im binär Format lesen. Ich habe sie jetzt mal im binär Format gespeichert.
|
Ich schätze hier liegt der Molch in der Soße:
Code:
Ich trau der Anweisung "OnShow := MyClick;"nicht übern Weg.
case Pages[i].Tabindex of
0 : begin Caption :='Einleitung'; OnShow := MyClick; Tag := 0; end; |
Wie so?
Geht den mein Demo? Es ist extra die Exe dabei. |
die Projekt.exe startet nicht...verursacht einen Fehler
hab jetztmal was anderes Probiert:
Code:
Selber Effekt...nichts passiert
case Pages[i].Tabindex of
0 : begin Caption :='Einleitung'; OnShow := PageControl1Change; Tag := 0; end; //sowie auch das procedure: procedure TForm5.PageControl1Change(Sender: TObject); begin if Sender is TTabsheet then case TTabsheet(Sender).Tag of 0 : ShowMessage('Jawoll'); 1 : ShowMessage('jawoll1'); end; end; Habe ich vielleicht schon bei der Erzeugung des Pagecontrol einen Fehler gemacht? Irgendwie habe ich das Gefühl das ICH und mein PROGRAMM nicht des selbe Control meine :lol: |
Meine Exe läuft bei dir nicht? Bei mir läuft sie ohne Probleme. Die Exe und das Projekt aus Delphi raus.
Also die PageControl mußt du schon auf dein Form ziehen. Es ist die zweite Komponenten auf der Win32-Seite. |
ja klar, habe ich ja auch gemacht...
Hab bloss keine Idee mehr... Was zum :twisted: verhindert die Ausgabe. Wenn wenigstens eine Fehlermeldung käme... Aber so ins Nirwana ... Deshlab habe ich das Gefühl das der Klick nicht an die richtige Adresse geht. mmhhh.... |
Nette diskustion die ihr hier führt.
Ich frage mich, warum du immer Pages[i].Tabindex schreibst. Das kann man auch ganz einfach mit i erreichen. Denn du suchst im "Array" Pages dass i-te Element, und ermittelst dann seinen Index, der ja schon in i steht. Also bei mir (Delphi 6) funktioniert der code von Luckie:
Code:
Beim starten des Programms kommt gleich eine MessageBox mit "Einleitung". Und wenn ich das Register wechsle kommen die entsprechenden Meldungen.
procedure TForm1.MyShow/(Sender: TObject);
begin ShowMessage((Sender as TTabSheet).Caption); end; procedure TForm1.FormCreate(Sender: TObject); var i: integer; begin with PageControl1 do for i := 0 to 12 do with TTabSheet.Create(Self) do begin PageControl := PageControl1; Caption := IntToStr(i); Tag := i; OnShow := MyShow; case i of 0 : Caption :='Einleitung'; 1 : Caption :='Gerechtigkeitsstreben'; 2 : Caption :='Kampfbereitschaft'; 3 : Caption :='Sicherheitsstreben'; 4 : Caption :='Harmoniebedürfnis'; 5 : Caption :='Fröhlichkeit'; 6 : Caption :='Fremdbestimmung'; 7 : Caption :='Sentimentalität'; 8 : Caption :='Hilfsbereitschaft'; 9 : Caption :='Intellektualität'; 10 : Caption :='Erfolgswille'; 11 : Caption :='Sensibilität'; 12 : Caption :='Selbstbestimmung'; end; end; end; |
wenn ich das mache..kommt wenigstens ein Fehlermeldung:
Ungültige Typumwandlung... wobei, einmal hats funktioniert.. |
Meldet der Compiler die Fehlermeldung, oder das Programm, wenn es läuft? Wenn das Programm die Meldung bringt (was ich annehme), dann weist du MyShow nicht nur dem OnShow-Ereignis der TTabSheets zu, sondern noch irgend einem anderen Objekt.
|
du nimmst richtig...werde das mal prüfen
Danke |
Jetzt krieg ich gleich die Mücken..
jetzt geht halbwegs...aber der Witz ist: a) kommt immer die gleiche ShowMessage b) kommt sie nur wenn ich aufs Form klicke und nicht auf den Tabsheet (Mein Hund guckt schon komisch..wegen meinen Kraftausdrücken die ab und zu in den Raum schallen)
Code:
unit Unit5;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TForm5 = class(TForm) PageControl1: TPageControl; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } procedure Myclick (Sender: TObject); public end; var Form5: TForm5; implementation {$R *.DFM} procedure TForm5.Myclick(Sender: TObject); begin case TTabsheet(Sender).Tag of 0 : ShowMessage('Jawoll'); 1 : ShowMessage('jawoll1'); end; end; procedure TForm5.FormCreate(Sender: TObject); var i: integer; begin PageControl1.MultiLine := True; with PageControl1 do for i := 0 to 12 do with TTabSheet.Create(Self) do begin PageControl := PageControl1; Caption := IntToStr(i); Tag := i; onClick := Myclick; case i of 0 : Caption :='Einleitung'; 1 : Caption :='Gerechtigkeitsstreben'; 2 : Caption :='Kampfbereitschaft'; 3 : Caption :='Sicherheitsstreben'; 4 : Caption :='Harmoniebedürfnis'; 5 : Caption :='Fröhlichkeit'; 6 : Caption :='Fremdbestimmung'; 7 : Caption :='Sentimentalität'; 8 : Caption :='Hilfsbereitschaft'; 9 : Caption :='Intellektualität'; 10 : Caption :='Erfolgswille'; 11 : Caption :='Sensibilität'; 12 : Caption :='Selbstbestimmung'; end; end; end; end. |
Ich hab den Fehler:
Das onClick := Myclick; bezieht sich auf TForm5 und nicht auf TTabSheet, da TTabSheet gar kein OnClick Ereignis hat. Das "OnClick"-Ereignis für die Register kannst du im OnChange von TPageControl abfangen:
Code:
Das OnShow von TTabSheet wäre aber glaube ich besser. Ich weiß natürlich auch nicht, was du genau damit vor hast. Probiere einfach beides aus und entscheide dann, was besser ist.
procedure TForm5.PageControl1Change(Sender: TObject);
begin case PageControl1.ActivePage.TabIndex of 0: ... 1: ... end; end; |
yepp!
Activepage, genau das wars!! Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:50 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