Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - PageControl zur Laufzeit erzeugen, aber wie?


Tendl - Mi 21.01.04 19:19
Titel: PageControl zur Laufzeit erzeugen, aber wie?
Folgende Procedure erzeugt mir zur Laufzeit ein PageControl mit einem Tabsheet:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure fill2form(new_form:TForm);
var
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;

begin
    PageControl1 := TPageControl.Create(new_form);
    PageControl1.Name := 'PageControl1';
    PageControl1.Top := 40;
    PageControl1.width := new_form.Width - 15;
    PageControl1.Height := new_form.height - 45;
    PageControl1.TabOrder := 0;
    new_form.InsertControl(PageControl1);
  //exit;

    TabSheet1 := TTabSheet.Create(PageControl1);
    TabSheet1.Name := 'TabSheet1';
    TabSheet1.Parent := PageControl1;
    TabSheet1.PageControl := PageControl1;
    TabSheet1.Caption := 'Button 1';
    pagecontrol1.InsertControl(Tabsheet1);
end;


Das erzeugte PageControl sieht so aus wie erwartet, nur beim Schließen
bekomme ich stets den Fehler:
Accessviolation at address 00000, Read of Address 00000

Wenn ich das auskommentierte exit aktiviere läuft es ohne Fehler.

Was mach ich falsch?

Danke im Voraus
Thomas

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


Chatfix - Mi 21.01.04 19:35

Mach mal im OnClose:



Delphi-Quelltext
1:
2:
PageControl1.Free; 
TabSheet1.Free;


Tendl - Mi 21.01.04 19:51

Ganz so einfach ist die Sache nicht, auch das TForm ist dynamisch erzeugt.
Der Fehler kommt meiner Meinung nach daher, daß zweimal versucht wird das Tabsheet zu löschen (.free). Ich weiß aber nicht warum und wie ich das vehindern kann.

Thomas


Chatfix - Mi 21.01.04 19:54

du musst immer von oben nach unten vorgehen...

Erst Tabsheet, dann TabControl, dann das Form


Tendl - Mi 21.01.04 19:59

Ich habe dazu keinen Code geschrieben,
ich denke diese Arbeit wird vom Formular, dem das Pagecontrol gehört übernommen. Dies sollte pagegcontrol.free aufrufen, das seinerseits das tabsheet.free aufruft.

Liege ich da falsch?

Danke für die Hilfe
Thomas


Motzi - Mi 21.01.04 22:22
Titel: Re: PageControl zur Laufzeit erzeugen, aber wie?
Probiers mal so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure fill2form(new_form:TForm);
var
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;

begin
    PageControl1 := TPageControl.Create(new_form);
    PageControl1.Parent := new_form;
    PageControl1.Name := 'PageControl1';
    PageControl1.Top := 40;
    PageControl1.width := new_form.Width - 15;
    PageControl1.Height := new_form.height - 45;
    PageControl1.TabOrder := 0;
  //exit;

    TabSheet1 := TTabSheet.Create(PageControl1);
    TabSheet1.Name := 'TabSheet1';
    TabSheet1.Parent := PageControl1;
    TabSheet1.PageControl := PageControl1;
    TabSheet1.Caption := 'Button 1';
end;


Tendl - Do 22.01.04 10:03

Danke, so hat es funktioniert.

Kann jemand dann sagen wozu ich die Methoden

InsertControl(..)
InsertComponent(..)

brauche und wo der genau Unterschied liegt?

Thomas


Motzi - Do 22.01.04 11:20

Im Normalfall brauchst du diese Methoden nie aufzurufen.. bei InsertCotnrol sagt die Hilfe sogar:
Online Hilfe hat folgendes geschrieben:
Applications should not need to call InsertControl directly.


Im Normalfall reicht es den Owner als Parameter im Constructor mitzugeben und den Parent zu setzen... mehr brauchst du eigentlich nicht machen, und mehr hab ich in meinem obigen Code auch nicht gemacht...