Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > StringGrid + TextOut + Рисование в ячейках


Автор: Kuvaldis 9.10.2007, 14:25
Всем привет!
Такая проблема: 
нужно заполнить StringGrid: одни ячейки заполняются путем закрашивания, в других должна быть текстовая информация
Заполнение делает класс (через свой метод). Поэтому свойство DefaultDrawing ставлю в false
C рисованием проблем нет, но при выводе текста через TextOut наблюдаются глюки:
выводится нужная информация (цифра), но еще выводится она же и в левом верхнем углу
2. При правом скроллинге опять происходит вывод в левый верхний угол, из-за чего заполняется цифрами верний ряд.

Рисование организую так:
Код

// визуализация правил (без масштабирования)
procedure TCelluralAutomaton.DrawRules( var RulesGrid : TStringGrid;
                                        clForeGnd, clBackGnd : TColor );
var
    i, k, delta : Integer;
    rect : TRECT;
    x, y : Integer;
begin
    with RulesGrid do
    begin
        ColCount := fRuleList.fSize * RULE_SIZE + fRuleList.fSize - 1;

        // если все влазит, то масштабируем
        if( fRuleList.fSize <= 8 ) then
            DefaultColWidth := Width  div ColCount - GridLineWidth;

        delta := 0;   // смещение от левого кравя до текущего вывода

        // вывод представлений правил
        for i := 0 to fRuleList.fSize - 1 do
        begin
            // вывод порождающих RULE_SIZE символов
            for k := 1 to RULE_SIZE do
            begin
                if( fRuleList.fListItems[i].GenVector[k] = 1 ) then
                      Canvas.Brush.Color := clForeGnd
                else
                      Canvas.Brush.Color := clBackGnd;

                rect := CellRect( delta + k - 1, 0 );
                Canvas.Rectangle( rect );
            end;

            // вывод результирующего цвета
            if( fRuleList.fListItems[i].ResColor = 1 ) then
                Canvas.Brush.Color := clForeGnd
            else
                Canvas.Brush.Color := clBackGnd;

            rect := CellRect( delta + RULE_SIZE div 2, 1 );
            Canvas.Rectangle( rect );
      
            // !!!!!!!!!!!!! Если это закомментировать, то работает, как надо

            // вывести значение бита
            Canvas.Brush.Color := clInactiveCaptionText;
            rect := CellRect( delta + RULE_SIZE div 2, 2 );

            Canvas.Pen.Color := clBlack;
            Canvas.TextOut( rect.Left + 10, rect.Top + 5,
                            IntToStr( fRuleList.fListItems[i].ResColor ) );

            delta := delta + RULE_SIZE + 1;  // расстояние между группами = 1
         //   Exit;
        end;
    end;
end;

НЕ понимаю, как это исправить

Автор: Alix 9.10.2007, 15:15
Проблема, как несложно понять в этом месте:
Код
            rect := CellRect( delta + RULE_SIZE div 2, 2);
            ...
            Canvas.TextOut( rect.Left + 10, rect.Top + 5, IntToStr( fRuleList.fListItems[i].ResColor ) );


Читаем хелп и видим:
Цитата
If the indicated cell is not visible, CellRect returns an empty rectangle.


Таким образом в тех случаях, когда ты передаешь в качестве аргументов CellRect координаты несуществующей ячейки она возвращает пустой прямоугольник. Т.е. такой: (Left:0, Top:0, Right: 0, Bottom: 0). А у тебя привязка к Left и Top, поэтому текст и выводится вверху слева. Можешь сделать простую проверку:
Код
            if (rect.Right <> 0) then
              Canvas.TextOut( rect.Left + 10, rect.Top + 5, IntToStr( fRuleList.fListItems[i].ResColor ) );



Автор: Kuvaldis 9.10.2007, 15:34
Alix, 
Реально выручил smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)