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 PageControl (https://www.delphipraxis.net/154-pagecontrol.html)

Privateer3000 14. Jun 2002 21:12


PageControl
 
HAllo Leuts,

in mühevoller Arbeit :lol: habe ich es endlich hinbekommen einen PageControl erfolgreich als Array auf ein Form zu zauber :
Code:
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;
Aber jetzt, um Himmels Willen, wie spricht man einen einzelnen Tab so an, dass beim Klick auf einen Tab auch was passiert.
In der Hilfe findet man ja gar nichts.

Bite, bitte helft mir!

Grüsse
Privateer3000

Christian Seehase 14. Jun 2002 21:31

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.

Alfons_G 14. Jun 2002 21:55

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

Privateer3000 14. Jun 2002 22:00

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

Christian Seehase 14. Jun 2002 23:21

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;

Privateer3000 15. Jun 2002 08:40

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:
if Sender is TTabsheet then
  begin
    case TTabsheet(Sender).Tag of
      0 : ShowMessage('Einleitung');
    end;
Kann das nicht nachvollziehen.

Schönes Wochenende
Privateer3000

Luckie 15. Jun 2002 08:46

Zitat:

Also muss die Eigenschaft beim Erstellen des Pagecontrol festgelegt werden (in der case).Aber statt "MyTabSheetOnShowEvenntMethode" muss das was anderes stehen?!
Nein. Hier:
Code:
OnShow := MyTabSheetOnShowEventMethode;
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.

Privateer3000 15. Jun 2002 09:39

Danke Luckie, das meint ich ja, das superultramegakosmischlange Wort
MyTabSheetOnShowEventMethode
ein "eigenes" Wort ist.

Sorry aba:

Zitat:

Wird dem Tabsheet zugewiesen, was passieren soll bei OnShow. Und in der Prozedur MyTabSheetOnShowEventMethode (noch länger ging es nicht, was Mathias ) wird noch mal mittels der Tag Eigenschaft unterschieden welcher TabSheet geklickt wurde.
Bahnhof? :?: Welcher Zug? :shock: Wohin?
Nix verstanden...Roger..over...out

Luckie 15. Jun 2002 09:47

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*

Privateer3000 15. Jun 2002 11:19

oki
sieht jetzt so aus:
Code:
0 :    begin
        Caption :='Einleitung';
        OnShow := onclick;
        Tag := 1;
        end;
wie identifizier ich jetzt diesen Klick in einer procedure?

HALT HALT HALT....habs begriffen
in der case..richtig??
AHHHHHHHHHHH

Danke an alle

Luckie 15. Jun 2002 11:23

Genau mit der Tag-Eigenschaft werden die Sheet identifiziert.

Privateer3000 15. Jun 2002 11:46

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??

Luckie 15. Jun 2002 11:54

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?

Privateer3000 15. Jun 2002 11:59

ok hier die ganze Unit
Code:
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;
die letzte porcedure ist noch nicht vollständig..jaja
aber trotzdem müsste beim click auf den 1. Tabsheet die Mesaage kommen

Luckie 15. Jun 2002 12:08

Code:
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.
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.

Privateer3000 15. Jun 2002 12:15

Mag Dich DEIN Compi mehr als mich meiner??
Bei mir passiert garnichts.Weder beim Show noc beim Klick.
ISt zum verrückt werden...

Luckie 15. Jun 2002 12:18

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.

Privateer3000 15. Jun 2002 12:24

wenn ich deinen Code in einen neuem Projekt verwende werden die Tabsheets garnicht erzeugt..mmmmhh

Luckie 15. Jun 2002 12:27

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.

Privateer3000 15. Jun 2002 12:31

Zitat:

Zitat von Luckie
Da beschweren sich schon Leute, weil du meine Postingzahl nach obentreibst

nach oben treiben??
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

Luckie 15. Jun 2002 12:33

Ups. Hast du den hier: :mrgreen: übersehen?

Privateer3000 15. Jun 2002 12:39

sorry für meine Gereiztheit..liegt alles an der Umweltverschmutzung
:mrgreen:
habe zurückgemailt

Luckie 15. Jun 2002 12:43

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.

Privateer3000 15. Jun 2002 12:53

Ich schätze hier liegt der Molch in der Soße:

Code:
case Pages[i].Tabindex of
          0 :
            begin
              Caption :='Einleitung';
              OnShow := MyClick;
              Tag := 0;
            end;
Ich trau der Anweisung "OnShow := MyClick;"nicht übern Weg.

Luckie 15. Jun 2002 12:55

Wie so?

Geht den mein Demo? Es ist extra die Exe dabei.

Privateer3000 15. Jun 2002 13:01

die Projekt.exe startet nicht...verursacht einen Fehler

hab jetztmal was anderes Probiert:
Code:
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;
Selber Effekt...nichts passiert
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:

Luckie 15. Jun 2002 13:05

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.

Privateer3000 15. Jun 2002 13:13

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

jbg 15. Jun 2002 13:34

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:
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;
Beim starten des Programms kommt gleich eine MessageBox mit "Einleitung". Und wenn ich das Register wechsle kommen die entsprechenden Meldungen.

Privateer3000 15. Jun 2002 14:26

wenn ich das mache..kommt wenigstens ein Fehlermeldung:
Ungültige Typumwandlung...
wobei, einmal hats funktioniert..

jbg 15. Jun 2002 14:34

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.

Privateer3000 15. Jun 2002 14:36

du nimmst richtig...werde das mal prüfen
Danke

Privateer3000 15. Jun 2002 14:58

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.

jbg 15. Jun 2002 15:09

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:
procedure TForm5.PageControl1Change(Sender: TObject);
begin
  case PageControl1.ActivePage.TabIndex of
    0: ...
    1: ...
  end;
end;
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.

Privateer3000 15. Jun 2002 18:37

yepp!

Activepage, genau das wars!!
Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr.

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