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); 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
Peter 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; 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...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!