Очистка canvas DrawGrid

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Очистка canvas DrawGrid

Сообщение dvpt » 30.03.2009 14:58:04

Не понятная ситуация.
Полность перенес отрисовку DrawGrid из Delhi.
Очищает все поле прорисовки только один раз при открытии DrawGrid.
После категорически отказывается.
Видимо какая то недоработка в Lazarus или я что то непонимаю?
dvpt
новенький
 
Сообщения: 38
Зарегистрирован: 18.03.2009 11:46:04

Re: Очистка canvas DrawGrid

Сообщение haword » 31.03.2009 08:40:05

проверяй системный вызов LM_PAINT
haword
постоялец
 
Сообщения: 301
Зарегистрирован: 02.03.2006 11:34:40

Re: Очистка canvas DrawGrid

Сообщение dvpt » 31.03.2009 13:04:56

можно уточнить, где его "системный вызов LM_PAINT" проверить?
По хелпу и исходникам не понял что это, И почему без него все работает в Delphi?
dvpt
новенький
 
Сообщения: 38
Зарегистрирован: 18.03.2009 11:46:04

Re: Очистка canvas DrawGrid

Сообщение haword » 31.03.2009 13:17:17

в винде называется WM_PAINT, это системное сообщение посылается окну когда надо его перерисовать. В лазаре оно называется LM_PAINT. Обычно компоненты которые саим рисуют что либо, перекрывают его. Ты скорее всего неправильно портировал что ни будь и убрал этот вызов. Поставь точку останова на него и смотри. И еще напрямую переносить код непозваляет тебе твое лицензионное соглашение с борландом :)
haword
постоялец
 
Сообщения: 301
Зарегистрирован: 02.03.2006 11:34:40

Re: Очистка canvas DrawGrid

Сообщение dvpt » 01.04.2009 11:02:55

Как ни странно все хорошо работает в Lazarus под Linux`сом :roll:
dvpt
новенький
 
Сообщения: 38
Зарегистрирован: 18.03.2009 11:46:04

Re: Очистка canvas DrawGrid

Сообщение dvpt » 02.04.2009 15:32:54

Вставил пред открытим Grida такой код:
IntersectClipRect(PictGrid1.Canvas.Handle, PictGrid1.Left, PictGrid1.Top, PictGrid1.Left + PictGrid1.Width, PictGrid1.Top + Height);
PictGrid1.Perform(LM_PAINT, PictGrid1.Canvas.Handle, 0);
Application.ProcessMessages;

Помогло, но нен до конца :cry:

Добавлено спустя 1 час 10 минут 14 секунд:
Может что еще надо сделать?
dvpt
новенький
 
Сообщения: 38
Зарегистрирован: 18.03.2009 11:46:04

Re: Очистка canvas DrawGrid

Сообщение haword » 02.04.2009 17:20:48

странный ты человек. мы ж не знаем что ты там намутил не видя полностью твоего кода? Всеранво что я тебе щас скажу - у меня есть программа, она передает данные через интернет, но почему то не работает, не подскажешь почему? :)
Чтобы понять почему не работает или по чему работает в линуксе, ставишь точки останова на функции прорисовки и смотришь почему куда надо программа не попадает.
haword
постоялец
 
Сообщения: 301
Зарегистрирован: 02.03.2006 11:34:40

Re: Очистка canvas DrawGrid

Сообщение dvpt » 04.04.2009 21:25:21

Согласен конечно :) Буду разбираться.
dvpt
новенький
 
Сообщения: 38
Зарегистрирован: 18.03.2009 11:46:04

Re: Очистка canvas DrawGrid

Сообщение dvpt » 09.04.2009 20:38:14

Код довольно простой, выводит список файлов

procedure TForm1.KinoGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
var
h, c: Integer;
i, ii: Integer;
s, ss : String;
a : String;
begin
if VideoLst = NIL then exit;
if VideoLst.Count = 0 then exit;
i := KinoGrid1.ColCount * ARow + ACol;// Пересчитываем координаты ячейки в индекс списка:
with KinoGrid1.Canvas, VideoLst do begin
if (gdFocused in aState) then
if i < VideoLst.Count then iVideo := i;// запоминаю текущую строку
CopyMode := cmSrcCopy;
Brush.Style := bsClear;
Brush.Color := clWhite;
FillRect( ARect);
CopyRect( ARect, Image4.Canvas, Image4.Canvas.ClipRect);
if i < VideoLst.Count then begin
ii := Pos(':',VideoLst[i]);// разбираем имя файла
if ii > 0 then begin
s := Copy(VideoLst[i],1,ii-1);
ss := Copy(VideoLst[i],ii+1,255);
end else begin
s := VideoLst[i];
ss := '';
end;
CopyMode := cmSrcAnd;
Font.Name := Family.Font.Name;
Font.Name := Family.Font.Name;
//рисую имя файла
Font.Color := clGreen;
Font.Style := [fsBold];
c := TextWidth('W');//ширина одного символа
h := TextHeight('W');//высота одного символа
ii := 1;
a := '';
for i := 1 to Length(s) do begin
a := a + Copy(s,i,1);
if (((TextWidth(a)+c) >= (ARect.Bottom - ARect.Top)) or (i = Length(s))) then begin
TextRect( ARect, ARect.Left+4, ARect.Top+(ii-1)*h, a);
a := '';
Inc(ii);
if (ii > (((ARect.Bottom - ARect.Top) div 2) div h)) then break;//max колич. строк
end;
end;
//рисую пояснения к файлу
Font.Color := clBlue;
Font.Style := [fsBold,fsItalic];
c := TextWidth('W');//ширина одного символа
h := TextHeight('W');//высота одного символа
a := '';
for i := 1 to Length(ss) do begin
a := a + Copy(ss,i,1);
if (((TextWidth(a)+c) >= (ARect.Bottom - ARect.Top)) or (i = Length(ss))) then begin
TextRect( ARect, ARect.Left+4, ARect.Top+(ii-1)*h, a);
a := '';
Inc(ii);
if (ii > (((ARect.Bottom - ARect.Top) div 2) div h)) then break;//max колич. строк
end;
end;
end;
end;
end;
dvpt
новенький
 
Сообщения: 38
Зарегистрирован: 18.03.2009 11:46:04

Re: Очистка canvas DrawGrid

Сообщение dvpt » 11.04.2009 22:04:02

Версия 2.2.4rc1 сильно помогла :-)
2.2.5 пока не пробовал, думаю она еще лучше.
DrawGrid заработал правильно.
dvpt
новенький
 
Сообщения: 38
Зарегистрирован: 18.03.2009 11:46:04


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28

Рейтинг@Mail.ru