Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Element '' hat kein übergeordnetes Fenster (https://www.delphipraxis.net/43397-element-hat-kein-uebergeordnetes-fenster.html)

Pseudemys Nelsoni 3. Apr 2005 13:18


Element '' hat kein übergeordnetes Fenster
 
Tag,

es geht hier um eine abgeleitete Komponente von RichEdit.

Ich erhalte diesen Fehler (siehe Topic) sobald ich das nachgebildete RichEdit auf meine Form packe, nur wieso?

Im Create steht folgendes:

Delphi-Quellcode:
constructor TpbIRCChatBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  OldWndProc := WindowProc;
  WindowProc := NewWndProc;
end;
Ich habe nach der Fehlermeldung im Forum gesucht und habe daraus gelesen, das das daher kommt weil kein Parent angegeben ist, richtig? Wenn dem so ist, wie kann ich dann den Parent wissen wenn ich gar nicht weiss wo ich das richedit nachher draufpacke?

Christian Seehase 3. Apr 2005 13:23

Re: Element '' hat kein übergeordnetes Fenster
 
Moin Mario,

such' dazu mal nach Hier im Forum suchenCreateWnd

In der Prozedur sollten solche Zuweisungen funktionieren.

SirThornberry 3. Apr 2005 13:26

Re: Element '' hat kein übergeordnetes Fenster
 
im Create der Componente ist kein parent angegeben, und somit existiert auch noch keine WindowProc dafür.

Pseudemys Nelsoni 3. Apr 2005 13:36

Re: Element '' hat kein übergeordnetes Fenster
 
@Christian: ich schau mal nach, danke.

@SirThornberry: Du hast recht es liegt an dein beiden letzten Zeilen des Create's...hmmm. Wo sollte man denn due windowproc sonst umbiegen? im onshow?

Dani 3. Apr 2005 14:14

Re: Element '' hat kein übergeordnetes Fenster
 
Christian Seehase hat's doch geschrieben... du musst die Prozedur CreateWnd überschreiben.

Delphi-Quellcode:
procedure TpbIRCChatBox.CreateWnd;
begin
  inherited CreateWnd);
  OldWndProc := WindowProc;
  WindowProc := NewWndProc;
end;

SirThornberry 3. Apr 2005 14:31

Re: Element '' hat kein übergeordnetes Fenster
 
alternativ kannst du auch CreateParams überschreiben wobei das aufs gleiche hinaus läuft.

Pseudemys Nelsoni 3. Apr 2005 17:32

Re: Element '' hat kein übergeordnetes Fenster
 
Moin,

so ich habe CreateWnd überschrieben.

Nun wenn ich mein Programm beende ist es erstmal 1min gefroren und dann bekomme ich eine AV "Stack Overflow".

Weiss jemand was zu tun ist?

Sieht nun ca so aus:

Delphi-Quellcode:
unit pbIRCChatBox;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls, ComCtrls;

type
  TpbIRCChatBox = class(TRichEdit)
  private
    FWndProc: TWndMethod;
    procedure nWndProc(var Msg: TMessage);
  protected
    procedure CreateWnd; override;
  end;

procedure Register;

implementation

procedure TpbIRCChatBox.nWndProc(var Msg: TMessage);
begin
  FWndProc(Msg);
  HideCaret(Handle);
end;

procedure TpbIRCChatBox.CreateWnd;
begin
  inherited CreateWnd;
  FWndProc := WindowProc;
  WindowProc := nWndProc;
end;

procedure Register;
begin
  RegisterComponents('pb', [TpbIRCChatBox]);
end;

end.
ich sehe nicht das was falsch sein könnte oder?

SirThornberry 3. Apr 2005 17:33

Re: Element '' hat kein übergeordnetes Fenster
 
du musst im destroy das ganze auch wieder zurück setzen

Pseudemys Nelsoni 3. Apr 2005 17:49

Re: Element '' hat kein übergeordnetes Fenster
 
