[lazarus] Possible bug in FPC or in Lazarus?

Michael.VanCanneyt at Wisa.be Michael.VanCanneyt at Wisa.be
Thu Dec 19 13:09:00 EST 2002




On Thu, 19 Dec 2002, Martin Smat wrote:

> Hi,
> Look at the procedure TCustomListBox.CreateHandle:
>
> procedure TCustomListBox.CreateHandle;
> var
>    NewStrings : TStrings;
>    i: integer;
> begin
>    inherited CreateHandle;
>    CNSendMessage(LM_SETBORDER, Self, nil);
>    UpdateSelectionMode;
> (1)  UpdateSorted;
>    NewStrings:= TStrings(Pointer(CNSendMessage(LM_GETITEMS, Self, nil)));
>    NewStrings.Assign(Items);
>    for i:=0 to Items.Count-1 do begin
>      if clbiSelected in GetListBoxItemRecord(FItems,i)^.Flags then
>        SendItemSelected(i,True);
>    end;
>    FItems.Free;
>    FItems:= NewStrings;
>    CNSendMessage(LM_SETITEMINDEX, Self, Pointer(FItemIndex));
> end;
>
> Line (1) UpdateSorted sends LM_SORT message which works with
> TGtkCListStringList (in GTK) or with TWin32CListStringList (in Win32)
> object. These classes are descendands of class TStringList.
> In constructor TCustomListBox.Create is line
> FItems := TExtendedStringList.Create(...). TExtendedString is descendand
> of class TStringList too.
> So we have folowing classes:
>    TStringList
>      |
>      |---TWin32CListStringList
>      |
>      |---TExtendedString
>
> When processing the LM_SORT message in interface, there is this
> typecasting (symplified):
>    TWin32CListStringList(FItems).Sorted:=...
> This line calls TWin32CListStringList.SetSorted method.

This is wrong, since TWin32CListStringList does not descend from
TExtendedString.

What is more, based on what I think it should do, I think that
TWin32CListStringList should not descend from TStringList but
from TStrings.

>
> On this line crashes the listboxtest.pp example. I think it is because
> of calling the SetSorted method. This method is not in TExtendedString
> class.
> Listboxtest example ends with "Unknown Run-Time Error : 217". (tested in
> Win32)

217 is an abstract error. It seems that some abstract method has not been
properly implemented. Try compiling everything with version 1.1 of the
compiler, it will tell you (warning/note) when a class containing an
abstract method is constructed somewhere.

Michael.






More information about the Lazarus mailing list