AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Sonderbares verhalten von Align in eigener Komponente
Thema durchsuchen
Ansicht
Themen-Optionen

Sonderbares verhalten von Align in eigener Komponente

Ein Thema von RaSoWa1 · begonnen am 28. Mär 2011 · letzter Beitrag vom 30. Mär 2011
Antwort Antwort
RaSoWa1

Registriert seit: 1. Jun 2006
Ort: Halle/Saale
140 Beiträge
 
Delphi 2010 Professional
 
#1

Sonderbares verhalten von Align in eigener Komponente

  Alt 28. Mär 2011, 20:07
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;
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Sonderbares verhalten von Align in eigener Komponente

  Alt 28. Mär 2011, 20:14
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
Frank Reim
  Mit Zitat antworten Zitat
RaSoWa1

Registriert seit: 1. Jun 2006
Ort: Halle/Saale
140 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Sonderbares verhalten von Align in eigener Komponente

  Alt 28. Mär 2011, 20:30
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"
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Sonderbares verhalten von Align in eigener Komponente

  Alt 28. Mär 2011, 20:53
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
Frank Reim
  Mit Zitat antworten Zitat
RaSoWa1

Registriert seit: 1. Jun 2006
Ort: Halle/Saale
140 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Sonderbares verhalten von Align in eigener Komponente

  Alt 28. Mär 2011, 21:07
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
Angehängte Dateien
Dateityp: pas FileAuswahl.pas (16,0 KB, 5x aufgerufen)
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Sonderbares verhalten von Align in eigener Komponente

  Alt 29. Mär 2011, 09:13
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
Frank Reim
  Mit Zitat antworten Zitat
RaSoWa1

Registriert seit: 1. Jun 2006
Ort: Halle/Saale
140 Beiträge
 
Delphi 2010 Professional
 
#7

AW: Sonderbares verhalten von Align in eigener Komponente

  Alt 30. Mär 2011, 09:41
Hallo Frank,

Danke für deine Hilfe.

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;
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.
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:02 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