[Lazarus] TSynEdit bug in destructor?

Bart bartjunk64 at gmail.com
Tue Nov 8 16:39:00 CET 2011


Hi,

I stumbled upon this bug (?).

Consider the following simple application.

unit main;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, SynEdit, Forms, Controls, Graphics, Dialogs,
  StdCtrls, LCLType, LCLProc;

type

  { TForm1 }

  TForm1 = class(TForm)
    CreateBtn: TButton;
    FreeBtn: TButton;
    procedure CreateBtnClick(Sender: TObject);
    procedure FreeBtnClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { private declarations }
    Ed: TSynEdit;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  Ed := nil;
  KeyPreview := True;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift:
TShiftState);
begin
  if (Key = VK_F4) and (Shift = [ssCtrl]) and Assigned(Ed) then
  begin
    Debugln('Ctrl+F4');
    Key := 0;
    Ed.Free;
    Ed := nil;
  end;
end;

procedure TForm1.CreateBtnClick(Sender: TObject);
begin
  if Assigned(Ed) then Exit;
  Ed := TSynEdit.Create(Self);
  Ed.Align := alTop;
  Ed.Parent := Self;
  Ed.SetFocus;
end;

procedure TForm1.FreeBtnClick(Sender: TObject);
begin
  if not Assigned(Ed) then Exit;
  debugln('FreeBtnClick');
  Ed.Free;
  Ed := nil;
end;

end.


It creates and frees a TSynEdit at runtime.
Note that pressing Ctrl-F4 will also free the TSynEdit.

If you run the program and press the Free button, the TSynEdit gets freed OK.
If however you press Ctrl+F4 and at that moment the TSynEdit has
focus, then you get a warning when freeing the TSynEdit:

WARNING: TLCLComponent.Destroy with LCLRefCount>0. Hint: Maybe the component is
processing an event?

This happened to me in an app where I create TSynEdits derived control
on a TTabSheet, both created at runtime on a custom TPageControl
derived control.
It took me all afternoon to find out I hadn't screwed up the
constructor/destructors of my own controls, and it only happened via
the shortcut-key when the TSynEdit had focus.

Feauture or bug?

Bart




More information about the Lazarus mailing list