Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ListView в DLL


zldo ©   (2008-04-26 14:38:00) 

Пишу dll c для простоты отладки использую отдельный проект (exe) благо функции рализуемые в dll практически полностью автономны. Создал форму - на форме ListView - OwnerDrawFixed, DetailNoHeader, этот контрол заплняется динамически из потока по "SynhronizeEx".
В exe все замечательно работает, при компиляции етого кода в DLL вылизают 2 проблемы:
1. Не правильно задается высота элементов (вылечил перехватом WM_MESUREITEM, в OnMessage панели на которой лежит ListView)
2. Не происходит прорисовки в ListView до тех пор пока не "появится" полоса прокрутки или размеры ListView не будут изменены вручную (т.е. изменяем размеры окна и как сдедствие размеры ListView)
Может кто подскажет с чем связаны эти глюки и как победить второй.


Compiler   (2008-04-27 15:08:00) [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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо