C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Проблема с TStringGrid, Глюки с перемещением строк
Schumi
Отправлено: 06.08.2003, 21:19


Машинист паровоза

Группа: Участник
Сообщений: 206



Есть компонент TStringGrid. Делаю собственную прорисовку.Вроде всё нормально.Разрешено перемещение строк.
Естествеено,когда перемещаю,появляется жирная полоса.Вроде всё ок.Но,иногда бывает,что тыкну на строке,и жирная полоса остаётся.Запускается собственная прорисовка,рисует,и снова чертится полоса.Остаётся до тех пор,пока действительно не начну перемещать строки.
Георгий
Отправлено: 07.08.2003, 00:46


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



что то не пойму как это выглядит — дай посмотреть (т.е. обкромсаный проектик дай)
Schumi
Отправлено: 07.08.2003, 22:34


Машинист паровоза

Группа: Участник
Сообщений: 206



Смысла особого нет смотреть проект.Ведь дело в том,что я,не прорисовываю ни каким образом эти жирные линии в случае перемещения строк.
Просто отменил DefaultDrawing. И использую свою функцию OnDrawing. В опциях разрешаю перемещение,но программно нигде не выполняю рисование в случае перемещения.Это,по ходу,выполняет сам Windows.
Георгий
Отправлено: 08.08.2003, 02:05


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Да я понять не мог какие и где эти линии...
А сейчас вспомнил — у самого так было.
Ты как определяешь размеры ячеек? Надо с помощью CellRect:
CODE
void __fastcall TWaitingWagonForm::StringGrid1DrawCell(TObject *Sender,
     int ACol, int ARow, TRect &Rect, TGridDrawState State)
{
DrawCells(this->StringGrid1,ACol,ARow,Rect,TGridDrawState());        
}
CODE
void DrawCells(TStringGrid* ptr,int ACol,int ARow, TRect &Rect,TGridDrawState& State,const Array<TColor>*Colors=0,const TColor* HeaderColor=0)
    {
    TColor oldBrush;
    TColor newcolor;
    oldBrush=ptr->Canvas->Brush->Color;
    int l,u;

    if (ptr->ColWidths[ACol]!=Rect.Width())
       return;
    if (Colors)
       {
       newcolor=(*Colors)[ARow%Colors->Count()];
       }
    else
         switch (ARow%3)
                {
                case 0:
                     newcolor=clLime;
                     break;
                case 1:
                     newcolor=clYellow;
                     break;
                case 2:
                     newcolor=clAqua;
                     break;
                };
    if (State.Contains(gdSelected))
       {
       newcolor=clFuchsia;
       };

    if (ARow==0/*State.Contains(gdFixed)*/)
       {
       newcolor=(HeaderColor)?(*HeaderColor):(clLtGray);
       };
    ptr->Canvas->Brush->Color=newcolor;
    ptr->Canvas->FillRect(ptr->CellRect(ACol,ARow));
    l=ptr->CellRect(ACol,ARow).Left+(ptr->ColWidths[ACol]-ptr->Canvas->TextWidth(ptr->Cells[ACol][ARow]))/2;
    u=ptr->CellRect(ACol,ARow).Top+(ptr->RowHeights[ARow]-ptr->Canvas->TextHeight(ptr->Cells[ACol][ARow]))/2;
    ptr->Canvas->TextRect(ptr->CellRect(ACol,ARow),l,u,ptr->Cells[ACol][ARow]);
    ptr->Canvas->Brush->Color=oldBrush;
    };
Это мой код, который у меня разукрашивал StringGrid и не боялся прокрутки окна.
Когда попробуешь, то напиши как он понравился/не понравился — я его писал как универсальный (для раскраски стриггридов практически любого предназначения) и теперь интересно на сколько получилось.
Schumi
Отправлено: 08.08.2003, 18:27


Машинист паровоза

Группа: Участник
Сообщений: 206



Бррррр...
Ты меня всё же не понял. Я не делаю скролл, а есть такая опция у грида, когда подводишь мышь к фиксной зоне, тыкаешь, держишь левую кнопку, по всей длине грида появляется линия между строками. И можно меняя положение мыши (вверх, вниз) менять местами строки, а эта злополучная линия тоже перемещается, тем самым показывая пользователю, новое местоположение строки. И основной глюк в том и заключается,что отпускаем мышь, а линия, разграничивающая строки остаётся.
Георгий
Отправлено: 09.08.2003, 22:15


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Schumi
извини, что так долго — когда писал тебе ответ деньги на счету кончились...

В общем так:
У меня, при перемене строк и столбцов местами, никакие линии не остаются — специально разными садистскими методами проверил, в том числе простыми щелчками на фиксированной области без перемещения строк / столбцов, возможно это у тебя драйвера видео не корректно работают, а может и сам MS Windows буянит. Попробуй на других машинах посмотреть.
Проект, в котором у меня всё нормально рисуется, прилагается.



User Attached Image Скачать файл
ColorStringGrid.rar



Вернуться в Вопросы программирования в C++Builder