mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-21 23:19:29 +02:00
Qt: Fixed segfault in destroying form handle when form is child of another control.Fixed segfault in TQtListStrings.Clear() - we must check here if handle exist since Clear is called when control is destroyed.Introduced TQtComboBox.ClearItems, TQtListWidget.ClearItems for faster deletion of items in TQtListStrings and TQtComboStrings.
git-svn-id: trunk@24088 -
This commit is contained in:
parent
e9613684e0
commit
2307785cf3
@ -402,24 +402,24 @@ end;
|
||||
|
||||
procedure TQtComboStrings.Put(Index: Integer; const S: string);
|
||||
begin
|
||||
FOwner.BeginUpdate;
|
||||
inherited Put(Index, S);
|
||||
FOwner.BeginUpdate;
|
||||
FOwner.setItemText(Index, S);
|
||||
FOwner.EndUpdate;
|
||||
end;
|
||||
|
||||
procedure TQtComboStrings.InsertItem(Index: Integer; const S: string);
|
||||
begin
|
||||
FOwner.BeginUpdate;
|
||||
inherited InsertItem(Index, S);
|
||||
FOwner.BeginUpdate;
|
||||
FOwner.insertItem(Index, S);
|
||||
FOwner.EndUpdate;
|
||||
end;
|
||||
|
||||
procedure TQtComboStrings.InsertItem(Index: Integer; const S: string; O: TObject);
|
||||
begin
|
||||
FOwner.BeginUpdate;
|
||||
inherited InsertItem(Index, S, O);
|
||||
FOwner.BeginUpdate;
|
||||
FOwner.insertItem(Index, S);
|
||||
FOwner.EndUpdate;
|
||||
end;
|
||||
@ -443,17 +443,21 @@ var
|
||||
C: Integer;
|
||||
begin
|
||||
C := Count;
|
||||
FOwner.BeginUpdate;
|
||||
inherited Clear;
|
||||
for I := C - 1 downto 0 do
|
||||
FOwner.removeItem(I);
|
||||
FOwner.EndUpdate;
|
||||
|
||||
if Assigned(FOwner.LCLObject) and
|
||||
(FOwner.LCLObject.HandleAllocated) then
|
||||
begin
|
||||
FOwner.BeginUpdate;
|
||||
FOwner.ClearItems;
|
||||
FOwner.EndUpdate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TQtComboStrings.Delete(Index: Integer);
|
||||
begin
|
||||
FOwner.BeginUpdate;
|
||||
inherited Delete(Index);
|
||||
FOwner.BeginUpdate;
|
||||
FOwner.removeItem(Index);
|
||||
FOwner.EndUpdate;
|
||||
end;
|
||||
@ -462,8 +466,8 @@ procedure TQtComboStrings.Sort;
|
||||
var
|
||||
I: Integer;
|
||||
begin
|
||||
FOwner.BeginUpdate;
|
||||
inherited Sort;
|
||||
FOwner.BeginUpdate;
|
||||
for I := 0 to Count - 1 do
|
||||
FOwner.setItemText(I, Strings[I]);
|
||||
FOwner.EndUpdate;
|
||||
@ -473,8 +477,8 @@ procedure TQtComboStrings.Exchange(AIndex1, AIndex2: Integer);
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
FOwner.BeginUpdate;
|
||||
inherited Exchange(AIndex1, AIndex2);
|
||||
FOwner.BeginUpdate;
|
||||
for I := 0 to Count - 1 do
|
||||
FOwner.setItemText(I, Strings[I]);
|
||||
FOwner.EndUpdate;
|
||||
@ -521,8 +525,14 @@ var
|
||||
begin
|
||||
C := Count;
|
||||
inherited Clear;
|
||||
for I := C - 1 downto 0 do
|
||||
FOwner.removeItem(I);
|
||||
|
||||
if Assigned(FOwner.LCLObject) and
|
||||
(FOwner.LCLObject.HandleAllocated) then
|
||||
begin
|
||||
FOwner.BeginUpdate;
|
||||
FOwner.ClearItems;
|
||||
FOwner.EndUpdate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TQtListStrings.Delete(Index: Integer);
|
||||
|
@ -759,6 +759,7 @@ type
|
||||
public
|
||||
FList: TStrings;
|
||||
destructor Destroy; override;
|
||||
procedure ClearItems;
|
||||
procedure setBorder(const ABorder: Boolean);
|
||||
function currentIndex: Integer;
|
||||
function getEditable: Boolean;
|
||||
@ -952,6 +953,7 @@ type
|
||||
procedure signalSelectionChanged(); cdecl;
|
||||
procedure ItemDelegatePaint(painter: QPainterH; option: QStyleOptionViewItemH; index: QModelIndexH); cdecl; override;
|
||||
public
|
||||
procedure ClearItems;
|
||||
function currentRow: Integer;
|
||||
function IndexAt(APoint: PQtPoint): Integer;
|
||||
procedure insertItem(AIndex: Integer; AText: String); overload;
|
||||
@ -6493,6 +6495,11 @@ begin
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TQtComboBox.ClearItems;
|
||||
begin
|
||||
QComboBox_clear(QComboBoxH(Widget));
|
||||
end;
|
||||
|
||||
{------------------------------------------------------------------------------
|
||||
Function: TQtComboBox.currentIndex
|
||||
Params: None
|
||||
@ -7512,6 +7519,11 @@ begin
|
||||
TQtDeviceContext(DrawStruct.DC).Free;
|
||||
end;
|
||||
|
||||
procedure TQtListWidget.ClearItems;
|
||||
begin
|
||||
QListWidget_clear(QListWidgetH(Widget));
|
||||
end;
|
||||
|
||||
{------------------------------------------------------------------------------
|
||||
Function: TQtListWidget.currentRow
|
||||
Params: None
|
||||
|
@ -80,6 +80,7 @@ type
|
||||
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
|
||||
|
||||
class procedure CloseModal(const ACustomForm: TCustomForm); override;
|
||||
class procedure DestroyHandle(const AWinControl: TWinControl); override;
|
||||
class procedure SetAllowDropFiles(const AForm: TCustomForm; AValue: Boolean); override;
|
||||
class procedure SetFormBorderStyle(const AForm: TCustomForm; const AFormBorderStyle: TFormBorderStyle); override;
|
||||
class procedure SetFormStyle(const AForm: TCustomform; const AFormStyle: TFormStyle); override;
|
||||
@ -207,6 +208,20 @@ begin
|
||||
inherited CloseModal(ACustomForm);
|
||||
end;
|
||||
|
||||
class procedure TQtWSCustomForm.DestroyHandle(const AWinControl: TWinControl);
|
||||
var
|
||||
w: TQtWidget;
|
||||
begin
|
||||
w := TQtWidget(AWinControl.Handle);
|
||||
{forms which have another widget as parent
|
||||
eg.form inside tabpage or mdichilds
|
||||
can segfault without hiding before release.
|
||||
So we save our day here.}
|
||||
if w.getVisible and (w.getParent <> nil) then
|
||||
w.Hide;
|
||||
w.Release;
|
||||
end;
|
||||
|
||||
{------------------------------------------------------------------------------
|
||||
Method: TQtWSCustomForm.SetAllowDropFiles
|
||||
Params:
|
||||
|
Loading…
Reference in New Issue
Block a user