Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> StringGrid + TextOut + Рисование в ячейках 
V
    Опции темы
Kuvaldis
Дата 9.10.2007, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



Всем привет!
Такая проблема: 
нужно заполнить 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;

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

Это сообщение отредактировал(а) Kuvaldis - 9.10.2007, 15:39


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Alix
Дата 9.10.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



Проблема, как несложно понять в этом месте:
Код
            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 ) );





--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Kuvaldis
Дата 9.10.2007, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



Alix, 
Реально выручил smile


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.