在TListView和旧版本的C ++ Builder上闪烁

时间:2018-07-18 08:05:34

标签: drag-and-drop c++builder vcl c++builder-6

在我当前的项目中,我需要使用旧版本的C ++ Builder(5)。

我尝试使用

在TListView上实现拖放
  • MultiSelect
  • DragMode dmManual
  • BeginDrag()

拖动代码非常简单:

void __fastcall TFormMain::ListView1MouseMove( TObject *Sender, TShiftState Shift, int X, int Y)
{
    if ( Shift.Contains( ssLeft ) )
    {

        // if ( !dynamic_cast< TControl * >( Sender )->Dragging() )
        if ( !static_cast< TControl * >( Sender )->Dragging() )
        {
            ListView1->BeginDrag( false );
        }
    }
}

只要我在较新版本的C ++ Builder(例如XE2或XE10)上编译并运行此代码,一切都可以正常工作。但是,当我在C ++ Builder 5或C ++ Builder 6上编译此代码时,ListView控件显示出难看的行为:一旦我开始拖动ListView中的项目之一,就会出现非常严重的闪烁,这使得鼠标光标几乎不可移动。 / p>

现在我的问题:是否可以在将dmManual与MultiSelect结合使用的这些旧版本上实现无闪烁

其他内容:

以这种方式填充ListView:

void __fastcall TFormMain::ButtonPopulateListViewClick(TObject *Sender)
{
    for ( int i = 0; i < 20; ++i )
    {
        AnsiString Name = System::Sysutils::Format( "Record Nr. %d", ARRAYOFCONST(( i )) );
        TListItem *ListItem = ListView1->Items->Add();

        ListItem->Data = new Record( Name, i );

        ListItem->Caption = Name;
    }
}

...这是Record类:

class Record
{
    private:
        AnsiString Name;
        int Value;
    public:
        Record( AnsiString AName, int AValue ) : Name( AName ), Value( AValue ) {}

        AnsiString GetName( void ) { return Name; };
};

编辑:

我知道当我切换到dmAutomatic并使用TListView的OnStartDrag()事件时,闪烁消失了。但是由于其他原因,这不是一个选择,因此也无法回答我的问题。

谢谢!

0 个答案:

没有答案