Verstehe ich nicht, wird durch "FWndProc(Msg);" nicht das gleiche getan als wenn ich es zurücksetze?

Btw, ich habe es nun so:


Delphi-Quellcode:
destructor TpbIRCChatBox.Destroy;
begin
  WindowProc := FWndProc;
  inherited;
end;
trotzdem gleicher fehler.

SirThornberry 3. Apr 2005 17:59

Re: Element '' hat kein übergeordnetes Fenster
 
hast du dir nach dem Fehler mal den CallStack anzeigen lassen um zu sehen durch welche procedure/function das ganze ausgelöst wird?

Pseudemys Nelsoni 3. Apr 2005 18:01

Re: Element '' hat kein übergeordnetes Fenster
 
Der grüne Pfeil zeigt nach der Exception auf das "begin" hier:

Delphi-Quellcode:
procedure TpbIRCChatBox.nWndProc(var Msg: TMessage);
begin
  FWndProc(Msg);
  HideCaret(Handle);
end;

SirThornberry 3. Apr 2005 18:02

Re: Element '' hat kein übergeordnetes Fenster
 
und was steht im callstack?????? (View->Debug windows->callstack)?

Pseudemys Nelsoni 3. Apr 2005 18:05

Re: Element '' hat kein übergeordnetes Fenster
 
http://www.n1ght.de/callstack.JPG

Da sind viele weitere lines mit der (???) message, aber anscheinend kann man das ganze nicht in ner textdatei speichern daher als bild

Christian Seehase 3. Apr 2005 19:00

Re: Element '' hat kein übergeordnetes Fenster
 
Moin Mario,

solch Zuweisungen in CreateWnd dürfen nur einmal gemacht werden.
Setze Dir am Besten ein Flag um das zu bewerkstelligen.

Pseudemys Nelsoni 3. Apr 2005 19:48

Re: Element '' hat kein übergeordnetes Fenster
 
Moin christian,

wird createwnd denn mehrmals ausgefürht?

Sprint 3. Apr 2005 20:00

Re: Element '' hat kein übergeordnetes Fenster
 
Delphi-Quellcode:
unit pbIRCChatBox;

interface

uses
  Windows, Messages, Classes, ComCtrls;

type
  TpbIRCChatBox = class(TRichEdit)
  protected
    procedure WndProc(var Message: TMessage); override;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('pb', [TpbIRCChatBox]);
end;

{ TpbIRCChatBox }

procedure TpbIRCChatBox.WndProc(var Message: TMessage);
begin
  if Message.Msg <> WM_PAINT then
    if Assigned(Parent) then
      HideCaret(Handle);
  inherited WndProc(Message);
end;

end.

Pseudemys Nelsoni 3. Apr 2005 20:57

Re: Element '' hat kein übergeordnetes Fenster
 
Hallo Sprint,

das funktioniert soweit. Es gibt nur ein Problem, der Caret(falls ich den noch erwähnen darf(*g*) ist beim starten des Programms zu sehen, der sollte da natürlich nich da sein. Hast du vielleicht noch ne idee wie ich den direkt nachdem create wegkriege? Er ist erst weg sobald ich mit der maus rüberfahre

xcellent 2. Feb 2006 09:36

Re: Element '' hat kein übergeordnetes Fenster
 
Auch wenn das Thema bereits lang zurück liegt:

Dieser Fehler tritt auf, wenn kein Parent zugewiesen worden ist:

NeuesObjekt := TNewObjekt.Create(Form); //Neues Objekt erstellen - hier ist AOwner die Form
NeuesObjekt.Parent := Form; //und Parent muss auch gesetzt werden - ebenfalls die Form

Habe das Problem mal vor langer Zeit auf dem Quickreport gehabt. Als ich einer QRRichText-Komponente seine ParentRichEdit-Komponente zuordnen wollte und kein echtes TRichEdit auf dem Report zur Verfügung stehen hatte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 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