Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Sonderbares verhalten von Align in eigener Komponente (https://www.delphipraxis.net/159450-sonderbares-verhalten-von-align-eigener-komponente.html)

RaSoWa1 28. Mär 2011 19:07

Sonderbares verhalten von Align in eigener Komponente
 
Hallo,

ich habe mir untenstehende Komponente abgeleitet. Sie funktioniert auch wie sie soll. Nur zeigt sie zur Entwurfszeit ein sonderbares Verhalten:
  1. Wenn ich sie aus der Komponentenpalette auf ein z.B. Panel ziehe und anschließend im Objektinspektor die Eigenschaft Align auf alClient setze, füllt sie das ganze Formular aus, statt das Panel.
  2. Wenn ich diese Komponente dann mit Ausschneiden/Einfügen auf das Panel lege, füllt sie, wie es richtig ist, nur das Panel aus.
Ich vermute: bei 1. wird das Formular der Besitzer und nicht das Panel, wie vorgesehen.
Habe ich einen Fehler imn Code?

Gruß Klaus.
Delphi-Quellcode:
type
  TFileAuswahl = class(TCustomPanel)
  private  { Private-Deklarationen }
    FShellTreeView        : TShellTreeView;
    FSplitter             : TSplitter;
    FPanelGrd,
    FPanelPath,
    FPanelBtn             : TPanel;
    FBtnAlles,
    FBtnNichts,
    FBtnUmkehr            : TButton;

    FGrdFiles             : TFilterGrid;
    FGrdFilesOnClick      : TNotifyEvent;
    FGrdFilesDblClick     : TNotifyEvent;

....

    function Create_GrdFiles(aOwner: TWinControl): TFilterGrid;
    function Create_ShellTreeView(aOwner: TWinControl): TShellTreeView;
    function Create_Splitter(aOwner: TWinControl): TSplitter;
    function Create_PanelGrd(aOwner: TWinControl): TPanel;
    function Create_PanelPath(aOwner: TWinControl): TPanel;
    function Create_PanelBtn(aOwner: TWinControl): TPanel;
    function Create_Button(aOwner: TWinControl; mode: Integer): TButton;
......
  protected { Protected-Deklarationen }
  public   { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

  published { Published-Deklarationen }
    // aus ExtCtrls:
    property Align;
    property AutoSize;
    property Anchors;
    property BevelEdges;
    property BevelInner;
    property BevelKind;
    property BevelOuter;
    property BevelWidth;
    property BorderWidth;
    property BorderStyle;
    property Constraints;
    property Ctl3D;
    property DoubleBuffered;
    property Enabled;
    property FullRepaint;
    property Visible;
    property ParentShowHint;
    property PopupMenu;
    property ShowHint;
    property TabOrder;
    property TabStop;
    property OnResize;

    // eigene:

    property Path: String read GetPath write SetPath;
    property Filename: String read GetFilename;

.....
  end;

implementation

constructor TFileAuswahl.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Parent               := AOwner as TWinControl;

  FShellTreeView       := Create_ShellTreeView(Self);
  FSplitter            := Create_Splitter(Self);
  FPanelGrd            := Create_PanelGrd(Self);
  FPanelPath           := Create_PanelPath(FPanelGrd);
  FPanelBtn            := Create_PanelBtn(FPanelGrd);
  FBtnUmkehr           := Create_Button(FPanelBtn, 3);
  FBtnNichts           := Create_Button(FPanelBtn, 2);
  FBtnAlles            := Create_Button(FPanelBtn, 1);
  FGrdFiles            := Create_GrdFiles(FPanelGrd);
......

end;

destructor TFileAuswahl.Destroy;
begin
  FPicIcon.Free;
  FShellTreeView.Free;
  FSplitter.Free;
  FGrdFiles.Free;
  inherited;
end;

dataspider 28. Mär 2011 19:14

AW: Sonderbares verhalten von Align in eigener Komponente
 
Hi,

das ist auch logisch.
Die Zeile mit dem Parent zuweisen kannst bzw. musst du weglassen.
Denn für in der IDE erstellte Controls ist immer das Form der Owner.

Frank

RaSoWa1 28. Mär 2011 19:30

AW: Sonderbares verhalten von Align in eigener Komponente
 
Zitat:

Zitat von dataspider (Beitrag 1091625)
Hi,

das ist auch logisch.
Die Zeile mit dem Parent zuweisen kannst bzw. musst du weglassen.
Denn für in der IDE erstellte Controls ist immer das Form der Owner.

Frank

Dann kommt zur Entwurfzeit (und auch zur Laufzeit) folgende Fehlermeldung: "Element '' hat kein übergeordnetes Fenster"

dataspider 28. Mär 2011 19:53

AW: Sonderbares verhalten von Align in eigener Komponente
 
Zitat:

Zitat von RaSoWa1 (Beitrag 1091628)
Dann kommt zur Entwurfzeit (und auch zur Laufzeit) folgende Fehlermeldung: "Element '' hat kein übergeordnetes Fenster"

Der Fehler hat damit aber nichts zu tun.

Kommentiere doch mal im Konstruktor alles ausser das inherited aus.
Dann wird es IMHO funktionieren. Oder häng doch mal den kompletten Code an.

Frank

RaSoWa1 28. Mär 2011 20:07

AW: Sonderbares verhalten von Align in eigener Komponente
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von dataspider (Beitrag 1091630)
Zitat:

Zitat von RaSoWa1 (Beitrag 1091628)
Dann kommt zur Entwurfzeit (und auch zur Laufzeit) folgende Fehlermeldung: "Element '' hat kein übergeordnetes Fenster"

Der Fehler hat damit aber nichts zu tun.

Kommentiere doch mal im Konstruktor alles ausser das inherited aus.
Dann wird es IMHO funktionieren. Oder häng doch mal den kompletten Code an.

Frank

Du hattest Recht.
Ich habe den Code als Anhang mal angefügt.
Ich muß mich aber jetzt leider bis morgen verabschieden.

Gruß Klaus

dataspider 29. Mär 2011 08:13

AW: Sonderbares verhalten von Align in eigener Komponente
 
Hi Klaus,

ich kann deinen Code auf Grund fehlender Unit' s nicht kompilieren und testen.

Aber es ist wohl so:
Du richtest die Komponenten im Constructor schon aus und fragst Height und Width des Panels schon ab.
Somit kommt der Fehler schon durch das noch nicht vorhandene Parent zustande.

Ich würde die Komponenten im Constructor nur erzeugen und eine Methode PositionControls einführen.
Diese könnte man in der überschriebenen Methode CreateWnd nach dem Inherited aufrufen.
Dann sollte das Fensterhandle verfügbar sein.

Frank

RaSoWa1 30. Mär 2011 08:41

AW: Sonderbares verhalten von Align in eigener Komponente
 
Hallo Frank,

Danke für deine Hilfe.

Zitat:

Zitat von dataspider (Beitrag 1091677)
Hi Klaus,

ich kann deinen Code auf Grund fehlender Unit' s nicht kompilieren und testen.

Ich habe deshalb in einem geänderten Code, statt der von TStringGrid abgeleiteten Komponente TFilterGrid, TStringGrid verwendet. Und es hat eigenartigerweise plötzlich funktioniert. Also muß irgendwas bei TFilterGrid nicht stimmen. Aber was? Warum verhält sich TFilterGrid zur Entwurfszeit anders als TStringGrid?
TFilterGrid ist folgendermaßen deklariert:
Delphi-Quellcode:
  TFilterGrid     = class(TStringGrid)
  private
.....
    procedure Change; dynamic;
  public
    constructor Create(aOwner: TComponent); override;
    destructor Destroy; override;

    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure DrawCell(ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); override;
    function SelectCell(ACol, ARow: LongInt): boolean; override;
    function GetEditText(ACol, ARow: Longint): string; override;
    procedure SetEditText(ACol, ARow: Longint; const Value: string); override;
......


constructor TFilterGrid.Create(aOwner: TComponent);
begin
  inherited Create(aOwner);
.....  // es werden nur Variable initiert.

end;
Zitat:

Zitat von dataspider (Beitrag 1091677)
Ich würde die Komponenten im Constructor nur erzeugen und eine Methode PositionControls einführen.
Diese könnte man in der überschriebenen Methode CreateWnd nach dem Inherited aufrufen.
Dann sollte das Fensterhandle verfügbar sein.

Ich habe es dann so gemacht und es funktioniert.

Gruß Klaus.


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