Форум: "Основная";
Текущий архив: 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.034 c