Einzelnen Beitrag anzeigen

Phiennes

Registriert seit: 30. Nov 2008
Ort: Bochum
30 Beiträge
 
#1

Fehler: Element '' hat kein Übergeordnetes Fenster.

  Alt 22. Mai 2009, 08: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='horizontalthen 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='vertikalthen 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 .
  Mit Zitat antworten Zitat