Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

Глюк в стрингриде ?   Найти похожие ветки 

 
msguns ©   (2004-04-14 20:11) [0]

Привет Мастакам !
Будьте добры, разъясните непонимающеиу такую вещь:
Имеется стрингрид, в котором я в одной из колонок имитирую кнопку,
рисуя в событии OnDrawCell картинку из TImageList. Когда узер кликает
в этой ячейке, я событии OnClick грида я определяю текущую картинку и
выбираю следующую из списка картинок (это у меня так узер должен
выбирать операцию сравнения =,>,<,>= и т.д.). Все премило работает за
одним исключением: грид не хочет отображать новую картинку, пока
я не кликну в другом столбце грида. В результате вместо красивости
получается полная непонятка. Как заставимть грид перерисовывать
новую картинку непосредственно сразу после ее смены ?

Вот куски кода:

procedure TForm1.sgrOrderDrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
var
 bm: TBitMap;
begin
 if (ACol=2) and (ARow>0) then  // Прорисовывается 2 колонка с иконкой
   with Sender as TStringGrid do
    begin
     if Cells[0,ARow]="" then exit;     // Пустая строка
//      imlOpr.Draw(Canvas,Rect.Left+2,Rect.Top,PKey(OrdersList[ARow-1])^.IIcon);  // Не рисует  
//      Попробовал через битмап, чтоб типа гам грид рисовал, а не имижлист.  Эффект тот же ;((
     bm := TBitMap.Create;
     bm.Transparent := true;
     imlOpr.GetBitmap(PKey(OrdersList[ARow-1])^.IIcon,bm);
     Canvas.Draw(Rect.Left+2,Rect.Top,bm);
     bm.Free;
    end;
end;

procedure TForm1.sgrOrderClick(Sender: TObject);
// Каждой строке грида соотв-т объект-record. Указатели на эти объекты лежат  
//  в списке OrdersList
begin
 with Sender as TStringGrid do
   if (Row>0) and (Col=2) and (Cells[0,Row]>"") then  
     // Не заголовок, не пустая строка и клик в колонке с "кнопкой"
     begin
      // Меняем операцию в тек.строке ;
      case PKey(OrdersList[Row-1])^.Cmpr of
        ckEq: PKey(OrdersList[Row-1])^.Cmpr := ckNEq;
        ckNEq: PKey(OrdersList[Row-1])^.Cmpr := ckGt;
        ckGt: PKey(OrdersList[Row-1])^.Cmpr := ckEGt;
        ckEGt: PKey(OrdersList[Row-1])^.Cmpr := ckLs;
        ckLs: PKey(OrdersList[Row-1])^.Cmpr := ckELs;
        ckELs: PKey(OrdersList[Row-1])^.Cmpr := ckEq;
      end;
     // В зависимости от выбранной операции отношения меняется результат сравнения
      SetMaskOperate(Row-1);    
    // Отладочное - результат сравнения выводится в спец.колону грида
      if PKey(OrdersList[Row-1])^.Res then
         Cells[4,Row] := "true"
      else
         Cells[4,Row] := "false";
      AlignTextInCell(sgrOrder,4,Row,false);    // Выравнивает текст на середину ячейки
     end;
end;


 
Jack128 ©   (2004-04-14 23:57) [1]

в OnClick напиши TStringGrid(Sender).Invalidate;


 
Eugene1501 ©   (2004-04-15 01:40) [2]

Достаточно InvalidateCell, иначе грид будет мигать при перерисовке.


 
MsGuns ©   (2004-04-15 13:26) [3]

>Jack128 ©   (14.04.04 23:57) [1]
Не помогает, но мигает интенсивно :))

>Eugene1501 ©   (15.04.04 01:40) [2]
Не помогает. Дело в том, что когда подменяется картинка, грид почему-то не считает, что это является поводом для перерисовки именно новой картинки, все же остальное, в т.ч. содержимое других ячеек этой же строки (а они тоже меняются), он аккуратненько перерисовывает. При втором (третьем, четвертом и т.д.) клике подряд в этой же ячейке с картинкой она рисуется как предыдущая. Для того чтобы посмотреть текущую надо кликнуть в другой колонке грида.


 
Jack128 ©   (2004-04-15 13:45) [4]


> Не помогает, но мигает интенсивно :))
нy так ;-)


