SIGSEGV с TDBLookupComboBox на модальной форме

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

pupsik писал(а):Осмелюсь спросить: вы хоть знаете что делает RecreateWnd?

Код: Выделить всё

{------------------------------------------------------------------------------
 RecreateWnd
 This function was originally member of TWincontrol. From a VCL point of view
 that made perfectly sense since the VCL knows when a win32 widget has to be
 recreated when properties have changed.
 The LCL however doesn't know, the widgetset does. To avoid old VCL behaviour
 and to provide a central function to the widgetset, it is moved here.
 MWE.
------------------------------------------------------------------------------}
procedure RecreateWnd(const AWinControl:TWinControl);
var
  IsFocused: Boolean;
begin
  if csDestroying in AWinControl.ComponentState then Exit;
  if wcfCreatingHandle in AWinControl.FWinControlFlags then exit;

  if not AWinControl.HandleAllocated
  then begin
    // since only the interface (or custom interface dependent controls) should
    // call us, the handle is always created
    {$IFNDEF DisableChecks}
    DebugLN('WARNING: obsolete call to RecreateWnd for %s', [AWinControl.ClassName]);
    {$ENDIF}
    //DumpStack;
  end;

  IsFocused := AWinControl.Focused;
  AWinControl.DestroyHandle;
  AWinControl.UpdateControlState;
  if IsFocused and AWinControl.HandleAllocated
  then SetFocus(AWinControl.FHandle);
end;           
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Сообщение java73 »

Закомментировал полностью всю RecreateWnd. Ничего не поменялось, всё работает. В dblookup и customform ничего не патчил.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

java73 кардинально как то :shock: Может патч такой предложить? :))))
В особенности: что у вас там не работало, и что должно делать = неизвестность...
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

java73 писал(а):Закомментировал полностью всю RecreateWnd. Ничего не поменялось, всё работает. В dblookup и customform ничего не патчил.

Да, это ВРЕМЕННО решило Вашу проблему, но баг остался в Вашей программе, т.к. вызывать сбоев RecreateWnd - не должно.
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Сообщение java73 »

Посмотрим, что разработчики скажут)) у кого там баг
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

java73 разработчики - образное понятие. Т.е. вы то же можете им стать. Было бы желание.

п.с.
Хотя да: куда веселей подождать (я это и о себе).
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

Изменения за последнее время в транке

Код: Выделить всё

+++ lcl/dbctrls.pp   (working copy)
@@ -450,6 +450,7 @@
     procedure DataChange(Sender: TObject); override;
     procedure DoSelectionChange(User: Boolean); override;
     procedure InitializeWnd; override;
+    procedure DestroyWnd; override;
     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
     procedure Loaded; override;
     procedure UpdateData(Sender: TObject); override;
@@ -799,6 +800,7 @@
   protected
     procedure CloseUp; override;
     procedure InitializeWnd; override;
+    procedure DestroyWnd; override;
     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
     procedure Loaded; override;
     procedure UpdateData(Sender: TObject); override;

Код: Выделить всё

+++ lcl/include/dblookupcombobox.inc   (working copy)
@@ -57,6 +57,13 @@
     Text := '';
 end;
 
+procedure TDBLookupComboBox.DestroyWnd;
+begin
+  inherited;
+  //after handle destroy Items address changes
+  FLookup.ControlItems := Items;
+end;
+
 procedure TDBLookupComboBox.Select;
 begin
   FDataLink.UpdateData;

Код: Выделить всё

+++ lcl/include/dblookuplistbox.inc   (working copy)
@@ -44,6 +44,13 @@
     ItemIndex := -1;
 end;
 
+procedure TDBLookupListBox.DestroyWnd;
+begin
+  inherited;
+  //after handle destroy Items address changes
+  FLookup.ControlItems := Items;
+end;
+
 procedure TDBLookupListBox.DoSelectionChange(User: Boolean);
 begin
   if User then


Добавлено спустя 10 минут 7 секунд:
Разработчики пофиксили так:
http://svn.freepascal.org/cgi-bin/viewv ... sion=54441
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Изменения за последнее время в транке
Собственно это и есть фикс Ondrej Pokorny

Код: Выделить всё

Index: lcl/include/dblookupcombobox.inc
===================================================================
--- lcl/include/dblookupcombobox.inc   (revision 54440)
+++ lcl/include/dblookupcombobox.inc   (revision 54441)
@@ -57,6 +57,13 @@
     Text := '';
 end;
 
+procedure TDBLookupComboBox.DestroyWnd;
+begin
+  inherited;
+  //after handle destroy Items address changes
+  FLookup.ControlItems := Items;
+end;
+
 procedure TDBLookupComboBox.Select;
 begin
   FDataLink.UpdateData;
Index: lcl/include/dblookuplistbox.inc
===================================================================
--- lcl/include/dblookuplistbox.inc   (revision 54440)
+++ lcl/include/dblookuplistbox.inc   (revision 54441)
@@ -44,6 +44,13 @@
     ItemIndex := -1;
 end;
 
+procedure TDBLookupListBox.DestroyWnd;
+begin
+  inherited;
+  //after handle destroy Items address changes
+  FLookup.ControlItems := Items;
+end;
+
 procedure TDBLookupListBox.DoSelectionChange(User: Boolean);
 begin
   if User then
Index: lcl/dbctrls.pp
===================================================================
--- lcl/dbctrls.pp   (revision 54440)
+++ lcl/dbctrls.pp   (revision 54441)
@@ -450,6 +450,7 @@
     procedure DataChange(Sender: TObject); override;
     procedure DoSelectionChange(User: Boolean); override;
     procedure InitializeWnd; override;
+    procedure DestroyWnd; override;
     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
     procedure Loaded; override;
     procedure UpdateData(Sender: TObject); override;
@@ -799,6 +800,7 @@
   protected
     procedure CloseUp; override;
     procedure InitializeWnd; override;
+    procedure DestroyWnd; override;
     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
     procedure Loaded; override;
     procedure UpdateData(Sender: TObject); override;

Репорт закройте и ищите-пишите новые
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Сообщение java73 »

Ну и у кого там код с багами
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

У меня. У тебя. у всех
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

Можно сказать: красиво.

Ну и у кого там код с багами
у программиста пишущего программу. Или вы суп..пер- п..пупер безошибочный с первого раза?
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Сообщение java73 »

А я и не программист. Нуждазаставила, а там понеслось. Два года уже пользуюсь, сэкономил мож 50% рабочего времени.
Ответить