Autor Beitrag
ardani
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36

Win XP
Delphi 6, C++ (VS Express)
BeitragVerfasst: Mo 30.11.09 19:03 
Und zwar habe ich folgendes Problem. Ich habe eine PageControl und ich möchte dort ein Vorgefertiges Formular laden, allerdings möchte ich es bewerkstelligen, das ich mehrere "instanzen" dieses Formulars ausführen lassen kann, also mehrere Tabs damit füllen. Ohne das die einzelnen Tabs sich gegenseitig stören. Wie kann ich das am besten bewerkstelligen ? Ich würde es gerne über externe Formulare lösen, da ich ca 15 verschiedene Tabvorlagen habe.

Und meine Zweite Frage, wie kann ich es realisieren, im PageControl, wenn ich ein Tab offen habe, diesen zu schließen, also einen schließen Button im Header im "reiter" des Tabs einbauen, geht sowas überhaupt ?

mfg

ardani


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mo 30.11.2009 um 18:31
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 30.11.09 19:28 
user profile iconardani hat folgendes geschrieben Zum zitierten Posting springen:
Und zwar habe ich folgendes Problem. Ich habe eine PageControl und ich möchte dort ein Vorgefertiges Formular laden, allerdings möchte ich es bewerkstelligen, das ich mehrere "instanzen" dieses Formulars ausführen lassen kann, also mehrere Tabs damit füllen. Ohne das die einzelnen Tabs sich gegenseitig stören. Wie kann ich das am besten bewerkstelligen ? Ich würde es gerne über externe Formulare lösen, da ich ca 15 verschiedene Tabvorlagen habe.

Ich glaube, du suchst einen Frame. Datei -> Neu -> Frame, dort alles zusammenklicken, und den dann per TFrame aus der Komponentenpalette auf dem PageControl platzieren.

user profile iconardani hat folgendes geschrieben Zum zitierten Posting springen:
Und meine Zweite Frage,

gehört in ein neues Thema ;)
Vorweg: Geht sicherlich schon. Dazu müsstest du das TTabSheet händisch löschen (oder einfach nur mit Visible ausblenden)

_________________
PROGRAMMER: A device for converting coffee into software.
ardani Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36

Win XP
Delphi 6, C++ (VS Express)
BeitragVerfasst: Mo 30.11.09 19:41 
ok, ich werd es mir mal ansehen, hatte erst versucht das alles Fest auf dem Formular zu plazieren, bzw das zur Laufzeit erst zu erstellen, aber dann hatte ich immer Zugriffsprobleme, wenn ich versucht habe, mit ner Prozedur, was an dem Formular zu ändern.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
var
  tab: TTabSheet ;
begin
  tab := TTabSheet.Create( PageControl1 ) ;
  tab.Caption := 'TEST' ;
  tab.PageControl := PageControl1 ;
  with TFrame2.Create(Self) do begin
      Parent := Self.PageControl1;
      Align := alClient;
      Show;
  end;
  PageControl1.ActivePage := tab ;
end;


So hab ich es momentan in einem Projekt zum Testen, allerdings, kann ich den Frame so nur einmal einbinden, allerdings würde ich den Frame wie gesagt mehrfach öffnen können. Kann mir dabei vllt jemand helfen ?

Wenn ich es versuche ein zweites mal zu öffnen stürzt das Programm mit der Meldung, dass Frame2 bereits existiert ab. Ich vermute ja das es an dem TFrame2.Create liegt, und ich dass irgendwie anders machen muss, wäre für jede Hilfe dankbar.
catweasel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Mo 30.11.09 21:56 
Hmmm,,

ist nur jetzt so ein ad hoc tipp....

Nimm als Parent für den Frame nicht das Pagecontrol, sondern das tabsheet....

Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
ardani Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36

Win XP
Delphi 6, C++ (VS Express)
BeitragVerfasst: Mo 30.11.09 22:13 
habs geändert
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  
with TFrame2.Create(Self) do begin
      Parent := Self.PageControl1.ActivePage ;
      Align := alClient;
      Show;
  end;
leider besteht das Problem weiterhin...

Muss ich vllt im Frame selber was ändern ?

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
unit Unit2;

interface

uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TFrame2 = class(TFrame)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{$R *.dfm}





procedure TFrame2.Button1Click(Sender: TObject);
begin
label1.Caption:='Funzt';
end;

end.


also irgendwie richtung OOP oder so ? Weil da hätte ich ja die Instanzen oder ?
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 30.11.09 23:20 
Wenn du das Ding erzeugst, musst du dem nen Namen geben..
(eigentlich logisch, sagt doch schon die Fehlermeldung aus? :) )
also sowas wie Name := 'fmeMyFrame' + IntToStr(Zaehler);

Btw: Bist du sicher, dass du dir die Isntanz nicht merken möchtest? So kannst du da ja nicht mehr drauf zugreifen..

_________________
PROGRAMMER: A device for converting coffee into software.
ardani Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36

Win XP
Delphi 6, C++ (VS Express)
BeitragVerfasst: Mo 30.11.09 23:31 
hmpf, das ist nen Argument mit dem Zähler, das ich da nicht selber drauf gekommen bin -___- Ich will lediglich das Formular abarbeiten und dann war es das. Allerdings stellt sich mir grade die Frage, wenn ich das hoch Zähle, greif ich dann ja auf eine Instanz zu die es garnicht gibt, weil es ja lediglich das Frame Frame2 gibt :/

Also vermute ich jetzt doch OOP, wo ich dann verschiedene Instanzen des Frames aufrufen muss, da klappt das ja auch mit dem Zähler, weil ich jeder Instanz nen eigenen Namen Zuweise. Oder stell ich mich grad einfach nur zu doof an, hab jetzt den Namen anstelle von self angegeben, oder ist das die falsch Stelle ?

//edit: habs gerade Über ein Array versucht, aber selbst dann sagt er mir dass die Komponente bereits Existiert. Also der Fehler liegt bei TFrame2.Create(self) weil ich ja hier jedes mal versuche die Komponente zu erzeugen und da es die schon gibt bricht er ab ?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Button1Click(Sender: TObject);
var
  tab: TTabSheet ;
  Name:string;
  test: array[0..2of TFrame2;
begin
  tab := TTabSheet.Create( PageControl1 ) ;
  tab.Caption := 'TEST' ;
  tab.PageControl := PageControl1 ;
  test[i] := TFrame2.Create(self);
  test[i].Parent := self.PageControl1.ActivePage ;
  test[i].Align := alClient;
  inc(i);
  PageControl1.ActivePage := tab ;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
end;


Das ist der aktuellste Test :(
catweasel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Di 01.12.09 20:45 
Naja, nimm als parent-tabsheet nicht das "active sheet", sondern direkt das erzeugte tabsheet, und zwar mit Namen..

Also etwa so :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var 
newsheet : TTAbSheet;
GlobalCounterVar : integer;

newsheet := TTabsheet.create(application);
newsheet.parent := MyPageControl;
newsheet.name := 'HorstiHorstmannsGeilesSheet';

//und nun kommts:

frame := TFrame.create;
frame.parent := HorstHorstmannsGeilesSheet;



und bei dem Namenszuweis macht mann (vie schon gesagt) den Zähler:

ausblenden Delphi-Quelltext
1:
2:
newsheet.name := 'HorstiHorstmannsGeilesSheet' + inttostr(GlobalCounterVar);
inc(GlobalCounterVar);


Ist auch besser einen Zähler zu benutzen da mann bei FormClose schön mit findcomponent aufräumen kann.


Aaaaaandererseits:

Wenn schon ein Zählr, warum nicht dann ein:

ausblenden Delphi-Quelltext
1:
Array of TTabsheet;					

Sagmal Bescheid obs klappt.

Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
ardani Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36

Win XP
Delphi 6, C++ (VS Express)
BeitragVerfasst: Di 01.12.09 21:50 
Jopp, vielen Dank euch allen. Hatte nen Denkfehler, hab mir den Post von Xentar nochmal durch den Kopf gehen lassen und bin auf folgende Lösung gekommen:

Haupt Unit:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  i:byte;

implementation
           
uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  tab: TTabSheet ;
  Name:string;
  test: array[0..9of TFrame2;
begin
  tab := TTabSheet.Create( PageControl1 ) ;
  tab.Caption := 'TEST' + inttostr(i) ;
  tab.PageControl := PageControl1 ;
  PageControl1.ActivePage := tab ;
  test[i] := TFrame2.Create(self);
  test[i].Name := 'test' + inttostr(i);
  test[i].Parent := self.PageControl1.ActivePage ;
  test[i].Align := alClient;
  inc(i);
  PageControl1.ActivePage := tab ;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
end;

end.


Wichtig ist hierbei immer nach dem erzeugen, den neu erzeugten Tab, als aktiven einzubinden, sonst erstellt er zwar nen neuen Tab, Überschreibt aber den "aktiven" mit dem neuen Frame.

Und die Zweite Unit:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
unit Unit2;

interface

uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TFrame2 = class(TFrame)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{$R *.dfm}





procedure TFrame2.Button1Click(Sender: TObject);
begin
label1.Caption:='Funzt';
end;

end.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 01.12.09 23:03 
Wenn du das eh so machst, könntest auf ein record nehmen, wo du dir jeweils zusammengehörige TabSheets und Frame merkst.

_________________
PROGRAMMER: A device for converting coffee into software.
ardani Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36

Win XP
Delphi 6, C++ (VS Express)
BeitragVerfasst: Di 01.12.09 23:16 
klingt interessant, also meinst du so ?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
rec_tabs = record
 test : array[0..9of TFrame2;
 test2 : array[0..9of TFrame3;
end;


oder hab ich dich da falsch Verstanden ?
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 01.12.09 23:18 
user profile iconardani hat folgendes geschrieben Zum zitierten Posting springen:
klingt interessant, also meinst du so ?

Fast. Aber das Array eher außerhalb.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Trec_tabs = record
 test : TFrame2;
 test2 : TFrame3;
end;
MyTab: array[0..9of Trec_tabs;


Edit: Namen korrigiert.

_________________
PROGRAMMER: A device for converting coffee into software.
ardani Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36

Win XP
Delphi 6, C++ (VS Express)
BeitragVerfasst: Di 01.12.09 23:33 
ok, das ist auch eine Variante, dürfte aber keinen großen Unterschied machen oder ?

So, habs außerhalb der record deklaration gemacht, so muss ich zwar mehrere Zähler verwenden, aber es spart mir die ganzen Array deklarationen.
oibees
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Di 22.12.09 15:37 
Ich habe das ursprüngliche Problem zu meiner Zufriedenheit (Aufbau eines TDI-Schnittstelle) folgendermaßen gelöst (Änderungen in Zeile 8 und 9):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
var
  tab: TTabSheet ;
begin
  tab := TTabSheet.Create( PageControl1 ) ;
  tab.Caption := 'TEST' ;
  tab.PageControl := PageControl1 ;
  with TFrame2.Create(application) do begin
      Parent := tab;
      Align := alClient;
      Show;
  end;
  PageControl1.ActivePage := tab ;
end;