SIGSEV in Resize

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

SIGSEV in Resize

Beitrag von Mathias »

Ich habe eine neue Komponente von TGroupBox abgeleitet.
In dieser befindet sich eine CheckBox.
Wen ich der CheckBox ein neues Left in Resize zuordnen will, knallt es.
Wieso ?

Code: Alles auswählen

type
  TNewGroupBox = class(TGroupBox)
  private
    CheckBox: TCheckBox;
    constructor Create(AOwner: TComponent); override;
    procedure Resize; override;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    NewGroupBox: TNewGroupBox;
  public
  end;  

Code: Alles auswählen

constructor TNewGroupBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  CheckBox := TCheckBox.Create(Self);
  CheckBox.Parent := Self;
end;

procedure TNewGroupBox.Resize;
begin
  inherited Resize;
  CheckBox.Left := 10;   // Hier Knallt es
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  NewGroupBox := TNewGroupBox.Create(Self);
  NewGroupBox.Parent := Self;
end; 
Im Anhang die komplette Source.
Dateianhänge
GroupBox_Test.zip
(105.36 KiB) 132-mal heruntergeladen
Zuletzt geändert von Mathias am So 21. Jun 2020, 13:48, insgesamt 1-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: SIGESV in Resize

Beitrag von wp_xyz »

Weil Resize schon aufgerufen wird, bevor die Checkbox existiert. (Setze einen Breakpoint auf "cp := TCheckbox.Create" und auf "cp.Left := 10").

So geht's:

Code: Alles auswählen

procedure TNewGP.Resize;
var
  i: integer;
begin
  inherited Resize;
  if cp <> nil then
    cp.Left := 10;
end; 

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: SIGESV in Resize

Beitrag von Mathias »

Sieht irgendwie unüblich aus. 🙄
So wie es aussieht, ruft der Constructor Resize auf.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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: SIGESV in Resize

Beitrag von Winni »

Hallo!

Während Form.Create wird resize der Children mehrfach aufgerufen.
Habe solche crashes auch schon erlebet.
Workaround:

Code: Alles auswählen

procedure TNewGroupBox.Resize;
begin
  inherited Resize;
  if assigned (Checkbox) then CheckBox.Left := 10;   // Hier Knallt es
end;

Winni

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: SIGESV in Resize

Beitrag von wp_xyz »

Mathias hat geschrieben:
Sa 20. Jun 2020, 08:20
Sieht irgendwie unüblich aus. 🙄
Wieso? Im Constructor werden Höhe und Breite des Controls gesetzt.

Antworten