Autor |
Beitrag |
ardani
      
Beiträge: 36
Win XP
Delphi 6, C++ (VS Express)
|
Verfasst: 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 Narses: Topic aus Sonstiges (Delphi) verschoben am Mo 30.11.2009 um 18:31
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mo 30.11.09 19:28
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
ardani 
      
Beiträge: 36
Win XP
Delphi 6, C++ (VS Express)
|
Verfasst: 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.
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
      
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: 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 
      
Beiträge: 36
Win XP
Delphi 6, C++ (VS Express)
|
Verfasst: Mo 30.11.09 22:13
habs geändert
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 ?
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 public 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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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 
      
Beiträge: 36
Win XP
Delphi 6, C++ (VS Express)
|
Verfasst: 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 ?
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..2] of 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
      
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: 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 :
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';
frame := TFrame.create; frame.parent := HorstHorstmannsGeilesSheet; |
und bei dem Namenszuweis macht mann (vie schon gesagt) den Zähler:
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:
Delphi-Quelltext
Sagmal Bescheid obs klappt.
Catweasel
_________________ Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
|
|
ardani 
      
Beiträge: 36
Win XP
Delphi 6, C++ (VS Express)
|
Verfasst: 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:
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 public end;
var Form1: TForm1; i:byte;
implementation uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var tab: TTabSheet ; Name:string; test: array[0..9] of 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:
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 public end;
implementation
{$R *.dfm}
procedure TFrame2.Button1Click(Sender: TObject); begin label1.Caption:='Funzt'; end;
end. |
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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 
      
Beiträge: 36
Win XP
Delphi 6, C++ (VS Express)
|
Verfasst: Di 01.12.09 23:16
klingt interessant, also meinst du so ?
Delphi-Quelltext 1: 2: 3: 4:
| rec_tabs = record test : array[0..9] of TFrame2; test2 : array[0..9] of TFrame3; end; |
oder hab ich dich da falsch Verstanden ?
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 01.12.09 23:18
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
ardani 
      
Beiträge: 36
Win XP
Delphi 6, C++ (VS Express)
|
Verfasst: 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
|
Verfasst: 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):
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; |
|
|
|