> Дело в том, что когда подменяется картинка, грид почему-то
> не считает, что это является поводом для перерисовки именно
> новой картинки
то есть, не считает? Ты же сам эту картинку в ondrawcell рисуешь? Или само событие (для нужной ячейки) не вызывается?


 
MsGuns ©   (2004-04-15 18:57) [5]

И все же не сочтите за назойливость :)
Код несколько громоздок, конечно, для данного вопроса, но смісл вот в чем:
Есть обработчик OnDrawSell стрингрида, по которому в определенной ячейке рисуется картинка из коллекции витмапов в TImageList. Индекс картинки в коллекции определяется значением некторого поля структуры(record), указатель на которую связан с текущей строкой стрингрида. По клику мыши в этой ячейке в обработчике OnClick стрингрида индекс картинки возрастает на 1 или сбрасывается к первой, если текущая - последняя в коллекции.
Так вот эта самая новая картинка не отображается до тех пор, пока я не кликну еще раз (все равно в каком месте грида, но если в этой же ячейке, то покажет новую, но на момент первого клика, а не второго). Т.е. создается впечатление, что по клике (OnClick) грид "не хочет" перерисовывать именно картинку, в то время как остальные ячейки с текстом визуально изменяются (если в OnClick я их меняю). Что глюк скорее всего у меня я в общем-то подозреваю, но не врублюсь что я делаю не так.


 
Jack128 ©   (2004-04-15 19:12) [6]

Вот все, что описал у меня работает как часы с таким кодом
ImageIndxArr: array of Integer - массив индексов картинок для соответствующих ячейки
procedure TForm1.FormCreate(Sender: TObject);
var
 i: Integer;
begin
 // 1 ряд для заголовка
 DrawGrid1.RowCount := ImageList1.Count + 1;
 // 1 ряд для фиксированного стобца
 DrawGrid1.ColCount := 2;
 SetLength(ImageIndxArr, DrawGrid1.RowCount - 1);
 for i := 0 to Length(ImageIndxArr) - 1  do
   ImageIndxArr[i] := i;
end;

procedure TForm1.DrawGrid1Click(Sender: TObject);
begin
 with TDrawGrid(Sender) do
 begin
   if (Col = 0) or (Row = 0) then Exit;
   if ImageIndxArr[Row - 1] = ImageList1.Count - 1 then
     ImageIndxArr[Row - 1] := 0
   else
     inc(ImageIndxArr[Row - 1]);
   Invalidate;
 end;
end;

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
begin
 if (ACol = 0) or (ARow = 0) then Exit;
 ImageList1.Draw(TDrawGrid(Sender).Canvas, Rect.Left, Rect.Top,
   ImageIndxArr[ARow - 1]);
end;


 
Jack128 ©   (2004-04-15 19:16) [7]

Кстати, насчет Invalidate и InvalidateCell попрошу без наездов -)) В D5 нет метода InvalidateCell


 
MsGuns ©   (2004-04-15 19:21) [8]

Ну стояло у меня у меня Invalidate в OnClick`е !!!! Потом убрал как не возымевшее никакого эффекта ! Блин, так и не понял я где глаз косануло... Уберу, наверное, картинки и вместо них буду писать символы типа больше, меньше и т.д. Хоть некрасиво, зато 100% надежности и простоты
За участие в моем горюшке списибо большое.


 
Jack128 ©   (2004-04-15 19:33) [9]


> 8] MsGuns ©  
спокойно и без нервов :-)

Группами брек поинтов умеешь пользоваться?
Поставь breakpoint в OnClick, что бы он включал брик поинт в OnDrawCell, которой срабатывает при определенных значениях ACol и ARow(естественно кликать нужно именно по этой ячейке) и там посмотри что и как рисуется..



Страницы: 1 вся ветка

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
1-1082122683
ширинашрифта
2004-04-16 17:38
2004.05.02
каким образом подобрать ширину шрифта memo


3-1081144026
Xmen
2004-04-05 09:47
2004.05.02
Запрос


3-1081165778
Санек
2004-04-05 15:49
2004.05.02
Как достать список пользователей домена ?


6-1077816770
rrew
2004-02-26 20:32
2004.05.02
TServerSocket &amp; ClientSocket


3-1080873973
Angel_Forever
2004-04-02 06:46
2004.05.02
Преполнение стека