![]() |
Fehler: Element '' hat kein Übergeordnetes Fenster.
Hi,
Ich möchte mit Hilfe einer eigenen Unit eine art Navigation programmieren. Leider bekomme ich beim Ausführen immer die Fehlermeldung: "Element '' hat kein übergeordnetes Fenster". Momentan besteht die Navigation lediglich aus einer Reihe von Buttons, die ich selbst vorher programmiert und getestet habe. Die eigene NaviCreate Methode zeigt keine Fehlermeldung an. Erst wenn Paint, bzw NaviPaint ausgeführt wird kommt die Fehlermeldung. (Ich hoffe der Quelltext ist verständlich und nicht zu unübersichtlich.) Anwendung
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, bkButton, bknavi; type TForm1 = class(TForm) Button1: TButton; bknavi1: Tbknavi; procedure FormCreate(Sender: TObject); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private { Private-Deklarationen } public { Public-Deklarationen } end; const num=8; var Form1: TForm1; Acap: Array[1..num] of String; x: Boolean; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); VAR i:byte; c1,c2: TColor; begin for i:=1 to num do Acap[i]:='Button '+IntToStr(i); // Die Captions der Buttons c1:=RGB(160, 110, 110); c2:=RGB(40, 40, 40); bknavi1.naviCreate( 0, 0, 800, 80, num, 0, Acap, c1, c2, clWhite, clBlack, 'horizontal'); //bknavi1.naviCreate(left, top, width, height, anzahl, nichtWichtig, captions, coloreigenschaften der Buttons........., style); end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin bknavi1.FormMove; end; end. Unit
Delphi-Quellcode:
Ich flehe um Hilfe, ich muss irgendwie ein Brett vor dem Kopf haben :P.
unit bknavi;
interface uses Windows, SysUtils, Variants, Classes, forms, Graphics, Controls, StdCtrls, ExtCtrls, Dialogs, bkButton, bkBorder; type Tbknavi = class(TCustomControl) private { Private-Deklarationen } Anavi: Array of TbkButton; Asize: byte; BtnBorder: TbkBorder; protected { Protected-Deklarationen } procedure Paint(); Override; public { Public-Deklarationen } akt: Boolean; procedure naviCreate(x1, y1, x2, y2: Integer; size, front: byte; text: Array of String; color, backColor, FontColor, FChover: TColor; Style:String); constructor Create(AOwner: TComponent); Override; procedure NaviPaint(id: TbkButton; form: Boolean); procedure SetOnMouseMove(); procedure ButtonMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormMove(); procedure NaviDestroy(); published { Published-Deklarationen } property OnMouseMove; end; procedure Register; implementation procedure Register; begin RegisterComponents('bkModule', [Tbknavi]); end; constructor Tbknavi.Create(AOwner: TComponent); VAR i,x,y: Integer; cap: Array[1..5] of String; begin x:=800; y:=80; inherited Create (AOwner); SetBounds(0,0,x,y); akt:=false; // Wichtig, damit Paint erst ausgeführt wird, wenn das Array geladen ist //for i:=1 to 5 do //cap[i]:='Btn'+IntToStr(i); //naviCreate( 0, 0, x, y, 5, 1, cap, clBlue, clYellow, clBlack, clWhite, 'horizontal'); end; procedure Tbknavi.NaviDestroy(); begin try Anavi := nil; EXCEPT ShowMessage('Nichts kann nicht zerstört werden :P'); end; end; procedure Tbknavi.naviCreate(x1, y1, x2, y2: Integer; size, front: byte; text: Array of String; color, backColor, FontColor, FChover: TColor; Style:String); VAR i:byte; begin NaviDestroy; left:=x1-1; width:= x2+2; top:=y1-1; height:= y2+2; Asize:=size; Setlength(Anavi, size+1); for i:=1 to size do begin Anavi[i]:=TbkButton.Create(self); if style='horizontal' then begin Anavi[i].Top:=0; Anavi[i].Height:=y2; Anavi[i].Left:=round(x2/size)*(i-1); Anavi[i].Width:=round(x2/size); end else if style='vertikal' then begin Anavi[i].Top:=round((y2/size)*(i-1)); Anavi[i].Height:=round(y2/size); Anavi[i].Left:=0; Anavi[i].Width:=x2; end else begin ShowMessage('Undefinierter Bezeichner "'+style+'"'); exit; end; Anavi[i].bkSetButtonMode(color, backColor, FontColor, FCHover, 'bkSimple'); Anavi[i].BLabel.Caption:=text[i]; Anavi[i].Tag:=i; Anavi[i].ButtonPaint(true, false); end; { BtnBorder:=TbkBorder.Create(self); BtnBorder.bkBorderDock(Anavi[1],Anavi[size],'bkDark'); } if front=1 then BringToFront else SendToBack; // SetOnMouseMove; akt:=true; end; procedure Tbknavi.SetOnMouseMove(); // VAR i:Integer; begin // for i:=1 to Asize do // Anavi[i].OnMouseMove:= ButtonMouseMove; end; procedure Tbknavi.ButtonMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // NaviPaint(Sender as TbkButton, false); end; procedure TbkNavi.FormMove(); begin if akt then //////////////////// NaviPaint(Anavi[1], true); end; procedure Tbknavi.NaviPaint(id: TbkButton; form: Boolean); VAR i:byte; begin if akt then begin //////////////////// for i:=1 to Asize do begin if not(id=Anavi[i])or(form) then Anavi[i].ButtonPaint(false, false); end; if not(form) then id.ButtonPaint(true, false); end; { BtnBorder.Design; } end; procedure Tbknavi.Paint(); begin FormMove; end; end. |
Re: Fehler: Element '' hat kein Übergeordnetes Fenster.
Hallo!
Ist schon eine Weile her, dass ichDelphi programmiert habe, aber versuch doch mal, den Parent deiner Komponenten explizit zu setzen (Control.Parent := ...). Wenn ich mich richtig erinnere reicht der Owner alleine nicht aus. Kann aber auch sein, dass ich mich irre. Dust Signs |
Re: Fehler: Element '' hat kein Übergeordnetes Fenster.
du bist der größte danke^^. warum ist das denn so wichtig?
|
Re: Fehler: Element '' hat kein Übergeordnetes Fenster.
Weil der Parent für die Anzeige zuständig ist. der Owner sorgt nur für die Freigabe
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz