Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TPageControl -> EInvalidOperation -> kein übergeord. Fenster (https://www.delphipraxis.net/132950-tpagecontrol-einvalidoperation-kein-uebergeord-fenster.html)

I.A 22. Apr 2009 15:52


TPageControl -> EInvalidOperation -> kein übergeord. F
 
Hallo!

Bitte entschuldigt die blöde Frage, aber ich hab keine Ahnung, wa sich falsch gemacht habe!

Ich will zur Laufzeit eine Seite in ein TPageControl einfügen, das ich ebenso zur Laufzeit erzeuge.

Dabei kriege ich in der Methode AddPage die genannte Exception. Der Debugger beleibt auf der Anweisung "PageControl = self stehen".

Delphi-Quellcode:
type
  TDialogRegisterPage = class (TTabSheet)
     constructor Create(AOwner: TComponent);
  end;

  TDialogRegister = class(TPageControl)
     constructor Create(AOwner: TComponent);
     procedure AddPage(const AName: String);
  end;

constructor TDialogRegisterPage.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FControl := TAnyControl.Create(self);
  FControl.Parent := self;
  FControl.Align := alClient;
end;


procedure TDialogRegister.AddPage(const AName: String);
var Page: TDialogRegisterPage;
begin
  with TDialogRegisterPage.Create(self) do
  begin
    Caption := AName;
    PropKinds := APropKinds;
    Parent := self;
    PageControl := self;
  end;
end;

constructor TDialogRegister.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  AddPage('Titel1');
  AddPage('Titel2');
end;

-----------------------------

type
  TForm1 = class(TForm)
    ...
    procedure FormCreate(Sender: TObject);
    ...
   private
    MyDlgRegisters: TDialogRegister;
   public
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyDlgRegisters := TDialogRegister.Create(self);
  with MyDlgRegisters do
  begin
    Left := 0;
    Top := 0;
    Width := 185;
    Height := 289;
  end;
  MyDlgRegisters.Parent := self;
end;
Wer kann mir sagen, was ich in meiner betriebsblindheit übersehen habe? :wall:

DeddyH 22. Apr 2009 16:00

Re: TPageControl -> EInvalidOperation -> kein übergeor
 
Und wenn Du die beiden AddPage-Aufrufe in die Loaded-Methode des TDialogRegister verschiebst?

oki 22. Apr 2009 19:16

Re: TPageControl -> EInvalidOperation -> kein übergeor
 
self ist zum Zeitpunkt des Create noch nicht vorhanden (noch kein Handle). Somit schlägt das im Create fehl:
Delphi-Quellcode:
constructor TDialogRegister.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  AddPage('Titel1');          // <- geht das schief
  AddPage('Titel2');          // <- und geht das schief
end;
Das kannst du frühestens in CreateWnd tun.

Delphi-Quellcode:
procedure TDialogRegister.CreateWnd;
begin
  inherited;
  AddPage('Titel1');          
  AddPage('Titel2');          
end;
Gruß oki

hoika 23. Apr 2009 07:29

Re: TPageControl -> EInvalidOperation -> kein übergeor
 
Hallo,

Delphi-Quellcode:
with TDialogRegisterPage.Create(self) do
  begin
    Caption := AName;
    PropKinds := APropKinds;
    Parent := self;
    PageControl:= self;
  end;
Das self bei Parent:= self bezieht sich durch das with ja auf dein TDialogRegisterPage,
statt auf TDialogRegister.
Löse das durch eine lokale Variable.
Delphi-Quellcode:
var
  DialogRegisterPage: TDialogRegisterPage;
begin
  DialogRegisterPage:= TDialogRegisterPage.Create;
  with DialogRegisterPage do
  begin
    Caption := AName;
  end;

Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz