Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehler: Element '' hat kein Übergeordnetes Fenster. (https://www.delphipraxis.net/134442-fehler-element-hat-kein-uebergeordnetes-fenster.html)

Phiennes 22. Mai 2009 08:33


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:
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 :P.

Dust Signs 22. Mai 2009 08:55

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

Phiennes 22. Mai 2009 09:23

Re: Fehler: Element '' hat kein Übergeordnetes Fenster.
 
du bist der größte danke^^. warum ist das denn so wichtig?

mkinzler 22. Mai 2009 09:25

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 13:07 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