Конференция "KOL" » ListView в DLL
 
  • zldo (26.04.08 14:38) [0]
    Пишу dll c для простоты отладки использую отдельный проект (exe) благо функции рализуемые в dll практически полностью автономны. Создал форму - на форме ListView - OwnerDrawFixed, DetailNoHeader, этот контрол заплняется динамически из потока по "SynhronizeEx".
    В exe все замечательно работает, при компиляции етого кода в DLL вылизают 2 проблемы:
    1. Не правильно задается высота элементов (вылечил перехватом WM_MESUREITEM, в OnMessage панели на которой лежит ListView)
    2. Не происходит прорисовки в ListView до тех пор пока не "появится" полоса прокрутки или размеры ListView не будут изменены вручную (т.е. изменяем размеры окна и как сдедствие размеры ListView)
    Может кто подскажет с чем связаны эти глюки и как победить второй.
  • Compiler © (27.04.08 15:08) [1]
    Нет кода, нет помощи. Поделюсь первым.

    var
     LV:PControl;
     Th:PThread;
    function OnDrawItem( P:Pointer; Sender: PObj; DC: HDC; const Rect: TRect; ItemIdx: Integer;
                              DrawAction: TDrawAction; ItemState: TDrawState ): Boolean ;
    var
     R:Trect;
    i:integer;
    begin
     R:=Rect;
     FillRect(DC,R, CreateSolidBrush(ClWhite));
    {  if odsSelected in ItemState then
     begin
       FillRect(DC,R, GetSysColorBrush(COLOR_BTNSHADOW));
       SetBkMode(DC,TRANSPARENT);
     end; }

     for i:=0 to Pcontrol(Sender).Count-1 do
     begin
     R:=Pcontrol(Sender).LVSubItemRect(ItemIdx,i);
     if i=0 then begin
         R.Right:=Pcontrol(Sender).LVColWidth[i];
         Inc(R.Left,40);
       end;
     DrawText(DC,Pchar( Pcontrol(Sender).LVItems[ItemIdx,i]),
          Length(Pcontrol(Sender).LVItems[ItemIdx,i]),R,
          DT_SINGLELINE or DT_LEFT or DT_NOPREFIX or DT_VCENTER or DT_WORD_ELLIPSIS);
     end;
    if odsFocused in ItemState then
       InvertRect(DC,Rect);
      Result:=True;
    end;

    function LVAdd(Sender:PThread):integer;
    var
     i:integer;
    begin
    for i:=1 to 50 do  begin
      LV.LVItemAdd('Строка #'+int2str(i))  ;
      LV.LVItems[I-1,1]:='Строка #'+int2str(i)  ;
      end;
    end;

    procedure ShowForm(); stdcall;
    var
    F:Pcontrol;
    begin
    Applet:=newapplet('');
    f:=NewForm(Applet,'');
    LV:=NewListView(F,lvsDetailNoHeader,[lvoOwnerDrawFixed],nil,nil,nil);
    LV.LVItemHeight:=40;
    LV.LVColAdd('1',taLeft,150);
    LV.LVColAdd('2',taLeft,150);
    LV.SetAlign(caClient);
    LV.OnDrawItem:=TonDrawItem(makeMethod(nil,@OnDrawItem));
    Th:=NewThreadAutoFree(nil);
    Th.OnExecute:=TOnThreadExecute(MakeMethod(nil,@LVAdd));
    Th.Resume;
    run(applet);
    end;

    exports
      ShowForm name 'ShowForm';
    begin
    end.

Есть новые Нет новых   [134431   +15][b:0][p:0.001]