Wann kann ein Control Parent für andere Controls sein?

Rund um die LCL und andere Komponenten
Antworten
wennerer
Beiträge: 519
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Wann kann ein Control Parent für andere Controls sein?

Beitrag von wennerer »

Hallo an Alle,
wenn ich eine Komponente von TCustomPanel ableite kann dieses Control als Parent fungieren. Das bedeutet ich kann darauf zum Beispiel Buttons plazieren.
Versuche ich auf ein Control das von TCustomControl abstammt (zur Designzeit) einen Button zu platzieren so wird mir als Parent die darunter liegende Form angezeigt.
Da TCustomPanel direkt von TCustomControl abgeleitet ist dachte ich im Vergleich der Beiden den Grund für dieses unterschiedliche Verhalten zu finden.
Leider komme ich da nicht wirklich weiter. Weiß jemand wann ein Control Childcontrols haben kann?

Viele Grüße
Bernd

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Wann kann ein Control Parent für andere Controls sein?

Beitrag von Winni »

Hi!

Visuelles Control anklicken --> rechte Maustaste --> Change Parent

Winni

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Wann kann ein Control Parent für andere Controls sein?

Beitrag von Winni »

Hi!


Das hilft Dir bestimmt weiter:

Code: Alles auswählen

TControl = class(TLCLComponent)
...
public
 function CheckChildClassAllowed(ChildClass: TClass;
                                    ExceptionOnInvalid: boolean): boolean;
...
end;


Winni

wennerer
Beiträge: 519
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Wann kann ein Control Parent für andere Controls sein?

Beitrag von wennerer »

Hallo Winni,
erstmal Danke.
Also
Visuelles Control anklicken --> rechte Maustaste --> Change Parent
funktioniert leider nicht. Wenn ich ein Control von TCustomControl ableite kann ich dieses nicht als Parent wählen. Da fehlt was.
Das weiße auf dem Bild ist mein kleines Control. Man sieht den Button drauf, Parent is Form1.
Parent1.png
Parent1.png (25.81 KiB) 818 mal betrachtet

Das mit der function CheckChildClassAllowed schau ich mir jetzt mal an.

Mein kleiner Code, schreibe ich hier statt TCustomControl TCustomPanel rein dann funktioniert es als Parent:

Code: Alles auswählen

unit Layer;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls;

type

  { TLayer }

  TLayer = class(TCustomControl)
  private

  protected

  public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   procedure Paint; override;
  published
   property Width;
   property Height;
   property Visible;
  end;

procedure Register;

implementation

procedure Register;
begin
  {$I layer_icon.lrs}
  RegisterComponents('Others',[TLayer]);
end;

{ TLayer }

constructor TLayer.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Width := 30;
  Height:= 30;

end;

destructor TLayer.Destroy;
begin
  inherited Destroy;
end;

procedure TLayer.Paint;
begin
  inherited Paint;
  canvas.Brush.Color:= clWhite;
  canvas.FillRect(0,0,width,height);
end;


end.

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Wann kann ein Control Parent für andere Controls sein?

Beitrag von Sieben »

Damit ein Control Children akzeptiert, also als Parent fungieren kann, muss es csAcceptsControls in seinem ControlStyle haben. Das wird im angesprochenen Fall in TCustomPanel.Create gesetzt:

Code: Alles auswählen

ControlStyle := ControlStyle + [csAcceptsControls, csCaptureMouse,
    csClickEvents, csSetCaption, csDoubleClicks, csReplicatable,
    csNoFocus, csAutoSize0x0, csParentBackground]
    - [csOpaque]; // we need the default background

wennerer
Beiträge: 519
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Wann kann ein Control Parent für andere Controls sein?

Beitrag von wennerer »

Hallo sieben,
ich danke dir recht herzlich. Jetzt geht es!

Viele Grüße
Bernd

Antworten