Registriert seit: 1. Dez 2008
Ort: Bochum
30 Beiträge
|
Fehler: Element '' hat kein Übergeordnetes Fenster.
22. Mai 2009, 09:33
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:
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.
Ich flehe um Hilfe, ich muss irgendwie ein Brett vor dem Kopf haben .
|