Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.043 c
1-1081861359
BOA_KAA
2004-04-13 17:02
2004.05.02
Регистрация редактора свойств в D7


3-1080896327
Max_
2004-04-02 12:58
2004.05.02
DBExpress и Отчаяние


14-1081406305
Мараканец
2004-04-08 10:38
2004.05.02
Делфи восьмой


3-1081108317
nika_ufc
2004-04-04 23:51
2004.05.02
Добрый вечер Мастера. Помогите c ADO и Oracle


3-1080988684
race1
2004-04-03 14:38
2004.05.02
integer overflow в гриде





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский