From e720286a6882e05e9433ed93c4f158409efd493c Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 12 Jul 2007 05:47:15 +0000 Subject: [PATCH] - all event attaching code moved to TQtWidget.AttachEvents, TQtWidget.DetachEvents and descendants - initial implementation of Qt Caret by *Andreas Hausladen* with changes. Compile with -dShowQtCaret to test - fixed bug caused memory corruption - other minor fixes git-svn-id: trunk@11465 - --- .gitattributes | 1 + lcl/interfaces/qt/qtcaret.pas | 401 ++++++++++++++++++ lcl/interfaces/qt/qtint.pp | 1 + lcl/interfaces/qt/qtwidgets.pas | 676 +++++++++++++++++++++++++++--- lcl/interfaces/qt/qtwinapi.inc | 49 +++ lcl/interfaces/qt/qtwinapih.inc | 10 + lcl/interfaces/qt/qtwsbuttons.pp | 17 +- lcl/interfaces/qt/qtwscalendar.pp | 17 +- lcl/interfaces/qt/qtwscomctrls.pp | 105 +---- lcl/interfaces/qt/qtwscontrols.pp | 89 ++-- lcl/interfaces/qt/qtwsextctrls.pp | 50 +-- lcl/interfaces/qt/qtwsforms.pp | 10 +- lcl/interfaces/qt/qtwsmenus.pp | 18 +- lcl/interfaces/qt/qtwsspin.pp | 50 +-- lcl/interfaces/qt/qtwsstdctrls.pp | 151 +------ 15 files changed, 1161 insertions(+), 484 deletions(-) create mode 100644 lcl/interfaces/qt/qtcaret.pas diff --git a/.gitattributes b/.gitattributes index 4295da6c53..9db7dc8abe 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2697,6 +2697,7 @@ lcl/interfaces/qt/interfaces.pp svneol=native#text/pascal lcl/interfaces/qt/qt4.pas svneol=native#text/plain lcl/interfaces/qt/qt43.pas -text lcl/interfaces/qt/qtcallback.inc svneol=native#text/pascal +lcl/interfaces/qt/qtcaret.pas svneol=native#text/pascal lcl/interfaces/qt/qtint.pp svneol=native#text/pascal lcl/interfaces/qt/qtlclintf.inc svneol=native#text/pascal lcl/interfaces/qt/qtlclintfh.inc svneol=native#text/pascal diff --git a/lcl/interfaces/qt/qtcaret.pas b/lcl/interfaces/qt/qtcaret.pas new file mode 100644 index 0000000000..aca301fa3c --- /dev/null +++ b/lcl/interfaces/qt/qtcaret.pas @@ -0,0 +1,401 @@ +{ + /*************************************************************************** + QtCaret.pas - Qt Caret Emulation + ------------------------------------- + + copyright (c) Andreas Hausladen + + adopted for Lazarus and Qt4 by Lazarus Team + + ***************************************************************************/ + + ***************************************************************************** + * * + * 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. * + * * + ***************************************************************************** +} + +unit QtCaret; +{$mode delphi}{$H+} + +interface + +uses + // Bindings +{$ifdef USE_QT_4_3} + qt43, +{$else} + qt4, +{$endif} + // Free Pascal + Classes, SysUtils, Types, + // Widgetset + QtObjects, QtWidgets, + // LCL + LCLType, LCLIntf, Graphics, ExtCtrls; + +// defines +{.$DEFINE ShowQtCaret} + +type + TEmulatedCaret = class(TComponent) + private + FTimer: TTimer; + FWndId: Cardinal; + FWidget: TQtWidget; + FPixmap: QPixmapH; + FWidth, FHeight: Integer; + FPos: TQtPoint; + FVisible: Boolean; + FVisibleState: Boolean; + FCritSect: TCriticalSection; + procedure SetPos(const Value: TQtPoint); + protected + procedure DoTimer(Sender: TObject); + procedure DrawCaret; virtual; + function CreateColorPixmap(Color: Cardinal): QPixmapH; + procedure SetWidget(AWidget: TQtWidget); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + + procedure Lock; + procedure Unlock; + + function CreateCaret(AWidget: TQtWidget; Pixmap: QPixmapH; Width, Height: Integer): Boolean; + function DestroyCaret: Boolean; + + function IsValid: Boolean; + + function Show(AWidget: TQtWidget): Boolean; + function Hide: Boolean; + + property Timer: TTimer read FTimer; + property Pos: TQtPoint read FPos write SetPos; + end; + +function CreateCaret(Widget: TQtWidget; Pixmap: QPixmapH; Width, Height: Integer): Boolean; overload; +function CreateCaret(Widget: TQtWidget; ColorCaret: Cardinal; Width, Height: Integer): Boolean; overload; +function HideCaret(Widget: TQtWidget): Boolean; +function ShowCaret(Widget: TQtWidget): Boolean; +function SetCaretPos(X, Y: Integer): Boolean; +function GetCaretPos(var Pt: TPoint): Boolean; +function DestroyCaret: Boolean; +procedure DrawCaret; + +implementation + +var + GlobalCaret: TEmulatedCaret = nil; + +procedure GlobalCaretNeeded; +begin + if GlobalCaret = nil then + GlobalCaret := TEmulatedCaret.Create(nil); +end; + +function QtPoint(X, Y: Integer): TQtPoint; +begin + Result.X := X; + Result.Y := Y; +end; + +procedure DrawCaret; +begin + GlobalCaretNeeded; + if Assigned(GlobalCaret) then + begin + GlobalCaret.Lock; + try + GlobalCaret.DrawCaret; + finally + GlobalCaret.Unlock; + end; + end; +end; + +function CreateCaret(Widget: TQtWidget; Pixmap: QPixmapH; Width, Height: Integer): Boolean; +begin + GlobalCaretNeeded; + GlobalCaret.Lock; + try + Result := GlobalCaret.CreateCaret(Widget, Pixmap, Width, Height); + finally + GlobalCaret.Unlock; + end; +end; + +function CreateCaret(Widget: TQtWidget; ColorCaret: Cardinal; Width, Height: Integer): Boolean; +begin + Result := CreateCaret(Widget, QPixmapH(ColorCaret), Width, Height); +end; + +function GetCaretBlinkTime: Cardinal; +begin + Result := QApplication_cursorFlashTime; +end; + +function SetCaretBlinkTime(uMSeconds: Cardinal): LongBool; +begin + Result := True; + try + QApplication_setCursorFlashTime(uMSeconds); + if assigned(GlobalCaret) then + begin + GlobalCaret.Lock; + try + GlobalCaret.Timer.Interval := GetCaretBlinkTime; + finally + GlobalCaret.Unlock; + end; + end; + except + Result := False; + end; +end; + +function HideCaret(Widget: TQtWidget): Boolean; +begin + GlobalCaretNeeded; + if Assigned(GlobalCaret) then + begin + GlobalCaret.Lock; + try + Result := GlobalCaret.Hide; + finally + GlobalCaret.Unlock; + end; + end + else + Result := false; +end; + +function ShowCaret(Widget: TQtWidget): Boolean; +begin + GlobalCaretNeeded; + GlobalCaret.Lock; + try + Result := GlobalCaret.Show(Widget); + finally + GlobalCaret.Unlock; + end; +end; + +function SetCaretPos(X, Y: Integer): Boolean; +begin + Result := True; + GlobalCaretNeeded; + GlobalCaret.Lock; + try + GlobalCaret.Pos := QtPoint(X, Y); + finally + GlobalCaret.Unlock; + end; +end; + +function GetCaretPos(var Pt: TPoint): Boolean; +begin + Result := True; + GlobalCaretNeeded; + GlobalCaret.Lock; + try + with GlobalCaret.Pos do + begin + Pt.x := X; + Pt.y := Y; + end; + finally + GlobalCaret.Unlock; + end; +end; + +function DestroyCaret: Boolean; +begin + if Assigned(GlobalCaret) then + begin + GlobalCaret.Lock; + try + Result := GlobalCaret.DestroyCaret; + finally + GlobalCaret.Unlock; + end; + end + else + Result := False; +end; + +{ TEmulatedCaret } + +constructor TEmulatedCaret.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + InitializeCriticalSection(FCritSect); + + FTimer := TTimer.Create(self); + FTimer.Enabled := False; + FTimer.Interval := GetCaretBlinkTime; + FTimer.OnTimer := DoTimer; +end; + +destructor TEmulatedCaret.Destroy; +begin + DestroyCaret; + DeleteCriticalSection(FCritSect); + inherited Destroy; +end; + +function TEmulatedCaret.CreateCaret(AWidget: TQtWidget; Pixmap: QPixmapH; + Width, Height: Integer): Boolean; +begin + DestroyCaret; + SetWidget(AWidget); + FWidth := Width; + FHeight := Height; + if Cardinal(Pixmap) > $FFFF then + FPixmap := QPixmap_create(Pixmap) + else + FPixmap := CreateColorPixmap(Integer(Pixmap)); + + Result := IsValid; +{$IFDEF ShowQtCaret} + FTimer.Enabled := True; +{$ENDIF} +end; + +function TEmulatedCaret.DestroyCaret: Boolean; +begin + FTimer.Enabled := False; + Hide; + if Assigned(FPixmap) then + QPixmap_destroy(FPixmap); + FWidget := nil; + FPixmap := nil; + FWidth := 0; + FHeight := 0; + Result := not IsValid; +end; + +procedure TEmulatedCaret.DrawCaret; +var + DestDev: QPaintDeviceH; + Painter: QPainterH; + R: TRect; +begin + if IsValid and FVisible and FVisibleState then + begin +{$IFDEF ShowQtCaret} + DestDev := QWidget_to_QPaintDevice(FWidget.Widget); + Painter := QPainter_create(DestDev); + R := Rect(0, 0, QPixmap_width(FPixmap), QPixmap_height(FPixmap)); + QPainter_drawPixmap(Painter, PQtPoint(@FPos), FPixmap, PRect(@R)); + QPainter_destroy(Painter); +{$ENDIF} + end; +end; + +function TEmulatedCaret.Show(AWidget: TQtWidget): Boolean; +begin + if FWidget <> AWidget then + begin + Hide; + SetWidget(AWidget); + end; + Result := IsValid; + if Result then + FVisible := True; +end; + +function TEmulatedCaret.Hide: Boolean; +begin + Result := IsValid; + if Result and FVisible then + FVisible := False; +end; + +procedure TEmulatedCaret.SetPos(const Value: TQtPoint); +begin + if FVisible and ((FPos.x <> Value.x) or (FPos.y <> Value.y)) then + begin + Hide; + try + FPos := Value; + finally + Show(FWidget); + end; + end + else + FPos := Value; +end; + +procedure TEmulatedCaret.DoTimer(Sender: TObject); +begin + FVisibleState := not FVisibleState; + if FVisible and (FWidget <> nil) and not FWidget.InPaint then + FWidget.Repaint; +end; + +procedure TEmulatedCaret.Lock; +begin + EnterCriticalSection(FCritSect); +end; + +procedure TEmulatedCaret.Unlock; +begin + LeaveCriticalSection(FCritSect); +end; + +function TEmulatedCaret.CreateColorPixmap(Color: Cardinal): QPixmapH; +var + QC: TQColor; +begin + if (FWidth <= 0) or (FHeight <= 0) then + Result := nil + else + begin + case Color of + 0: ColorRefToTQColor(clBlack, QC); + 1: ColorRefToTQColor(clGray, QC); + else + Result := nil; + Exit; + end; + Result := QPixmap_create(FWidth, FHeight); + try + QPixmap_fill(Result, @QC); + except + QPixmap_destroy(Result); + Result := nil; + end; + end; +end; + +function TEmulatedCaret.IsValid: Boolean; +begin + Result := (FWidget <> nil) and (FPixmap <> nil) and + (QWidget_find(FWndId) <> nil); +end; + +procedure TEmulatedCaret.SetWidget(AWidget: TQtWidget); +begin + if FWidget <> nil then + FWidget.HasCaret := False; + + FWidget := AWidget; + if FWidget <> nil then + begin + FWndId := QWidget_winId(FWidget.Widget); + FWidget.HasCaret := True; + end + else + FWndId := 0; +end; + +end. diff --git a/lcl/interfaces/qt/qtint.pp b/lcl/interfaces/qt/qtint.pp index a06fed0c0a..8b6769f8de 100644 --- a/lcl/interfaces/qt/qtint.pp +++ b/lcl/interfaces/qt/qtint.pp @@ -147,6 +147,7 @@ uses QtWSSpin, QtWSStdCtrls, // QtWSToolwin, + QtCaret, QtThemes, //////////////////////////////////////////////////// Graphics, buttons, Menus, diff --git a/lcl/interfaces/qt/qtwidgets.pas b/lcl/interfaces/qt/qtwidgets.pas index 033790d802..2a9982ac82 100644 --- a/lcl/interfaces/qt/qtwidgets.pas +++ b/lcl/interfaces/qt/qtwidgets.pas @@ -52,6 +52,7 @@ type private FProps: TStringList; FPaintData: TPaintData; + FEventHook: QObject_hookH; function GetProps(const AnIndex: String): pointer; function QtKeyToLCLKey(key: Integer): Word; procedure DeliverMessage(var Msg); @@ -63,12 +64,17 @@ type AVariant: QVariantH; Widget: QWidgetH; LCLObject: TWinControl; + HasCaret: Boolean; + InPaint: Boolean; public constructor Create(const AWinControl: TWinControl; const AParams: TCreateParams); virtual; constructor CreatePage(const AWinControl: TWinControl; const AParams: TCreateParams); destructor Destroy; override; function GetContainerWidget: QWidgetH; virtual; public + procedure AttachEvents; virtual; + procedure DetachEvents; virtual; + function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; virtual; procedure SlotShow(vShow: Boolean); cdecl; procedure SlotClose; cdecl; @@ -91,7 +97,8 @@ type procedure WindowTitle(Str: PWideString); procedure Hide; procedure Show; - function getVisible: boolean; + function getVisible: Boolean; + function hasFocus: Boolean; procedure setEnabled(p1: Boolean); procedure setVisible(visible: Boolean); function windowModality: QtWindowModality; @@ -142,10 +149,15 @@ type TQtPushButton = class(TQtAbstractButton) private + FClickedHook: QAbstractButton_hookH; protected function CreateWidget(const AParams: TCreateParams): QWidgetH; override; public destructor Destroy; override; + public + procedure AttachEvents; override; + procedure DetachEvents; override; + procedure SlotClicked; cdecl; end; @@ -208,25 +220,36 @@ type { TQtCheckBox } TQtCheckBox = class(TQtAbstractButton) + private + FStateChangedHook : QCheckBox_hookH; protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; procedure SetGeometry; override; public destructor Destroy; override; - function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override; function CheckState: QtCheckState; procedure setCheckState(state: QtCheckState); + public + procedure AttachEvents; override; + procedure DetachEvents; override; + + function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override; procedure signalStateChanged(p1: Integer); cdecl; end; { TQtRadioButton } TQtRadioButton = class(TQtAbstractButton) + private + FClickedHook: QAbstractButton_hookH; protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; procedure SetGeometry; override; public destructor Destroy; override; + public + procedure AttachEvents; override; + procedure DetachEvents; override; function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override; end; @@ -249,11 +272,25 @@ type private FSliderPressed: Boolean; FSliderReleased: Boolean; + FRangeChangedHook: QAbstractSlider_hookH; + FSliderMovedHook: QAbstractSlider_hookH; + FSliderPressedHook: QAbstractSlider_hookH; + FSliderReleasedHook: QAbstractSlider_hookH; + FValueChangedHook: QAbstractSlider_hookH; protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; public destructor Destroy; override; - + public + procedure AttachEvents; override; + procedure DetachEvents; override; + + procedure SlotSliderMoved(p1: Integer); cdecl; virtual; + procedure SlotValueChanged(p1: Integer); cdecl; virtual; + procedure SlotRangeChanged(minimum: Integer; maximum: Integer); cdecl; virtual; + procedure SlotSliderPressed; cdecl; + procedure SlotSliderReleased; cdecl; + public procedure setInvertedAppereance(p1: Boolean); virtual; procedure setInvertedControls(p1: Boolean); virtual; @@ -268,11 +305,6 @@ type procedure setSliderPosition(p1: Integer); virtual; procedure setTracking(p1: Boolean); virtual; procedure setValue(p1: Integer); virtual; - procedure SlotSliderMoved(p1: Integer); cdecl; virtual; - procedure SlotValueChanged(p1: Integer); cdecl; virtual; - procedure SlotRangeChanged(minimum: Integer; maximum: Integer); cdecl; virtual; - procedure SlotSliderPressed; cdecl; - procedure SlotSliderReleased; cdecl; property SliderPressed: Boolean read FSliderPressed; property SliderReleased: Boolean read FSliderReleased; end; @@ -280,9 +312,10 @@ type { TQtScrollBar } TQtScrollBar = class(TQtAbstractSlider) - private protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; + public + procedure AttachEvents; override; end; { TQtToolBar } @@ -310,6 +343,9 @@ type public procedure SetTickPosition(Value: QSliderTickPosition); procedure SetTickInterval(Value: Integer); + public + procedure AttachEvents; override; + procedure SlotSliderMoved(p1: Integer); cdecl; override; procedure SlotValueChanged(p1: Integer); cdecl; override; procedure SlotRangeChanged(minimum: Integer; maximum: Integer); cdecl; override; @@ -319,12 +355,17 @@ type TQtLineEdit = class(TQtWidget) private + FTextChanged: QLineEdit_hookH; protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; public destructor Destroy; override; - function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override; procedure SetColor(const Value: PQColor); override; + public + procedure AttachEvents; override; + procedure DetachEvents; override; + + function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override; procedure SignalTextChanged(p1: PWideString); cdecl; end; @@ -332,12 +373,16 @@ type TQtTextEdit = class(TQtWidget) private + FTextChangedHook: QTextEdit_hookH; protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; public destructor Destroy; override; procedure SetColor(const Value: PQColor); override; procedure SetAlignment(const AAlignment: TAlignment); + public + procedure AttachEvents; override; + procedure DetachEvents; override; procedure SignalTextChanged; cdecl; end; @@ -345,15 +390,20 @@ type TQtTabWidget = class(TQtWidget) private + FCurrentChangedHook: QTabWidget_hookH; protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; public destructor Destroy; override; + public + procedure AttachEvents; override; + procedure DetachEvents; override; + function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override; + procedure SignalCurrentChanged(Index: Integer); cdecl; public function insertTab(index: Integer; page: QWidgetH; p2: PWideString): Integer; procedure SetTabPosition(ATabPosition: QTabWidgetTabPosition); - procedure SignalCurrentChanged(Index: Integer); cdecl; procedure setTabText(index: Integer; p2: PWideString); end; @@ -361,6 +411,8 @@ type TQtComboBox = class(TQtWidget) private + FChangeHook: QComboBox_hookH; + FSelectHook: QComboBox_hookH; protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; public @@ -369,6 +421,9 @@ type function currentIndex: Integer; procedure setCurrentIndex(index: Integer); public + procedure AttachEvents; override; + procedure DetachEvents; override; + procedure SlotChange(p1: PWideString); cdecl; procedure SlotSelect(index: Integer); cdecl; end; @@ -377,12 +432,17 @@ type TQtAbstractSpinBox = class(TQtWidget) private + FEditingFinishedHook: QAbstractSpinBox_hookH; protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; public destructor Destroy; override; function IsReadOnly: Boolean; procedure SetReadOnly(r: Boolean); + public + procedure AttachEvents; override; + procedure DetachEvents; override; + procedure SignalEditingFinished; cdecl; end; @@ -390,9 +450,13 @@ type TQtFloatSpinBox = class(TQtAbstractSpinBox) private + FValueChangedHook: QDoubleSpinBox_hookH; protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; public + procedure AttachEvents; override; + procedure DetachEvents; override; + procedure SignalValueChanged(p1: Double); cdecl; end; @@ -400,9 +464,13 @@ type TQtSpinBox = class(TQtAbstractSpinBox) private + FValueChangedHook: QSpinBox_hookH; protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; public + procedure AttachEvents; override; + procedure DetachEvents; override; + procedure SignalValueChanged(p1: Integer); cdecl; end; @@ -448,14 +516,22 @@ type TQtListWidget = class(TQtListView) private + FSelectionChangeHook: QListWidget_hookH; + FItemDoubleClickedHook: QListWidget_hookH; + FItemClickedHook: QListWidget_hookH; protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; public FList: TStrings; destructor Destroy; override; + public + procedure AttachEvents; override; + procedure DetachEvents; override; + procedure SlotSelectionChange(current: QListWidgetItemH; previous: QListWidgetItemH); cdecl; procedure SignalItemDoubleClicked(item: QListWidgetItemH); cdecl; procedure SignalItemClicked(item: QListWidgetItemH); cdecl; + public function currentRow: Integer; procedure setCurrentRow(row: Integer); end; @@ -468,6 +544,7 @@ type function CreateWidget(const AParams: TCreateParams):QWidgetH; override; public destructor Destroy; override; + public procedure SignalSectionClicked(logicalIndex: Integer) cdecl; end; @@ -486,6 +563,14 @@ type TQtTreeWidget = class(TQtTreeView) private Header: TQtHeaderView; + FCurrentItemChangedHook: QTreeWidget_hookH; + FItemDoubleClickedHook: QTreeWidget_hookH; + FItemClickedHook: QTreeWidget_hookH; + FItemActivatedHook: QTreeWidget_hookH; + FItemChangedHook: QTreeWidget_hookH; + FItemSelectionChangedHook: QTreeWidget_hookH; + FItemPressedHook: QTreeWidget_hookH; + FItemEnteredHook: QTreeWidget_hookH; protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; public @@ -493,6 +578,9 @@ type function currentRow: Integer; procedure setCurrentRow(row: Integer); + public + procedure AttachEvents; override; + procedure DetachEvents; override; procedure SignalItemPressed(item: QTreeWidgetItemH; column: Integer) cdecl; procedure SignalItemClicked(item: QTreeWidgetItemH; column: Integer) cdecl; @@ -511,6 +599,7 @@ type TQtMenu = class(TQtWidget) private FIcon: QIconH; + FActionHook: QAction_hookH; public MenuItem: TMenuItem; public @@ -518,6 +607,9 @@ type constructor Create(const AHandle: QMenuH); overload; destructor Destroy; override; public + procedure AttachEvents; override; + procedure DetachEvents; override; + procedure SlotDestroy; cdecl; procedure SlotTriggered(checked: Boolean = False); cdecl; function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override; @@ -541,7 +633,6 @@ type FVisible: Boolean; public constructor Create(const AParent: QWidgetH); overload; - destructor Destroy; override; public function addMenu(title: PWideString): TQtMenu; function addSeparator: TQtMenu; @@ -551,10 +642,15 @@ type TQtProgressBar = class(TQtWidget) private + FValueChangedHook: QProgressBar_hookH; protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; public destructor Destroy; override; + public + procedure AttachEvents; override; + procedure DetachEvents; override; + procedure SignalValueChanged(Value: Integer); cdecl; public procedure setRange(minimum: Integer; maximum: Integer); procedure setTextVisible(visible: Boolean); @@ -563,7 +659,6 @@ type procedure setValue(value: Integer); procedure setOrientation(p1: QtOrientation); procedure setInvertedAppearance(invert: Boolean); - procedure SignalValueChanged(Value: Integer); cdecl; end; { TQtStatusBar } @@ -594,11 +689,19 @@ type TQtCalendar = class(TQtWidget) private + FClickedHook: QCalendarWidget_hookH; + FActivatedHook: QCalendarWidget_hookH; + FSelectionChangedHook: QCalendarWidget_hookH; + FCurrentPageChangedHook: QCalendarWidget_hookH; protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; public AYear, AMonth, ADay: Word; destructor Destroy; override; + public + procedure AttachEvents; override; + procedure DetachEvents; override; + procedure SignalActivated(ADate: QDateH); cdecl; procedure SignalClicked(ADate: QDateH); cdecl; procedure SignalSelectionChanged; cdecl; @@ -606,6 +709,9 @@ type end; implementation +uses + qtCaret; + const AlignmentMap: array[TAlignment] of QtAlignment = ( @@ -649,6 +755,8 @@ begin // Set mouse move messages policy QWidget_setMouseTracking(Widget, True); + + {HasCaret := False;} end; {------------------------------------------------------------------------------ @@ -678,17 +786,19 @@ end; ------------------------------------------------------------------------------} destructor TQtWidget.Destroy; begin + if Widget <> nil then + DetachEvents; QVariant_destroy(AVariant); {$ifdef VerboseQt} -// WriteLn('Calling QWidget_destroy'); + WriteLn('Calling QWidget_destroy'); {$endif} - if Widget<>nil then + if Widget <> nil then begin QWidget_destroy(QWidgetH(Widget)); - Widget:=nil; + Widget := nil; end; if FProps<>nil then @@ -717,6 +827,24 @@ begin Result := Widget; end; +procedure TQtWidget.AttachEvents; +var + Method: TMethod; +begin + FEventHook := QObject_hook_create(Widget); + TEventFilterMethod(Method) := EventFilter; + QObject_hook_hook_events(FEventHook, Method); +end; + +procedure TQtWidget.DetachEvents; +begin + if FEventHook <> nil then + begin + QObject_hook_destroy(FEventHook); + FEventHook := nil; + end; +end; + {$IFDEF VerboseQt} function EventTypeToStr(Event:QEventH):string; begin @@ -945,7 +1073,8 @@ begin {$ifdef VerboseQt} WriteLn('TQtWidget.SlotDestroy'); {$endif} - + Widget := nil; + FillChar(Msg, SizeOf(Msg), #0); Msg.Msg := LM_DESTROY; @@ -968,8 +1097,10 @@ begin FillChar(Msg, SizeOf(Msg), #0); - if FocusIn then Msg.Msg := LM_SETFOCUS - else Msg.Msg := LM_KILLFOCUS; + if FocusIn then + Msg.Msg := LM_SETFOCUS + else + Msg.Msg := LM_KILLFOCUS; DeliverMessage(Msg); @@ -1208,7 +1339,7 @@ begin {$ifdef VerboseQt} WriteLn('TQtWidget.SlotPaint'); {$endif} - + InPaint := True; if (LCLObject is TWinControl) then begin FillChar(Msg, SizeOf(Msg), #0); @@ -1230,6 +1361,8 @@ begin try LCLObject.WindowProc(TLMessage(Msg)); + if HasCaret then + QtCaret.DrawCaret; finally Dispose(PaintData.ClipRect); Fillchar(FPaintData, SizeOf(FPaintData), 0); @@ -1238,6 +1371,7 @@ begin Application.HandleException(nil); end; end; + InPaint := False; end; {------------------------------------------------------------------------------ @@ -1376,6 +1510,11 @@ begin Result := QWidget_isVisible(Widget); end; +function TQtWidget.hasFocus: Boolean; +begin + Result := QWidget_hasFocus(Widget); +end; + procedure TQtWidget.setEnabled(p1: Boolean); begin QWidget_setEnabled(Widget, p1); @@ -1960,12 +2099,30 @@ begin WriteLn('TQtPushButton.Destroy'); {$endif} + DetachEvents; QPushButton_destroy(QPushButtonH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; +procedure TQtPushButton.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + + FClickedHook := QAbstractButton_hook_create(Widget); + QAbstractButton_clicked2_Event(Method) := SlotClicked; + QAbstractButton_hook_hook_clicked2(FClickedHook, Method); +end; + +procedure TQtPushButton.DetachEvents; +begin + QAbstractButton_hook_destroy(FClickedHook); + inherited DetachEvents; +end; + {------------------------------------------------------------------------------ Function: TQtPushButton.SlotClicked Params: None @@ -2102,8 +2259,8 @@ begin if Widget <> nil then begin + DetachEvents; QMainWindow_destroy(QMainWindowH(Widget)); - Widget := nil; end; @@ -2192,7 +2349,7 @@ begin Result := False; case QEvent_type(Event) of - QEventWindowStateChange: SlotWindowStateChange; + QEventWindowStateChange: SlotWindowStateChange; else // Inherited Callbacks inherited EventFilter(Sender, Event); @@ -2307,8 +2464,9 @@ begin WriteLn('TQtStaticText.Destroy'); {$endif} + DetachEvents; QLabel_destroy(QLabelH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; @@ -2368,6 +2526,7 @@ end; ------------------------------------------------------------------------------} destructor TQtTimer.Destroy; begin + CallbackFunc := nil; QObject_killTimer(AppObject, id); inherited Destroy; @@ -2437,8 +2596,9 @@ begin WriteLn('TQtCheckBox.Destroy'); {$endif} + DetachEvents; QCheckBox_destroy(QCheckBoxH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; @@ -2475,6 +2635,22 @@ begin QCheckBox_setCheckState(QCheckBoxH(Widget), state); end; +procedure TQtCheckBox.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + FStateChangedHook := QCheckBox_hook_create(Widget); + QCheckBox_stateChanged_Event(Method) := SignalStateChanged; + QCheckBox_hook_hook_stateChanged(FStateChangedHook, Method); +end; + +procedure TQtCheckBox.DetachEvents; +begin + QCheckBox_hook_destroy(FStateChangedHook); + inherited DetachEvents; +end; + {------------------------------------------------------------------------------ Function: TQtCheckBox.signalStateChanged Params: None @@ -2545,12 +2721,30 @@ begin WriteLn('TQtRadioButton.Destroy'); {$endif} + DetachEvents; QRadioButton_destroy(QRadioButtonH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; +procedure TQtRadioButton.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + FClickedHook := QAbstractButton_hook_create(Widget); + + QAbstractButton_clicked_Event(Method) := SignalClicked; + QAbstractButton_hook_hook_clicked(FClickedHook, Method); +end; + +procedure TQtRadioButton.DetachEvents; +begin + QAbstractButton_hook_destroy(FClickedHook); + inherited DetachEvents; +end; + {------------------------------------------------------------------------------ Function: TQtRadioButton.EventFilter Params: None @@ -2590,8 +2784,9 @@ begin WriteLn('TQtGroupBox.Destroy'); {$endif} + DetachEvents; QGroupBox_destroy(QGroupBoxH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; @@ -2622,8 +2817,9 @@ begin WriteLn('TQtFrame.Destroy'); {$endif} + DetachEvents; QFrame_destroy(QFrameH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; @@ -2703,12 +2899,34 @@ begin {$ifdef VerboseQt} WriteLn('TQtAbstractSlider.Destroy'); {$endif} + + DetachEvents; QAbstractSlider_destroy(QAbstractSliderH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; +procedure TQtAbstractSlider.AttachEvents; +begin + inherited AttachEvents; + FRangeChangedHook := QAbstractSlider_hook_create(Widget); + FSliderMovedHook := QAbstractSlider_hook_create(Widget); + FSliderPressedHook := QAbstractSlider_hook_create(Widget); + FSliderReleasedHook := QAbstractSlider_hook_create(Widget); + FValueChangedHook := QAbstractSlider_hook_create(Widget); +end; + +procedure TQtAbstractSlider.DetachEvents; +begin + QAbstractSlider_hook_destroy(FRangeChangedHook); + QAbstractSlider_hook_destroy(FSliderMovedHook); + QAbstractSlider_hook_destroy(FSliderPressedHook); + QAbstractSlider_hook_destroy(FSliderReleasedHook); + QAbstractSlider_hook_destroy(FValueChangedHook); + inherited DetachEvents; +end; + {------------------------------------------------------------------------------ Function: TQtAbstractSlider.rangeChanged Params: minimum,maximum: Integer @@ -2944,6 +3162,27 @@ begin Result := QScrollBar_create(Parent); end; +procedure TQtScrollBar.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + QAbstractSlider_rangeChanged_Event(Method) := SlotRangeChanged; + QAbstractSlider_hook_hook_rangeChanged(FRangeChangedHook, Method); + + QAbstractSlider_sliderMoved_Event(Method) := SlotSliderMoved; + QAbstractSlider_hook_hook_sliderMoved(FSliderMovedHook, Method); + + QAbstractSlider_sliderPressed_Event(Method) := SlotSliderPressed; + QAbstractSlider_hook_hook_sliderPressed(FSliderPressedHook, Method); + + QAbstractSlider_sliderReleased_Event(Method) := SlotSliderReleased; + QAbstractSlider_hook_hook_sliderReleased(FSliderReleasedHook, Method); + + QAbstractSlider_valueChanged_Event(Method) := SlotValueChanged; + QAbstractSlider_hook_hook_valueChanged(FValueChangedHook, Method); +end; + { TQtToolBar } function TQtToolBar.CreateWidget(const AParams: TCreateParams):QWidgetH; @@ -3006,6 +3245,28 @@ begin QSlider_setTickInterval(QSliderH(Widget), Value); end; +procedure TQtTrackBar.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + + QAbstractSlider_rangeChanged_Event(Method) := SlotRangeChanged; + QAbstractSlider_hook_hook_rangeChanged(FRangeChangedHook, Method); + + QAbstractSlider_sliderMoved_Event(Method) := SlotSliderMoved; + QAbstractSlider_hook_hook_sliderMoved(FSliderMovedHook, Method); + + QAbstractSlider_sliderPressed_Event(Method) := SlotSliderPressed; + QAbstractSlider_hook_hook_sliderPressed(FSliderPressedHook, Method); + + QAbstractSlider_sliderReleased_Event(Method) := SlotSliderReleased; + QAbstractSlider_hook_hook_sliderReleased(FSliderReleasedHook, Method); + + QAbstractSlider_valueChanged_Event(Method) := SlotValueChanged; + QAbstractSlider_hook_hook_valueChanged(FValueChangedHook, Method); +end; + procedure TQtTrackBar.SlotSliderMoved(p1: Integer); cdecl; var Msg: TLMessage; @@ -3088,12 +3349,33 @@ begin WriteLn('TQtLineEdit.Destroy'); {$endif} + DetachEvents; QLineEdit_destroy(QLineEditH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; +procedure TQtLineEdit.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + + FTextChanged := QLineEdit_hook_create(Widget); + {TODO: BUG CopyUnicodeToPWideString() segfaults while calling SetLength() + workaround: add try..except around SetLength() } + QLineEdit_textChanged_Event(Method) := SignalTextChanged; + QLineEdit_hook_hook_textChanged(FTextChanged, Method); +end; + +procedure TQtLineEdit.DetachEvents; +begin + inherited DetachEvents; + + QLineEdit_hook_destroy(FTextChanged); +end; + {------------------------------------------------------------------------------ Function: TQtLineEdit.EventFilter Params: QObjectH, QEventH @@ -3194,8 +3476,9 @@ begin WriteLn('TQtTextEdit.Destroy'); {$endif} + DetachEvents; QTextEdit_destroy(QTextEditH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; @@ -3242,6 +3525,25 @@ begin QTextCursor_destroy(TextCursor); end; +procedure TQtTextEdit.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + + FTextChangedHook := QTextEdit_hook_create(Widget); + {TODO: BUG CopyUnicodeToPWideString() segfaults while calling SetLength() + workaround: add try..except around SetLength() } + QTextEdit_textChanged_Event(Method) := SignalTextChanged; + QTextEdit_hook_hook_textChanged(FTextChangedHook, Method); +end; + +procedure TQtTextEdit.DetachEvents; +begin + inherited DetachEvents; + QTextEdit_hook_destroy(FTextChangedHook); +end; + {------------------------------------------------------------------------------ Function: TQtTextEdit.SignalTextChanged Params: none @@ -3283,12 +3585,30 @@ begin WriteLn('TQtTabWidget.Destroy'); {$endif} + DetachEvents; QTabWidget_destroy(QTabWidgetH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; +procedure TQtTabWidget.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + FCurrentChangedHook := QTabWidget_hook_create(Widget); + + QTabWidget_currentChanged_Event(Method) := SignalCurrentChanged; + QTabWidget_hook_hook_currentChanged(FCurrentChangedHook, Method); +end; + +procedure TQtTabWidget.DetachEvents; +begin + QTabWidget_hook_destroy(FCurrentChangedHook); + inherited DetachEvents; +end; + {------------------------------------------------------------------------------ Function: TQtTabWidget.EventFilter Params: QObjectH, QEventH @@ -3401,8 +3721,9 @@ begin WriteLn('TQtComboBox.Destroy'); {$endif} + DetachEvents; QComboBox_destroy(QComboBoxH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; @@ -3432,6 +3753,30 @@ begin QComboBox_setCurrentIndex(QComboBoxH(Widget), index); end; +procedure TQtComboBox.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + + FChangeHook := QComboBox_hook_create(Widget); + FSelectHook := QComboBox_hook_create(Widget); + // OnChange event + QComboBox_editTextChanged_Event(Method) := SlotChange; + QComboBox_hook_hook_editTextChanged(FChangeHook, Method); + // OnSelect event + QComboBox_currentIndexChanged_Event(Method) := SlotSelect; + QComboBox_hook_hook_currentIndexChanged(FSelectHook, Method); +end; + +procedure TQtComboBox.DetachEvents; +begin + QComboBox_hook_destroy(FChangeHook); + QComboBox_hook_destroy(FSelectHook); + + inherited DetachEvents; +end; + procedure TQtComboBox.SlotChange(p1: PWideString); cdecl; var Msg: TLMessage; @@ -3487,8 +3832,9 @@ begin WriteLn('TQtAbstractSpinBox.Destroy'); {$endif} + DetachEvents; QAbstractSpinBox_destroy(QAbstractSpinBoxH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; @@ -3509,6 +3855,25 @@ begin QAbstractSpinBox_setReadOnly(QAbstractSpinBoxH(Widget), r); end; +procedure TQtAbstractSpinBox.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + + FEditingFinishedHook := QAbstractSpinBox_hook_create(Widget); + {TODO: find out which TLMessage should be sended } + QAbstractSpinBox_editingFinished_Event(Method) := SignalEditingFinished; + QAbstractSpinBox_hook_hook_editingFinished(FEditingFinishedHook, Method); +end; + +procedure TQtAbstractSpinBox.DetachEvents; +begin + QAbstractSpinBox_hook_destroy(FEditingFinishedHook); + + inherited DetachEvents; +end; + procedure TQtAbstractSpinBox.SignalEditingFinished; cdecl; var Msg: TLMessage; @@ -3541,6 +3906,22 @@ begin Result := QDoubleSpinBox_create(Parent); end; +procedure TQtFloatSpinBox.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + FValueChangedHook := QDoubleSpinBox_hook_create(Widget); + QDoubleSpinBox_valueChanged_Event(Method) := SignalValueChanged; + QDoubleSpinBox_hook_hook_valueChanged(FValueChangedHook, Method); +end; + +procedure TQtFloatSpinBox.DetachEvents; +begin + QDoubleSpinBox_hook_destroy(FValueChangedHook); + inherited DetachEvents; +end; + procedure TQtFloatSpinBox.SignalValueChanged(p1: Double); cdecl; var Msg: TLMessage; @@ -3564,6 +3945,22 @@ begin Result := QSpinBox_create(Parent); end; +procedure TQtSpinBox.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + FValueChangedHook := QSpinBox_hook_create(Widget); + QSpinBox_valueChanged_Event(Method) := SignalValueChanged; + QSpinBox_hook_hook_valueChanged(FValueChangedHook, Method); +end; + +procedure TQtSpinBox.DetachEvents; +begin + QSpinBox_hook_destroy(FValueChangedHook); + inherited DetachEvents; +end; + procedure TQtSpinBox.SignalValueChanged(p1: Integer); cdecl; var Msg: TLMessage; @@ -3605,12 +4002,43 @@ begin WriteLn('TQtListWidget.Destroy'); {$endif} + DetachEvents; QListWidget_destroy(QListWidgetH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; +procedure TQtListWidget.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + + FSelectionChangeHook := QListWidget_hook_create(Widget); + FItemDoubleClickedHook := QListWidget_hook_create(Widget); + FItemClickedHook := QListWidget_hook_create(Widget); + + // OnSelectionChange event + QListWidget_currentItemChanged_Event(Method) := SlotSelectionChange; + QListWidget_hook_hook_currentItemChanged(FSelectionChangeHook, Method); + + QListWidget_itemDoubleClicked_Event(Method) := SignalItemDoubleClicked; + QListWidget_hook_hook_ItemDoubleClicked(FItemDoubleClickedHook, Method); + + QListWidget_itemClicked_Event(Method) := SignalItemClicked; + QListWidget_hook_hook_ItemClicked(FItemClickedHook, Method); +end; + +procedure TQtListWidget.DetachEvents; +begin + QListWidget_hook_destroy(FSelectionChangeHook); + QListWidget_hook_destroy(FItemDoubleClickedHook); + QListWidget_hook_destroy(FItemClickedHook); + + inherited DetachEvents; +end; + {------------------------------------------------------------------------------ Function: TQtListWidget.SlotSelectionChange Params: None @@ -3719,8 +4147,9 @@ begin WriteLn('TQtHeaderView.Destroy'); {$endif} + DetachEvents; QHeaderView_destroy(QHeaderViewH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; @@ -3781,8 +4210,9 @@ begin WriteLn('TQtTreeView.Destroy'); {$endif} + DetachEvents; QTreeView_destroy(QTreeViewH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; @@ -3835,10 +4265,11 @@ begin {$endif} if Assigned(Header) then - Header.Free; + Header.Free; + DetachEvents; QTreeWidget_destroy(QTreeWidgetH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; @@ -3869,6 +4300,60 @@ begin QTreeWidget_setCurrentItem(QTreeWidgetH(Widget), TWI); end; +procedure TQtTreeWidget.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + + FCurrentItemChangedHook := QTreeWidget_hook_create(Widget); + FItemDoubleClickedHook := QTreeWidget_hook_create(Widget); + FItemClickedHook := QTreeWidget_hook_create(Widget); + FItemActivatedHook := QTreeWidget_hook_create(Widget); + FItemChangedHook := QTreeWidget_hook_create(Widget); + FItemSelectionChangedHook := QTreeWidget_hook_create(Widget); + FItemPressedHook := QTreeWidget_hook_create(Widget); + FItemEnteredHook := QTreeWidget_hook_create(Widget); + + QTreeWidget_currentItemChanged_Event(Method) := SignalCurrentItemChanged; + QTreeWidget_hook_hook_currentItemChanged(FCurrentItemChangedHook, Method); + + QTreeWidget_itemDoubleClicked_Event(Method) := SignalItemDoubleClicked; + QTreeWidget_hook_hook_ItemDoubleClicked(FItemDoubleClickedHook, Method); + + QTreeWidget_itemClicked_Event(Method) := SignalItemClicked; + QTreeWidget_hook_hook_ItemClicked(FItemClickedHook, Method); + + QTreeWidget_itemActivated_Event(Method) := SignalItemActivated; + QTreeWidget_hook_hook_ItemActivated(FItemActivatedHook, Method); + + QTreeWidget_itemChanged_Event(Method) := SignalItemChanged; + QTreeWidget_hook_hook_ItemChanged(FItemChangedHook, Method); + + QTreeWidget_itemSelectionChanged_Event(Method) := SignalItemSelectionChanged; + QTreeWidget_hook_hook_ItemSelectionChanged(FItemSelectionChangedHook, Method); + + QTreeWidget_itemPressed_Event(Method) := SignalItemPressed; + QTreeWidget_hook_hook_ItemPressed(FItemPressedHook, Method); + + QTreeWidget_itemEntered_Event(Method) := SignalItemEntered; + QTreeWidget_hook_hook_ItemEntered(FItemEnteredHook, Method); +end; + +procedure TQtTreeWidget.DetachEvents; +begin + QTreeWidget_hook_destroy(FCurrentItemChangedHook); + QTreeWidget_hook_destroy(FItemDoubleClickedHook); + QTreeWidget_hook_destroy(FItemClickedHook); + QTreeWidget_hook_destroy(FItemActivatedHook); + QTreeWidget_hook_destroy(FItemChangedHook); + QTreeWidget_hook_destroy(FItemSelectionChangedHook); + QTreeWidget_hook_destroy(FItemPressedHook); + QTreeWidget_hook_destroy(FItemEnteredHook); + + inherited DetachEvents; +end; + {------------------------------------------------------------------------------ Function: TQtTreeWidget.SignalItemPressed Params: Integer @@ -4159,6 +4644,30 @@ begin inherited Destroy; end; +procedure TQtMenu.AttachEvents; +var + Method: TMethod; +begin + FActionHook := QAction_hook_create(ActionHandle); + FEventHook := QObject_hook_create(Widget); + + QAction_triggered_Event(Method) := SlotTriggered; + QAction_hook_hook_triggered(FActionHook, Method); + TEventFilterMethod(Method) := EventFilter; + QObject_hook_hook_events(FEventHook, Method); +end; + +procedure TQtMenu.DetachEvents; +begin + if FActionHook <> nil then + begin + QAction_hook_destroy(FActionHook); + FActionHook := nil; + end; + + inherited DetachEvents; +end; + procedure TQtMenu.SlotDestroy; cdecl; begin Widget := nil; @@ -4261,11 +4770,6 @@ begin setVisible(FVisible); end; -destructor TQtMenuBar.Destroy; -begin - inherited Destroy; -end; - function TQtMenuBar.addMenu(title: PWideString): TQtMenu; begin if not FVisible then @@ -4312,12 +4816,30 @@ begin WriteLn('TQtProgressBar.Destroy'); {$endif} + DetachEvents; QProgressBar_destroy(QProgressBarH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; +procedure TQtProgressBar.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + + FValueChangedHook := QProgressBar_hook_create(Widget); + QProgressBar_valueChanged_Event(Method) := SignalValueChanged; + QProgressBar_hook_hook_valueChanged(FValueChangedHook, Method); +end; + +procedure TQtProgressBar.DetachEvents; +begin + QProgressBar_hook_destroy(FValueChangedHook); + inherited DetachEvents; +end; + procedure TQtProgressBar.setRange(minimum: Integer; maximum: Integer); begin QProgressBar_setRange(QProgressBarH(Widget), minimum, maximum); @@ -4397,8 +4919,9 @@ begin WriteLn('TQtStatusBar.Destroy'); {$endif} + DetachEvents; QStatusBar_destroy(QStatusBarH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; @@ -4417,8 +4940,9 @@ end; destructor TQtDialog.Destroy; begin + DetachEvents; QDialog_destroy(QDialogH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; @@ -4459,9 +4983,15 @@ begin WriteLn('TQAbstractScrollArea.Destroy'); {$endif} if Assigned(FViewPortWidget) then - FViewPortWidget.Free; - QAbstractScrollArea_destroy(QAbstractScrollAreaH(Widget)); - Widget:=nil; + FViewPortWidget.Free; + + if Widget <> nil then + begin + DetachEvents; + QAbstractScrollArea_destroy(QAbstractScrollAreaH(Widget)); + end; + + Widget := nil; inherited Destroy; end; @@ -4608,19 +5138,13 @@ end; procedure TQtAbstractScrollArea.viewportNeeded; var AParams: TCreateParams; - Hook: QWidget_hookH; - Method: TMethod; begin - if FViewPortWidget <> NiL - then + if FViewPortWidget <> niL then exit; FViewPortWidget := TQtWidget.Create(LCLObject, AParams); + FViewPortWidget.AttachEvents; - Hook := QWidget_hook_create(FViewPortWidget.Widget); - TEventFilterMethod(Method) := FViewPortWidget.EventFilter; - QObject_hook_hook_events(Hook, Method); - QAbstractScrollArea_setViewport(QAbstractScrollAreaH(Widget), FViewPortWidget.Widget); end; @@ -4699,12 +5223,46 @@ begin {$ifdef VerboseQt} WriteLn('TQtCalendar.Destroy'); {$endif} + DetachEvents; QCalendarWidget_destroy(QCalendarWidgetH(Widget)); - Widget:=nil; + Widget := nil; inherited Destroy; end; +procedure TQtCalendar.AttachEvents; +var + Method: TMethod; +begin + inherited AttachEvents; + + FClickedHook := QCalendarWidget_hook_create(Widget); + FActivatedHook := QCalendarWidget_hook_create(Widget); + FSelectionChangedHook := QCalendarWidget_hook_create(Widget); + FCurrentPageChangedHook := QCalendarWidget_hook_create(Widget); + + QCalendarWidget_clicked_Event(Method) := SignalClicked; + QCalendarWidget_hook_hook_clicked(FClickedHook, Method); + + QCalendarWidget_activated_Event(Method) := SignalActivated; + QCalendarWidget_hook_hook_activated(FActivatedHook, Method); + + QCalendarWidget_selectionChanged_Event(Method) := SignalSelectionChanged; + QCalendarWidget_hook_hook_selectionChanged(FSelectionChangedHook, Method); + + QCalendarWidget_currentPageChanged_Event(Method) := SignalCurrentPageChanged; + QCalendarWidget_hook_hook_currentPageChanged(FCurrentPageChangedHook, Method); +end; + +procedure TQtCalendar.DetachEvents; +begin + QCalendarWidget_hook_destroy(FClickedHook); + QCalendarWidget_hook_destroy(FActivatedHook); + QCalendarWidget_hook_destroy(FSelectionChangedHook); + QCalendarWidget_hook_destroy(FCurrentPageChangedHook); + inherited DetachEvents; +end; + {------------------------------------------------------------------------------ Function: TQtCalendar.SignalActivated Params: None diff --git a/lcl/interfaces/qt/qtwinapi.inc b/lcl/interfaces/qt/qtwinapi.inc index 5c9951b2b6..c3161bfc9f 100644 --- a/lcl/interfaces/qt/qtwinapi.inc +++ b/lcl/interfaces/qt/qtwinapi.inc @@ -335,6 +335,12 @@ begin {$endif} end; +function TQtWidgetSet.CreateCaret(Handle: HWND; Bitmap: hBitmap; Width, Height: Integer): Boolean; +begin + Result := (Handle <> 0) and + QtCaret.CreateCaret(TQtWidget(Handle), Bitmap, Width, Height); +end; + {------------------------------------------------------------------------------ Function: CreateCompatibleDC Params: DC - handle to memory device context @@ -647,6 +653,11 @@ begin {$endif} end; +function TQtWidgetSet.DestroyCaret(Handle: HWND): Boolean; +begin + Result := (Handle <> 0) and QtCaret.DestroyCaret; +end; + {------------------------------------------------------------------------------ Method: DestroyCursor Params: Handle @@ -951,6 +962,17 @@ begin // Desc^.LineEnd := rileDWordBoundary; end; +function TQtWidgetSet.GetCaretPos(var lpPoint: TPoint): Boolean; +begin + Result := QtCaret.GetCaretPos(lpPoint); +end; + +function TQtWidgetSet.GetCaretRespondToFocus(handle: HWND; var ShowHideOnFocus: boolean): Boolean; +begin + {$note implement} + Result := False; +end; + {------------------------------------------------------------------------------ Function: GetClientBounds Params: handle: @@ -2229,6 +2251,11 @@ begin AdjustForBuddySize;} end; +function TQtWidgetSet.HideCaret(hWnd: HWND): Boolean; +begin + Result := (hWnd <> 0) and QtCaret.HideCaret(TQtWidget(hWnd)); +end; + {------------------------------------------------------------------------------ Procedure: InitializeCriticalSection Params: var CritSection: TCriticalSection @@ -2670,6 +2697,23 @@ begin result := TQtDeviceContext(DC).SetBkMode(bkMode); end; +function TQtWidgetSet.SetCaretPos(X, Y: Integer): Boolean; +begin + Result := QtCaret.SetCaretPos(X, Y); +end; + +function TQtWidgetSet.SetCaretPosEx(Handle: HWnd; X, Y: Integer): Boolean; +begin + Result := QtCaret.SetCaretPos(X, Y); +end; + +function TQtWidgetSet.SetCaretRespondToFocus(handle: HWND; + ShowHideOnFocus: boolean): Boolean; +begin + {$note implement} + Result := False; +end; + {------------------------------------------------------------------------------ Function: SetCursor Params: ACursor - HCursor (QCursorH) @@ -2759,6 +2803,11 @@ begin Result := True; end; +function TQtWidgetSet.ShowCaret(hWnd: HWND): Boolean; +begin + Result := (hWnd <> 0) and (QtCaret.ShowCaret(TQtWidget(hWnd))); +end; + {------------------------------------------------------------------------------ Method: SetProp Params: Handle - diff --git a/lcl/interfaces/qt/qtwinapih.inc b/lcl/interfaces/qt/qtwinapih.inc index 96473a1527..0830bd2ff8 100644 --- a/lcl/interfaces/qt/qtwinapih.inc +++ b/lcl/interfaces/qt/qtwinapih.inc @@ -34,6 +34,7 @@ function CombineRgn(Dest, Src1, Src2: HRGN; fnCombineMode: Longint): Longint; o function CreateBitmap(Width, Height: Integer; Planes, BitCount: Longint; BitmapBits: Pointer): HBITMAP; override; function CreateBitmapFromRawImage(const RawImage: TRawImage; var Bitmap, MaskBitmap: HBitmap; AlwaysCreateMask: boolean): boolean; override; function CreateBrushIndirect(const LogBrush: TLogBrush): HBRUSH; override; +function CreateCaret(Handle : HWND; Bitmap : hBitmap; Width, Height : Integer) : Boolean; override; function CreateCompatibleDC(DC: HDC): HDC; override; function CreateCursor(ACursorInfo: PIconInfo): hCursor; override; function CreateFontIndirect(const LogFont: TLogFont): HFONT; override; @@ -43,6 +44,7 @@ function CreateRectRgn(X1, Y1, X2, Y2: Integer): HRGN; override; procedure DeleteCriticalSection(var CritSection: TCriticalSection); override; function DeleteObject(GDIObject: HGDIOBJ): Boolean; override; +function DestroyCaret(Handle : HWND): Boolean; override; function DestroyCursor(Handle: hCursor): Boolean; override; function DrawText(DC: HDC; Str: PChar; Count: Integer; var Rect: TRect; Flags: Cardinal): Integer; override; @@ -57,6 +59,8 @@ function Frame3d(DC: HDC; var ARect: TRect; const FrameWidth : integer; const St function FrameRect(DC: HDC; const ARect: TRect; hBr: HBRUSH): Integer; override; function GetBitmapRawImageDescription(Bitmap: HBITMAP; Desc: PRawImageDescription): Boolean; override; +function GetCaretPos(var lpPoint: TPoint): Boolean; override; +function GetCaretRespondToFocus(handle: HWND; var ShowHideOnFocus: boolean): Boolean; override; function GetClientBounds(handle : HWND; var ARect : TRect) : Boolean; override; function GetClientRect(handle : HWND; var ARect : TRect) : Boolean; override; function GetClipBox(DC : hDC; lpRect : PRect) : Longint; override; @@ -81,6 +85,8 @@ function GetWindowRect(Handle: hwnd; var ARect: TRect): Integer; override; function GetWindowRelativePosition(Handle: hwnd; var Left, Top: Integer): boolean; override; function GetWindowSize(Handle: hwnd; var Width, Height: Integer): boolean; override; +function HideCaret(hWnd: HWND): Boolean; override; + function InvalidateRect(aHandle : HWND; Rect : pRect; bErase : Boolean) : Boolean; override; procedure InitializeCriticalSection(var CritSection: TCriticalSection); override; @@ -99,6 +105,9 @@ function SelectClipRGN(DC : hDC; RGN : HRGN) : Longint; override; function SelectObject(DC: HDC; GDIObj: HGDIOBJ): HGDIOBJ; override; function SetBKColor(DC: HDC; Color: TColorRef): TColorRef; override; function SetBkMode(DC: HDC; bkMode : Integer) : Integer; override; +function SetCaretPos(X, Y: Integer): Boolean; override; +function SetCaretPosEx(Handle: HWnd; X, Y: Integer): Boolean; override; +function SetCaretRespondToFocus(handle: HWND; ShowHideOnFocus: boolean): Boolean; override; function SetCursor(ACursor: HCURSOR): HCURSOR; override; function SetCursorPos(X, Y: Integer): Boolean; override; function SetFocus(hWnd: HWND): HWND; override; @@ -106,6 +115,7 @@ function SetProp(Handle: hwnd; Str : PChar; Data : Pointer) : Boolean; override; function SetScrollInfo(Handle : HWND; SBStyle : Integer; ScrollInfo: TScrollInfo; bRedraw : Boolean): Integer; override; function SetTextColor(DC: HDC; Color: TColorRef): TColorRef; override; function SetWindowOrgEx(DC : HDC; NewX, NewY : Integer; OldPoint: PPoint) : Boolean; override; +function ShowCaret(hWnd: HWND): Boolean; override; function ShowWindow(hWnd: HWND; nCmdShow: Integer): Boolean; override; function StretchBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc, SrcWidth, SrcHeight: Integer; ROp: Cardinal): Boolean; override; diff --git a/lcl/interfaces/qt/qtwsbuttons.pp b/lcl/interfaces/qt/qtwsbuttons.pp index fd693ba828..14807a0bd3 100644 --- a/lcl/interfaces/qt/qtwsbuttons.pp +++ b/lcl/interfaces/qt/qtwsbuttons.pp @@ -84,24 +84,9 @@ class function TQtWSBitBtn.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; var QtPushButton: TQtPushButton; - Method: TMethod; - Hook : QObject_hookH; begin QtPushButton := TQtPushButton.Create(AWinControl, AParams); - - // Various Events - - Hook := QObject_hook_create(QtPushButton.Widget); - - TEventFilterMethod(Method) := QtPushButton.EventFilter; - - QObject_hook_hook_events(Hook, Method); - - // OnClick Event - - QAbstractButton_clicked2_Event(Method) := QtPushButton.SlotClicked; - - QAbstractButton_hook_hook_clicked2(QAbstractButton_hook_create(QtPushButton.Widget), Method); + QtPushButton.AttachEvents; // Focus diff --git a/lcl/interfaces/qt/qtwscalendar.pp b/lcl/interfaces/qt/qtwscalendar.pp index cd4032c3a9..2ae3a1d05a 100644 --- a/lcl/interfaces/qt/qtwscalendar.pp +++ b/lcl/interfaces/qt/qtwscalendar.pp @@ -64,26 +64,11 @@ implementation class function TQtWSCustomCalendar.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; var QtCalendar: TQtCalendar; - Hook: QCalendarWidget_hookH; - Method: TMethod; begin QtCalendar := TQtCalendar.Create(AWinControl, AParams); - Hook := QCalendarWidget_hook_create(QtCalendar.Widget); - TEventFilterMethod(Method) := QtCalendar.EventFilter; - QObject_hook_hook_events(Hook, Method); - - QCalendarWidget_clicked_Event(Method) := QtCalendar.SignalClicked; - QCalendarWidget_hook_hook_clicked(QCalendarWidget_hook_create(QtCalendar.Widget), Method); - - QCalendarWidget_activated_Event(Method) := QtCalendar.SignalActivated; - QCalendarWidget_hook_hook_activated(QCalendarWidget_hook_create(QtCalendar.Widget), Method); + QtCalendar.AttachEvents; - QCalendarWidget_selectionChanged_Event(Method) := QtCalendar.SignalSelectionChanged; - QCalendarWidget_hook_hook_selectionChanged(QCalendarWidget_hook_create(QtCalendar.Widget), Method); - - QCalendarWidget_currentPageChanged_Event(Method) := QtCalendar.SignalCurrentPageChanged; - QCalendarWidget_hook_hook_currentPageChanged(QCalendarWidget_hook_create(QtCalendar.Widget), Method); QWidget_setFocusPolicy(QtCalendar.Widget, QtTabFocus or QtClickFocus); diff --git a/lcl/interfaces/qt/qtwscomctrls.pp b/lcl/interfaces/qt/qtwscomctrls.pp index 11c61b2ba1..22848fe7ee 100644 --- a/lcl/interfaces/qt/qtwscomctrls.pp +++ b/lcl/interfaces/qt/qtwscomctrls.pp @@ -253,16 +253,11 @@ implementation class function TQtWSToolButton.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var - QtToolButton: TQtToolButton; - Hook: QToolButton_hookH; - Method: TMethod; + QtToolButton: TQtToolButton; begin QtToolButton := TQtToolButton.Create(AWinControl, AParams); + QtToolButton.AttachEvents; - Hook := QToolButton_hook_create(QtToolButton.Widget); - TEventFilterMethod(Method) := QtToolButton.EventFilter; - QObject_hook_hook_events(Hook, Method); - Result := THandle(QtToolButton); end; @@ -337,16 +332,11 @@ end; class function TQtWSToolBar.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var - QtToolBar: TQtToolBar; - Hook: QToolBar_hookH; - Method: TMethod; + QtToolBar: TQtToolBar; begin QtToolBar := TQtToolBar.Create(AWinControl, AParams); + QtToolBar.AttachEvents; - Hook := QToolBar_hook_create(QtToolBar.Widget); - TEventFilterMethod(Method) := QtToolBar.EventFilter; - QObject_hook_hook_events(Hook, Method); - Result := THandle(QtToolBar); end; @@ -392,29 +382,9 @@ end; class function TQtWSTrackBar.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var QtTrackBar: TQtTrackBar; - Method: TMethod; - Hook : QSlider_hookH; begin QtTrackBar := TQtTrackBar.Create(AWinControl, AParams); - - Hook := QSlider_hook_create(QtTrackBar.Widget); - TEventFilterMethod(Method) := QtTrackBar.EventFilter; - QObject_hook_hook_events(Hook, Method); - - QAbstractSlider_rangeChanged_Event(Method) := QtTrackbar.SlotRangeChanged; - QAbstractSlider_hook_hook_rangeChanged(QAbstractSlider_hook_create(QtTrackBar.Widget), Method); - - QAbstractSlider_sliderMoved_Event(Method) := QtTrackBar.SlotSliderMoved; - QAbstractSlider_hook_hook_sliderMoved(QAbstractSlider_hook_create(QtTrackBar.Widget), Method); - - QAbstractSlider_sliderPressed_Event(Method) := QtTrackBar.SlotSliderPressed; - QAbstractSlider_hook_hook_sliderPressed(QAbstractSlider_hook_create(QtTrackBar.Widget), Method); - - QAbstractSlider_sliderReleased_Event(Method) := QtTrackBar.SlotSliderReleased; - QAbstractSlider_hook_hook_sliderReleased(QAbstractSlider_hook_create(QtTrackBar.Widget), Method); - - QAbstractSlider_valueChanged_Event(Method) := QtTrackBar.SlotValueChanged; - QAbstractSlider_hook_hook_valueChanged(QAbstractSlider_hook_create(QtTrackBar.Widget), Method); + QtTrackBar.AttachEvents; Result := THandle(QtTrackBar); end; @@ -488,23 +458,9 @@ end; class function TQtWSProgressBar.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var QtProgressBar: TQtProgressBar; - Method: TMethod; - Hook : QProgressBar_hookH; begin QtProgressBar := TQtProgressBar.Create(AWinControl, AParams); - - // Various Events - - Hook := QProgressBar_hook_create(QtProgressBar.Widget); - - TEventFilterMethod(Method) := QtProgressBar.EventFilter; - - QObject_hook_hook_events(Hook, Method); - - QProgressBar_valueChanged_Event(Method) := QtProgressBar.SignalValueChanged; - QProgressBar_hook_hook_valueChanged(QProgressBar_hook_create(QtProgressBar.Widget), Method); - - + QtProgressBar.AttachEvents; Result := THandle(QtProgressBar); end; @@ -573,21 +529,12 @@ end; class function TQtWSStatusBar.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var QtStatusBar: TQtStatusBar; - Method: TMethod; - Hook : QStatusBar_hookH; Str: WideString; i: Integer; R: TRect; begin QtStatusBar := TQtStatusBar.Create(AWinControl, AParams); - - // Various Events - - Hook := QStatusBar_hook_create(QtStatusBar.Widget); - - TEventFilterMethod(Method) := QtStatusBar.EventFilter; - - QObject_hook_hook_events(Hook, Method); + QtStatusBar.AttachEvents; if TStatusBar(AWinControl).SimplePanel then begin @@ -802,45 +749,9 @@ end; class function TQtWSCustomListView.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var QtTreeWidget: TQtTreeWidget; - Method: TMethod; - Hook : QTreeWidget_hookH; begin QtTreeWidget := TQtTreeWidget.Create(AWinControl, AParams); - - // Various Events - - Hook := QTreeWidget_hook_create(QtTreeWidget.Widget); - - TEventFilterMethod(Method) := QtTreeWidget.EventFilter; - - QObject_hook_hook_events(Hook, Method); - - QTreeWidget_currentItemChanged_Event(Method) := QtTreeWidget.SignalCurrentItemChanged; - QTreeWidget_hook_hook_currentItemChanged(QTreeWidget_hook_create(QtTreeWidget.Widget), Method); - - QTreeWidget_itemDoubleClicked_Event(Method) := QtTreeWidget.SignalItemDoubleClicked; - QTreeWidget_hook_hook_ItemDoubleClicked(QTreeWidget_hook_create(QtTreeWidget.Widget), Method); - - QTreeWidget_itemClicked_Event(Method) := QtTreeWidget.SignalItemClicked; - QTreeWidget_hook_hook_ItemClicked(QTreeWidget_hook_create(QtTreeWidget.Widget), Method); - - QTreeWidget_itemActivated_Event(Method) := QtTreeWidget.SignalItemActivated; - QTreeWidget_hook_hook_ItemActivated(QTreeWidget_hook_create(QtTreeWidget.Widget), Method); - - QTreeWidget_itemChanged_Event(Method) := QtTreeWidget.SignalItemChanged; - QTreeWidget_hook_hook_ItemChanged(QTreeWidget_hook_create(QtTreeWidget.Widget), Method); - - QTreeWidget_itemSelectionChanged_Event(Method) := QtTreeWidget.SignalItemSelectionChanged; - QTreeWidget_hook_hook_ItemSelectionChanged(QTreeWidget_hook_create(QtTreeWidget.Widget), Method); - - QTreeWidget_itemPressed_Event(Method) := QtTreeWidget.SignalItemPressed; - QTreeWidget_hook_hook_ItemPressed(QTreeWidget_hook_create(QtTreeWidget.Widget), Method); - - QTreeWidget_itemEntered_Event(Method) := QtTreeWidget.SignalItemEntered; - QTreeWidget_hook_hook_ItemEntered(QTreeWidget_hook_create(QtTreeWidget.Widget), Method); - - - + QtTreeWidget.AttachEvents; Result := THandle(QtTreeWidget); end; diff --git a/lcl/interfaces/qt/qtwscontrols.pp b/lcl/interfaces/qt/qtwscontrols.pp index fe6a1f8260..d32787fdb4 100644 --- a/lcl/interfaces/qt/qtwscontrols.pp +++ b/lcl/interfaces/qt/qtwscontrols.pp @@ -131,21 +131,13 @@ class function TQtWSCustomControl.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var QtAbstractScrollArea: TQtAbstractScrollArea; - Method: TMethod; - Hook: QObject_hookH; begin {$ifdef VerboseQt} WriteLn('> TQtWSCustomControl.CreateHandle for ',dbgsname(AWinControl)); {$endif} QtAbstractScrollArea := TQtAbstractScrollArea.Create(AWinControl, AParams); - - Hook := QAbstractScrollArea_hook_create(QtAbstractScrollArea.Widget); - - TEventFilterMethod(Method) := QtAbstractScrollArea.EventFilter; - - QObject_hook_hook_events(Hook, Method); - + QtAbstractScrollArea.AttachEvents; Result := THandle(QtAbstractScrollArea); {$ifdef VerboseQt} @@ -184,36 +176,41 @@ end; Shows or hides a widget. ------------------------------------------------------------------------------} class procedure TQtWSCustomControl.ShowHide(const AWinControl: TWinControl); +var + Widget: TQtWidget; begin {$ifdef VerboseQt} WriteLn('Trace:> [TQtWSCustomControl.ShowHide]'); {$endif} - if AWinControl = nil then exit; - - if not AWinControl.HandleAllocated then exit; + if (AWinControl = nil) or not AWinControl.HandleAllocated then + exit; + Widget := TQtWidget(AWinControl.Handle); { if the widget is a form, this is a place to set the Tab order } - if (AWinControl is TForm) and AWinControl.HandleObjectShouldBeVisible then - TQtMainWindow(AWinControl.Handle).SetTabOrders; + if AWinControl.HandleObjectShouldBeVisible and (Widget is TQtMainWindow) then + TQtMainWindow(Widget).SetTabOrders; if AWinControl.HandleObjectShouldBeVisible then - QWidget_setVisible(TQtWidget(AWinControl.Handle).Widget, True) - else QWidget_setVisible(TQtWidget(AWinControl.Handle).Widget, False); + QWidget_setVisible(Widget.Widget, True) + else + QWidget_setVisible(Widget.Widget, False); {$ifdef VerboseQt} Write('Trace:< [TQtWSCustomControl.ShowHide] '); - if AWinControl is TForm then Write('Is TForm, '); + if AWinControl is TForm then + Write('Is TForm, '); - if AWinControl.HandleObjectShouldBeVisible then WriteLn('Visible: True') - else WriteLn('Visible: False'); + if AWinControl.HandleObjectShouldBeVisible then + WriteLn('Visible: True') + else + WriteLn('Visible: False'); {$endif} // showhide fires before invalidate, so we must create viewport right here - if not AWinControl.InheritsFrom(TCustomForm) - then - TQtAbstractScrollArea(AWinControl.Handle).viewportNeeded; + if Widget is TQtAbstractScrollArea then + TQtAbstractScrollArea(Widget).viewportNeeded; end; {------------------------------------------------------------------------------ @@ -230,14 +227,14 @@ begin begin Widget := TQtWidget(AWinControl.Handle); if Assigned(Widget.LCLObject.Parent) then - FocusWidget := QWidget_focusWidget(TQtWidget(Widget.LCLObject.Parent.Handle).Widget) + FocusWidget := QWidget_focusWidget(TQtWidget(Widget.LCLObject.Parent.Handle).Widget) else - FocusWidget := QWidget_focusWidget(Widget.Widget); + FocusWidget := QWidget_focusWidget(Widget.Widget); - Result := (FocusWidget <> nil) - and QWidget_isEnabled(FocusWidget) - and QWidget_isVisible(FocusWidget) - and (QWidget_focusPolicy(FocusWidget) <> QtNoFocus); + Result := (FocusWidget <> nil) and + QWidget_isEnabled(FocusWidget) and + QWidget_isVisible(FocusWidget) and + (QWidget_focusPolicy(FocusWidget) <> QtNoFocus); end else Result := False; end; @@ -251,22 +248,14 @@ class function TQtWSWinControl.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var QtWidget: TQtWidget; - Method: TMethod; - Hook : QObject_hookH; begin {$ifdef VerboseQt} WriteLn('> TQtWSWinControl.CreateHandle for ',dbgsname(AWinControl)); {$endif} QtWidget := TQtWidget.Create(AWinControl, AParams); - // Various Events + QtWidget.AttachEvents; - Hook := QObject_hook_create(QtWidget.Widget); - - TEventFilterMethod(Method) := QtWidget.EventFilter; - - QObject_hook_hook_events(Hook, Method); - // Finalization Result := THandle(QtWidget); @@ -351,30 +340,36 @@ end; Shows or hides a widget. ------------------------------------------------------------------------------} class procedure TQtWSWinControl.ShowHide(const AWinControl: TWinControl); +var + Widget: TQtWidget; begin {$ifdef VerboseQt} WriteLn('Trace:> [TQtWSWinControl.ShowHide]'); {$endif} - if AWinControl = nil then exit; - - if not AWinControl.HandleAllocated then exit; + if (AWinControl = nil) or not AWinControl.HandleAllocated then + exit; + Widget := TQtWidget(AWinControl.Handle); { if the widget is a form, this is a place to set the Tab order } - if (AWinControl is TForm) and AWinControl.HandleObjectShouldBeVisible then - TQtMainWindow(AWinControl.Handle).SetTabOrders; + if AWinControl.HandleObjectShouldBeVisible and (Widget is TQtMainWindow) then + TQtMainWindow(Widget).SetTabOrders; if AWinControl.HandleObjectShouldBeVisible then - QWidget_setVisible(TQtWidget(AWinControl.Handle).Widget, True) - else QWidget_setVisible(TQtWidget(AWinControl.Handle).Widget, False); + QWidget_setVisible(Widget.Widget, True) + else + QWidget_setVisible(Widget.Widget, False); {$ifdef VerboseQt} Write('Trace:< [TQtWSWinControl.ShowHide] '); - if AWinControl is TForm then Write('Is TForm, '); + if AWinControl is TForm then + Write('Is TForm, '); - if AWinControl.HandleObjectShouldBeVisible then WriteLn('Visible: True') - else WriteLn('Visible: False'); + if AWinControl.HandleObjectShouldBeVisible then + WriteLn('Visible: True') + else + WriteLn('Visible: False'); {$endif} end; diff --git a/lcl/interfaces/qt/qtwsextctrls.pp b/lcl/interfaces/qt/qtwsextctrls.pp index 75627fab6e..2a47da446a 100644 --- a/lcl/interfaces/qt/qtwsextctrls.pp +++ b/lcl/interfaces/qt/qtwsextctrls.pp @@ -253,18 +253,9 @@ class function TQtWSCustomPanel.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var QtFrame: TQtFrame; - Method: TMethod; - Hook : QObject_hookH; begin QtFrame := TQtFrame.Create(AWinControl, AParams); - - // Various Events - - Hook := QObject_hook_create(QtFrame.Widget); - - TEventFilterMethod(Method) := QtFrame.EventFilter; - - QObject_hook_hook_events(Hook, Method); + QtFrame.AttachEvents; // Setīs initial properties @@ -304,25 +295,15 @@ class function TQtWSCustomPage.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var QtWidget: TQtWidget; - Method: TMethod; - Hook : QTabBar_hookH; begin {$ifdef VerboseQt} WriteLn('Trace:> [TQtWSCustomPage.CreateHandle]'); {$endif} QtWidget := TQtWidget.CreatePage(AWinControl, AParams); - - // Various Events - - Hook := QTabBar_hook_create(QtWidget.Widget); - - TEventFilterMethod(Method) := QtWidget.EventFilter; - - QObject_hook_hook_events(Hook, Method); + QtWidget.AttachEvents; // Returns the Handle - Result := THandle(QtWidget); {$ifdef VerboseQt} @@ -373,8 +354,6 @@ end; class function TQtWSCustomNotebook.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var QtTabWidget: TQtTabWidget; - Method: TMethod; - Hook : QTabWidget_hookH; begin {$ifdef VerboseQt} WriteLn('TQtWSCustomNotebook.CreateHandle'); @@ -382,18 +361,7 @@ begin QtTabWidget := TQtTabWidget.Create(AWinControl, AParams); QtTabWidget.SetTabPosition(QTabWidgetTabPositionMap[TCustomNoteBook(AWinControl).TabPosition]); - - // Various Events - - Hook := QTabWidget_hook_create(QtTabWidget.Widget); - - - TEventFilterMethod(Method) := QtTabWidget.EventFilter; - - QObject_hook_hook_events(Hook, Method); - - QTabWidget_currentChanged_Event(Method) := QtTabWidget.SignalCurrentChanged; - QTabWidget_hook_hook_currentChanged(QTabWidget_hook_create(QtTabWidget.Widget), Method); + QtTabWidget.AttachEvents; // Returns the Handle @@ -454,8 +422,6 @@ class function TQtWSCustomRadioGroup.CreateHandle(const AWinControl: TWinControl var QtGroupBox: TQtGroupBox; Str: WideString; - Method: TMethod; - Hook : QGroupBox_hookH; i: Integer; begin @@ -483,9 +449,7 @@ begin QGridLayout_setRowStretch(QtGroupBox.BoxLayout, i, 0); end; - Hook := QGroupBox_hook_create(QtGroupBox.Widget); - TEventFilterMethod(Method) := QtGroupBox.EventFilter; - QObject_hook_hook_events(Hook, Method); + QtGroupBox.AttachEvents; Result := THandle(QtGroupBox); end; @@ -560,8 +524,6 @@ class function TQtWSCustomCheckGroup.CreateHandle(const AWinControl: TWinControl var QtGroupBox: TQtGroupBox; Str: WideString; - Method: TMethod; - Hook : QGroupBox_hookH; i: Integer; begin @@ -588,9 +550,7 @@ begin QGridLayout_setRowStretch(QtGroupBox.BoxLayout, i, 0); end; - Hook := QGroupBox_hook_create(QtGroupBox.Widget); - TEventFilterMethod(Method) := QtGroupBox.EventFilter; - QObject_hook_hook_events(Hook, Method); + QtGroupBox.AttachEvents; Result := THandle(QtGroupBox); end; diff --git a/lcl/interfaces/qt/qtwsforms.pp b/lcl/interfaces/qt/qtwsforms.pp index 4c910b1d31..24bb4de0f3 100644 --- a/lcl/interfaces/qt/qtwsforms.pp +++ b/lcl/interfaces/qt/qtwsforms.pp @@ -144,8 +144,6 @@ class function TQtWSCustomForm.CreateHandle(const AWinControl: TWinControl; var QtMainWindow: TQtMainWindow; Str: WideString; - Method: TMethod; - Hook : QObject_hookH; begin {$ifdef VerboseQt} WriteLn('[TQtWSCustomForm.CreateHandle] Height: ', IntToStr(AWinControl.Height), @@ -174,15 +172,9 @@ begin SetQtBorderIcons(QtMainWindow, TCustomForm(AWinControl).BorderIcons); // Sets Various Events + QtMainWindow.AttachEvents; - Hook := QObject_hook_create(QtMainWindow.Widget); - - TEventFilterMethod(Method) := QtMainWindow.EventFilter; - - QObject_hook_hook_events(Hook, Method); - // Return the handle - Result := THandle(QtMainWindow); end; diff --git a/lcl/interfaces/qt/qtwsmenus.pp b/lcl/interfaces/qt/qtwsmenus.pp index 57840f510e..f657438936 100644 --- a/lcl/interfaces/qt/qtwsmenus.pp +++ b/lcl/interfaces/qt/qtwsmenus.pp @@ -113,8 +113,6 @@ var ParentMenu, Menu: TQtMenu; MenuBar: TQtMenuBar; Text: WideString; - Method: TMethod; - Hook: QObject_hookH; begin {$ifdef VerboseQt} WriteLn('trace:> [TQtWSMenuItem.CreateHandle] Caption: ', AMenuItem.Caption, @@ -223,19 +221,7 @@ begin end; if Menu <> nil then - begin - // Trigger event - - QAction_triggered_Event(Method) := Menu.SlotTriggered; - - QAction_hook_hook_triggered(QAction_hook_create(Menu.ActionHandle), Method); - - Hook := QObject_hook_create(Menu.Widget); - - TEventFilterMethod(Method) := Menu.EventFilter; - - QObject_hook_hook_events(Hook, Method); - end; + Menu.AttachEvents; {$ifdef VerboseQt} WriteLn(' Result: ', dbghex(Result)); @@ -387,6 +373,8 @@ begin Parent := TQtMainWindow(TCustomForm(AMenu.Owner).Handle).Widget; Menu := TQtMenu.Create(Parent); + Menu.MenuItem := AMenu.Items; + Menu.AttachEvents; Result := HMENU(Menu); end; diff --git a/lcl/interfaces/qt/qtwsspin.pp b/lcl/interfaces/qt/qtwsspin.pp index e5be988a4d..23640caa3e 100644 --- a/lcl/interfaces/qt/qtwsspin.pp +++ b/lcl/interfaces/qt/qtwsspin.pp @@ -95,8 +95,6 @@ class function TQtWSCustomFloatSpinEdit.CreateHandle(const AWinControl: TWinCont var QtSpinBox: TQtSpinBox; QtFloatSpinBox: TQtFloatSpinBox; - Hook: QAbstractSpinBox_hookH; - Method: TMethod; FIsFloat: Boolean; begin @@ -105,41 +103,17 @@ begin FIsFloat := TCustomFloatSpinEdit(AWinControl).DecimalPlaces > 0; if FIsFloat then - QtFloatSpinBox := TQtFloatSpinBox.Create(AWinControl, AParams) + begin + QtFloatSpinBox := TQtFloatSpinBox.Create(AWinControl, AParams); + QtFloatSpinBox.AttachEvents; + Result := THandle(QtFloatSpinBox); + end else + begin QtSpinBox := TQtSpinBox.Create(AWinControl, AParams); - - if FIsFloat then - begin - Hook := QAbstractSpinBox_hook_create(QtFloatSpinBox.Widget); - TEventFilterMethod(Method) := QtFloatSpinBox.EventFilter; - QObject_hook_hook_events(Hook, Method); - - {TODO: find out which TLMessage should be sended } - - QAbstractSpinBox_editingFinished_Event(Method) := QtFloatSpinBox.SignalEditingFinished; - QAbstractSpinBox_hook_hook_editingFinished(QAbstractSpinBox_hook_create(QtFloatSpinBox.Widget), Method); - - QDoubleSpinBox_valueChanged_Event(Method) := QtFloatSpinBox.SignalValueChanged; - QDoubleSpinBox_hook_hook_valueChanged(QDoubleSpinBox_hook_create(QtFloatSpinBox.Widget), Method); - - end else - begin - Hook := QAbstractSpinBox_hook_create(QtSpinBox.Widget); - TEventFilterMethod(Method) := QtSpinBox.EventFilter; - QObject_hook_hook_events(Hook, Method); - - {TODO: find out which TLMessage should be sended } - - QAbstractSpinBox_editingFinished_Event(Method) := QtSpinBox.SignalEditingFinished; - QAbstractSpinBox_hook_hook_editingFinished(QAbstractSpinBox_hook_create(QtSpinBox.Widget), Method); - - QSpinBox_valueChanged_Event(Method) := QtSpinBox.SignalValueChanged; - QSpinBox_hook_hook_valueChanged(QSpinBox_hook_create(QtSpinBox.Widget), Method); + QtSpinBox.AttachEvents; + Result := THandle(QtSpinBox); end; - - if FIsFloat then Result := THandle(QtFloatSpinBox) - else Result := THandle(QtSpinBox); end; {------------------------------------------------------------------------------ @@ -150,9 +124,9 @@ end; class procedure TQtWSCustomFloatSpinEdit.DestroyHandle(const AWinControl: TWinControl); begin if TCustomFloatSpinEdit(AWinControl).DecimalPlaces > 0 then - TQtFloatSpinBox(AWinControl.Handle).Free + TQtFloatSpinBox(AWinControl.Handle).Free else - TQtSpinBox(AWinControl.Handle).Free; + TQtSpinBox(AWinControl.Handle).Free; AWinControl.Handle := 0; end; @@ -160,9 +134,9 @@ end; class function TQtWSCustomFloatSpinEdit.GetValue(const ACustomFloatSpinEdit: TCustomFloatSpinEdit): single; begin if ACustomFloatSpinEdit.DecimalPlaces > 0 then - Result := QDoubleSpinBox_value(QDoubleSpinBoxH(TQtFloatSpinBox(ACustomFloatSpinEdit.Handle).Widget)) + Result := QDoubleSpinBox_value(QDoubleSpinBoxH(TQtFloatSpinBox(ACustomFloatSpinEdit.Handle).Widget)) else - Result := QSpinBox_value(QSpinBoxH(TQtFloatSpinBox(ACustomFloatSpinEdit.Handle).Widget)); + Result := QSpinBox_value(QSpinBoxH(TQtFloatSpinBox(ACustomFloatSpinEdit.Handle).Widget)); end; class procedure TQtWSCustomFloatSpinEdit.UpdateControl(const ACustomFloatSpinEdit: TCustomFloatSpinEdit); diff --git a/lcl/interfaces/qt/qtwsstdctrls.pp b/lcl/interfaces/qt/qtwsstdctrls.pp index bd3128fb3b..a376c8c9b2 100644 --- a/lcl/interfaces/qt/qtwsstdctrls.pp +++ b/lcl/interfaces/qt/qtwsstdctrls.pp @@ -337,10 +337,7 @@ uses LMessages; class function TQtWSScrollBar.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var QtScrollBar: TQtScrollBar; - Method: TMethod; - Hook : QScrollBar_hookH; begin - QtScrollBar := TQtScrollBar.Create(AWinControl, AParams); case TScrollBar(AWinControl).Kind of @@ -364,26 +361,7 @@ begin QtScrollBar.setRange(TScrollBar(AWinControl).Min, TScrollBar(AWinControl).Max); QtScrollbar.setValue(TScrollBar(AWinControl).Position); QtScrollBar.setPageStep(TScrollBar(AWinControl).PageSize); - - // Various Events - Hook := QScrollBar_hook_create(QtScrollBar.Widget); - TEventFilterMethod(Method) := QtScrollBar.EventFilter; - QObject_hook_hook_events(Hook, Method); - - QAbstractSlider_rangeChanged_Event(Method) := QtScrollBar.SlotRangeChanged; - QAbstractSlider_hook_hook_rangeChanged(QAbstractSlider_hook_create(QtScrollBar.Widget), Method); - - QAbstractSlider_sliderMoved_Event(Method) := QtScrollBar.SlotSliderMoved; - QAbstractSlider_hook_hook_sliderMoved(QAbstractSlider_hook_create(QtScrollBar.Widget), Method); - - QAbstractSlider_sliderPressed_Event(Method) := QtScrollBar.SlotSliderPressed; - QAbstractSlider_hook_hook_sliderPressed(QAbstractSlider_hook_create(QtScrollBar.Widget), Method); - - QAbstractSlider_sliderReleased_Event(Method) := QtScrollBar.SlotSliderReleased; - QAbstractSlider_hook_hook_sliderReleased(QAbstractSlider_hook_create(QtScrollBar.Widget), Method); - - QAbstractSlider_valueChanged_Event(Method) := QtScrollBar.SlotValueChanged; - QAbstractSlider_hook_hook_valueChanged(QAbstractSlider_hook_create(QtScrollBar.Widget), Method); + QtScrollBar.AttachEvents; Result := THandle(QtScrollbar); end; @@ -453,28 +431,10 @@ end; class function TQtWSCustomListBox.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var QtListWidget: TQtListWidget; - Method: TMethod; - Hook : QListWidget_hookH; begin QtListWidget := TQtListWidGet.Create(AWinControl, AParams); - // Various Events - - Hook := QListWidget_hook_create(QtListWidget.Widget); - - TEventFilterMethod(Method) := QtListWidget.EventFilter; - - QObject_hook_hook_events(Hook, Method); - - // OnSelectionChange event - QListWidget_currentItemChanged_Event(Method) := QtListWidget.SlotSelectionChange; - QListWidget_hook_hook_currentItemChanged(QListWidget_hook_create(QtListWidget.Widget), Method); - - QListWidget_itemDoubleClicked_Event(Method) := QtListWidget.SignalItemDoubleClicked; - QListWidget_hook_hook_ItemDoubleClicked(QListWidget_hook_create(QtListWidget.Widget), Method); - - QListWidget_itemClicked_Event(Method) := QtListWidget.SignalItemClicked; - QListWidget_hook_hook_ItemClicked(QListWidget_hook_create(QtListWidget.Widget), Method); + QtListWidget.AttachEvents; // QListWidget_itemClicked_Event(Method; @@ -628,22 +588,10 @@ class function TQtWSCustomMemo.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var QtTextEdit: TQtTextEdit; - Method: TMethod; - Hook : QTextEdit_hookH; begin QtTextEdit := TQtTextEdit.Create(AWinControl, AParams); + QtTextEdit.AttachEvents; - Hook := QTextEdit_hook_create(QtTextEdit.Widget); - - TEventFilterMethod(Method) := QtTextEdit.EventFilter; - - QObject_hook_hook_events(Hook, Method); - - {TODO: BUG CopyUnicodeToPWideString() segfaults while calling SetLength() - workaround: add try..except around SetLength() } - QTextEdit_textChanged_Event(Method) := QtTextEdit.SignalTextChanged; - QTextEdit_hook_hook_textChanged(QTextEdit_hook_create(QtTextEdit.Widget), Method); - Result := THandle(QtTextEdit); end; @@ -767,21 +715,9 @@ class function TQtWSCustomEdit.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var QtLineEdit: TQtLineEdit; - Method: TMethod; - Hook : QLineEdit_hookH; begin QtLineEdit := TQtLineEdit.Create(AWinControl, AParams); - - Hook := QLineEdit_hook_create(QtLineEdit.Widget); - - TEventFilterMethod(Method) := QtLineEdit.EventFilter; - - QObject_hook_hook_events(Hook, Method); - - {TODO: BUG CopyUnicodeToPWideString() segfaults while calling SetLength() - workaround: add try..except around SetLength() } - QLineEdit_textChanged_Event(Method) := QtLineEdit.SignalTextChanged; - QLineEdit_hook_hook_textChanged(QLineEdit_hook_create(QtLineEdit.Widget), Method); + QtLineEdit.AttachEvents; Result := THandle(QtLineEdit); end; @@ -972,31 +908,14 @@ class function TQtWSButton.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; var QtPushButton: TQtPushButton; - Method: TMethod; - Hook : QObject_hookH; begin QtPushButton := TQtPushButton.Create(AWinControl, AParams); - - // Various Events - - Hook := QObject_hook_create(QtPushButton.Widget); - - TEventFilterMethod(Method) := QtPushButton.EventFilter; - - QObject_hook_hook_events(Hook, Method); - - // OnClick Event - - QAbstractButton_clicked2_Event(Method) := QtPushButton.SlotClicked; - - QAbstractButton_hook_hook_clicked2(QAbstractButton_hook_create(QtPushButton.Widget), Method); + QtPushButton.AttachEvents; // Focus - QWidget_setFocusPolicy(QtPushButton.Widget, QtStrongFocus); // Returns the Handle - Result := THandle(QtPushButton); end; @@ -1160,29 +1079,18 @@ end; class function TQtWSCustomCheckBox.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; var QtCheckBox: TQtCheckBox; - Method: TMethod; - Hook : QAbstractButton_hookH; ATextWidth: Integer; FM: QFontMetricsH; Str: WideString; begin QtCheckBox := TQtCheckBox.Create(AWinControl, AParams); + QtCheckBox.AttachEvents; // Focus // QWidget_setFocusPolicy(QtCheckBox.Widget, QtStrongFocus); {we have a bug in LCL when parent is TCustomCheckGroup, it doesn't set sizes for items ?!? Width = 0 , Height = 0} // writeln('WW=',QWidget_width(QtCheckBox.Widget),' WH=',QWidget_height(QtCheckBox.Widget),' WCW=',AWinControl.Width,' WCH=',AWinControl.Height,' CAPTION=',TCustomCheckBox(AWinControl).Caption); - Hook := QCheckBox_hook_create(QtCheckBox.Widget); - - TEventFilterMethod(Method) := QtCheckBox.EventFilter; - - QObject_hook_hook_events(Hook, Method); - - - QCheckBox_stateChanged_Event(Method) := QtCheckBox.SignalStateChanged; - QCheckBox_hook_hook_stateChanged(QCheckBox_hook_create(QtCheckBox.Widget), Method); - {we must cheat TCustomCheckGroup here with some reasonable CheckBox size...} if AWinControl.Height = 0 then begin @@ -1301,23 +1209,13 @@ class function TQtWSRadioButton.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; var QtRadioButton: TQtRadioButton; - Method: TMethod; - Hook : QAbstractButton_hookH; ATextWidth: Integer; FM: QFontMetricsH; Str: WideString; begin - QtRadioButton := TQtRadioButton.Create(AWinControl, AParams); + QtRadioButton.AttachEvents; - // Various Events - - Hook := QAbstractButton_hook_create(QtRadioButton.Widget); - - TEventFilterMethod(Method) := QtRadioButton.EventFilter; - - QObject_hook_hook_events(Hook, Method); - {we must cheat TCustomRadioGroup here with some reasonable RadioButton size...} if AWinControl.Height = 0 then begin @@ -1336,9 +1234,6 @@ begin AWinControl.SetInitialBounds(0, 0, ATextWidth + 22, 22); end; - QAbstractButton_clicked_Event(Method) := QtRadioButton.SignalClicked; - QAbstractButton_hook_hook_clicked(QAbstractButton_hook_create(QtRadioButton.Widget), Method); - // Focus //QWidget_setFocusPolicy(QtRadioButton.Widget, QtStrongFocus); @@ -1376,19 +1271,14 @@ class function TQtWSCustomGroupBox.CreateHandle(const AWinControl: TWinControl; var QtGroupBox: TQtGroupBox; Str: WideString; - Method: TMethod; - Hook : QGroupBox_hookH; begin QtGroupBox := TQtGroupBox.Create(AWinControl, AParams); + QtGroupBox.AttachEvents; // If SetSlots is uncommented, then TRadioGroup stops working // This needs further investigation --> Problem is with child controls sizes (zeljko@holobit.net) // SetSlots(QtButtonGroup); - Hook := QGroupBox_hook_create(QtGroupBox.Widget); - TEventFilterMethod(Method) := QtGroupBox.EventFilter; - QObject_hook_hook_events(Hook, Method); - Str := UTF8Decode(AWinControl.Caption); QGroupBox_setTitle(QGroupBoxH(QtGroupBox.Widget), @Str); @@ -1427,32 +1317,9 @@ class function TQtWSCustomComboBox.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; var QtComboBox: TQtComboBox; - Method: TMethod; - Hook : QObject_hookH; begin QtComboBox := TQtComboBox.Create(AWinControl, AParams); - - // Various Events - - Hook := QObject_hook_create(QtComboBox.Widget); - - TEventFilterMethod(Method) := QtComboBox.EventFilter; - - QObject_hook_hook_events(Hook, Method); - - // OnChange event - - QComboBox_editTextChanged_Event(Method) := QtComboBox.SlotChange; - - QComboBox_hook_hook_editTextChanged( - QComboBox_hook_create(QtComboBox.Widget), Method); - - // OnSelect event - - QComboBox_currentIndexChanged_Event(Method) := QtComboBox.SlotSelect; - - QComboBox_hook_hook_currentIndexChanged( - QComboBox_hook_create(QtComboBox.Widget), Method); + QtComboBox.AttachEvents; Result := THandle(QtComboBox); end;