mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-11 12:42:32 +02:00
196 lines
5.4 KiB
ObjectPascal
196 lines
5.4 KiB
ObjectPascal
{ $Id$}
|
|
{
|
|
*****************************************************************************
|
|
* lclclasses.pp *
|
|
* ------------- *
|
|
* *
|
|
* *
|
|
*****************************************************************************
|
|
|
|
*****************************************************************************
|
|
* *
|
|
* This file is part of the Lazarus Component Library (LCL) *
|
|
* *
|
|
* See the file COPYING.modifiedLGPL, included in this distribution, *
|
|
* for details about the copyright. *
|
|
* *
|
|
* This program is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
|
* *
|
|
*****************************************************************************
|
|
|
|
Defines the base class for all LCL TComponents including controls.
|
|
}
|
|
unit LCLClasses;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, WSLCLClasses, LCLType, LCLProc;
|
|
|
|
type
|
|
|
|
{ TLCLComponent }
|
|
|
|
TLCLComponent = class(TComponent)
|
|
private
|
|
FWidgetSetClass: TWSLCLComponentClass;
|
|
protected
|
|
public
|
|
constructor Create(TheOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure BeforeDestruction; override; // fixes missing call to Destroying in FPC
|
|
class function NewInstance: TObject; override;
|
|
procedure RemoveAllHandlersOfObject(AnObject: TObject); virtual;
|
|
property WidgetSetClass: TWSLCLComponentClass read FWidgetSetClass;
|
|
end;
|
|
|
|
{ TLCLHandleComponent }
|
|
// A base class for all components having a handle
|
|
|
|
TLCLHandleComponent = class(TLCLComponent)
|
|
private
|
|
FHandle: TLCLIntfHandle;
|
|
FCreating: Boolean; // Set if we are creating the handle
|
|
function GetHandle: TLCLIntfHandle;
|
|
function GetHandleAllocated: Boolean;
|
|
protected
|
|
procedure CreateParams(var AParams: TCreateParams); virtual;
|
|
procedure DestroyHandle;
|
|
procedure HandleCreated; virtual; // gets called after the Handle is created
|
|
procedure HandleDestroying; virtual; // gets called before the Handle is destroyed
|
|
procedure HandleNeeded;
|
|
function WSCreateHandle(AParams: TCreateParams): TLCLIntfHandle; virtual;
|
|
procedure WSDestroyHandle; virtual;
|
|
protected
|
|
public
|
|
destructor Destroy; override;
|
|
property Handle: TLCLIntfHandle read GetHandle;
|
|
property HandleAllocated: Boolean read GetHandleAllocated;
|
|
end;
|
|
|
|
implementation
|
|
|
|
constructor TLCLComponent.Create(TheOwner: TComponent);
|
|
begin
|
|
inherited Create(TheOwner);
|
|
{$IFDEF DebugLCLComponents}
|
|
//DebugLn('TLCLComponent.Create ',DbgSName(Self));
|
|
DebugLCLComponents.MarkCreated(Self,DbgSName(Self));
|
|
{$ENDIF}
|
|
end;
|
|
|
|
destructor TLCLComponent.Destroy;
|
|
begin
|
|
{$IFDEF DebugLCLComponents}
|
|
//DebugLn('TLCLComponent.Destroy ',DbgSName(Self));
|
|
DebugLCLComponents.MarkDestroyed(Self);
|
|
{$ENDIF}
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TLCLComponent.BeforeDestruction;
|
|
begin
|
|
inherited;
|
|
Destroying;
|
|
end;
|
|
|
|
class function TLCLComponent.NewInstance: TObject;
|
|
begin
|
|
Result := inherited NewInstance;
|
|
TLCLComponent(Result).FWidgetSetClass := FindWSComponentClass(Self);
|
|
if TLCLComponent(Result).FWidgetSetClass = nil
|
|
then TLCLComponent(Result).FWidgetSetClass := TWSLCLComponent;
|
|
end;
|
|
|
|
procedure TLCLComponent.RemoveAllHandlersOfObject(AnObject: TObject);
|
|
begin
|
|
end;
|
|
|
|
{ TLCLHandleComponent }
|
|
|
|
procedure TLCLHandleComponent.CreateParams(var AParams: TCreateParams);
|
|
begin
|
|
end;
|
|
|
|
destructor TLCLHandleComponent.Destroy;
|
|
begin
|
|
DestroyHandle;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TLCLHandleComponent.DestroyHandle;
|
|
begin
|
|
if FHandle <> 0 then
|
|
begin
|
|
HandleDestroying;
|
|
WSDestroyHandle;
|
|
FHandle := 0;
|
|
end;
|
|
end;
|
|
|
|
function TLCLHandleComponent.GetHandle: TLCLIntfHandle;
|
|
begin
|
|
if FHandle = 0 then HandleNeeded;
|
|
Result := FHandle;
|
|
end;
|
|
|
|
function TLCLHandleComponent.GetHandleAllocated: Boolean;
|
|
begin
|
|
Result := FHandle <> 0;
|
|
end;
|
|
|
|
procedure TLCLHandleComponent.HandleCreated;
|
|
begin
|
|
end;
|
|
|
|
procedure TLCLHandleComponent.HandleDestroying;
|
|
begin
|
|
end;
|
|
|
|
procedure TLCLHandleComponent.HandleNeeded;
|
|
var
|
|
Params: TCreateParams;
|
|
begin
|
|
if FHandle <> 0 then Exit;
|
|
|
|
if FCreating
|
|
then begin
|
|
// raise some error ?
|
|
DebugLn('TLCLHandleComponent: Circulair handle creation');
|
|
Exit;
|
|
end;
|
|
|
|
CreateParams(Params);
|
|
FCreating := True;
|
|
try
|
|
FHandle := WSCreateHandle(Params);
|
|
if FHandle = 0
|
|
then begin
|
|
// raise some error ?
|
|
DebugLn('TLCLHandleComponent: Handle creation failed');
|
|
Exit;
|
|
end;
|
|
finally
|
|
FCreating := False;
|
|
end;
|
|
HandleCreated;
|
|
end;
|
|
|
|
function TLCLHandleComponent.WSCreateHandle(AParams: TCreateParams): TLCLIntfHandle;
|
|
begin
|
|
// this function should be overriden in derrived class
|
|
Result := 0;
|
|
end;
|
|
|
|
procedure TLCLHandleComponent.WSDestroyHandle;
|
|
begin
|
|
TWSLCLHandleComponentClass(WidgetSetClass).DestroyHandle(Self);
|
|
end;
|
|
|
|
end.
|
|
|