Autor Beitrag
Tendl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: Mi 21.01.04 19:19 
Folgende Procedure erzeugt mir zur Laufzeit ein PageControl mit einem Tabsheet:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1583
Erhaltene Danke: 10

Win 10, Win 8, Win 7, Win Vista, Win XP
VB.net (VS 2015), MsSQL (T-SQL), HTML, CSS, PHP, MySQL
BeitragVerfasst: Mi 21.01.04 19:35 
Mach mal im OnClose:


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

_________________
Gehirn: ein Organ, mit dem wir denken, daß wir denken. - Ambrose Bierce
Tendl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1583
Erhaltene Danke: 10

Win 10, Win 8, Win 7, Win Vista, Win XP
VB.net (VS 2015), MsSQL (T-SQL), HTML, CSS, PHP, MySQL
BeitragVerfasst: Mi 21.01.04 19:54 
du musst immer von oben nach unten vorgehen...

Erst Tabsheet, dann TabControl, dann das Form

_________________
Gehirn: ein Organ, mit dem wir denken, daß wir denken. - Ambrose Bierce
Tendl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mi 21.01.04 22:22 
Probiers mal so:

ausblenden 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;

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Tendl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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...

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!