[lazarus] Bugs in TCustomListBox

Karl Brandt pascalive at bol.com.br
Sat Dec 28 15:42:35 EST 2002


  While trying to implement the ListBox/ComboBox under win32 i found 
some bugs In TCustomListBox code:

(1)   Some time ago, Martin Smat found that the wrong Items object was 
being sent through LM_SORT message (TCustomListBox.UpdateSorted).
 The problem is that the FItems is created as TExtendedStringList  and 
the interface expects a interface list type. The current solution is 
wrong because CNSendMessage(LM_GETITEMS, Self, nil) returns a new 
instance of the interface list and not the current list (see LM_GETITEMS).

procedure TCustomListBox.UpdateSorted;
var AMessage : TLMSort;
begin
  if not HandleAllocated then exit;
  with AMessage do begin
    Msg:= LM_SORT;
   --> List:= TObject(Pointer(CNSendMessage(LM_GETITEMS, Self, nil)));
    IsSorted:= FSorted;
  end;
  CNSendMessage(LM_SORT, Self, @AMessage);
end;

In CreateHandle,if  UpdateSorted is called after FItems is converted to 
a interface list type then we could just send FItems to the interface; 
To win32 is necessary that UpdateSelectionMode also come after the 
conversion;  

(2)  In LM_SETBORDER message (gtk and win32) there's a explicit typecast 
that may be wrong:
      (..) 
      If (TControl(Sender).fCompStyle = csListBox) Or 
(TControl(Sender).FCompStyle = csCListBox) Then
            Begin
              If -> TListBox(Sender)<-.BorderStyle = 
TBorderStyle(bsSingle) Then
    (..)
   If  the control is TCListBox the type cast is wrong. It's not causing 
errors, but i thing that should be corrected.
   I propose to make the BorderStyle property public in TCustomListBox 
so we can typecast to TCustomListBox and not to TListBox.
   BTW is there any problem to make the Sorted property public in 
TCustomListBox?
This would  facilitate the implementation of Sorted under win32.

Karl Brandt







More information about the Lazarus mailing list