Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перерисовать TDrawGrid

299
12 сентября 2005 года
3D Bob
885 / / 18.04.2005
Подскажите как вызвать событие перерисовки TDrawGrid.
Дело вот в чем: у меня в DrawCell стоит примерно такой код
 
Код:
if (ARow==Grid->Row) Background = ...
else Background=...


Так вот при выборе определенной ячейки, этим кодом графически предполагается, что будет выделена вся строка. Но выделяется только текущая ячейка. А вся строка выделяется только если перерисовать Grid полностью, например свернув и развернут окно приложения.
Вот, как сделать перерисовку программно.
Пытался так:
Засовывал в SelectCell Такой код
 
Код:
SendMessage(Grid->Handle,WM_PAINT,NULL,NULL);

Не помогло
И даже так
 
Код:
UpdateWindow(Grid->Handle);
Тоже не помогло:((((
А нужно всего-то чтобы нажать на строку, и она была вся выделена... А старая строка потеряля выделение..
488
12 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Grid->Repaint();

Не исключено, что сперва нужно будет вызвать
Grid->Invalidate();
299
13 сентября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by Mоngооsе
Grid->Repaint();

Не исключено, что сперва нужно будет вызвать
Grid->Invalidate();



Cпасибо.
Начал использовать
Grid->Repaint(); - глюки сплошные. Запаздывание...

А вот в SelectCell поставил только Grid->Invalidate(); И усё пучком как задумана. Конешно, немного напрягает дерганье небольшое, но думаю от него врятли можно избавиться, у меня слмшком сложный код для рисования:( А так всё чики-пики. Спасибо.

488
13 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
незачто.
Можно еще попробовать DrawGrid->DoubleBuffered = true;
246
13 сентября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by 3D Bob
Cпасибо.
Начал использовать
Grid->Repaint(); - глюки сплошные. Запаздывание...

А вот в SelectCell поставил только Grid->Invalidate(); И усё пучком как задумана. Конешно, немного напрягает дерганье небольшое, но думаю от него врятли можно избавиться, у меня слмшком сложный код для рисования:( А так всё чики-пики. Спасибо.


А вычислить область отрисовки слабо?

Код:
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Grids.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TStringGrid *StringGrid1;
    void __fastcall StringGrid1DrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State);
    void __fastcall StringGrid1Click(TObject *Sender);
private:    // User declarations
    int oldRow, newRow;
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  int I, J, K;
  K = 0;
  for (I = 0; I < StringGrid1->ColCount; I++)
    for (J = 0; J < StringGrid1->RowCount; J++)
      StringGrid1->Cells[J] = IntToStr(++K);

  oldRow = 1; currRow = 1;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
    if (State.Contains(gdFixed))
     {
        StringGrid1->Canvas->Brush->Color = clBtnFace;
        StringGrid1->Canvas->Font->Color = clWindowText;
        StringGrid1->Canvas->FillRect(Rect);
        Frame3D(StringGrid1->Canvas, Rect, clBtnHighlight, clBtnShadow, 1);
     }

     else if (State.Contains(gdSelected) && ARow == newRow)
     {
        StringGrid1->Canvas->Brush->Color = clAqua;
        StringGrid1->Canvas->Font->Color = clBlack;
        StringGrid1->Canvas->FillRect(Rect);
     }

     else if (ARow == newRow)
     {
        StringGrid1->Canvas->Brush->Color = clInfoBk;
        StringGrid1->Canvas->Font->Color = clBlue;
        StringGrid1->Canvas->FillRect(Rect);
     }

     else
     {
        StringGrid1->Canvas->Brush->Color = StringGrid1->Color;
        StringGrid1->Canvas->Font->Color = StringGrid1->Font->Color;
        StringGrid1->Canvas->FillRect(Rect);
     }

     StringGrid1->Canvas->TextRect(
        Rect, Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]
        );
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StringGrid1Click(TObject *Sender)
{
    if(oldRow == StringGrid1->Row) return;

    RECT R1, R2, R3;
    newRow = StringGrid1->Row;
    int ViewCol = ((StringGrid1->VisibleColCount + StringGrid1->LeftCol) < StringGrid1->ColCount) ? StringGrid1->LeftCol + StringGrid1->VisibleColCount : StringGrid1->ColCount - 1;

    R1 = StringGrid1->CellRect(/*StringGrid1->LeftCol*/0, oldRow);
    R2 = StringGrid1->CellRect(ViewCol, oldRow);
    UnionRect(&R3, &R1, &R2);
    InvalidateRect(StringGrid1->Handle, &R3, false);

    R1 = StringGrid1->CellRect(/*StringGrid1->LeftCol*/0, newRow);
    R2 = StringGrid1->CellRect(ViewCol, newRow);
    UnionRect(&R3, &R1, &R2);
    InvalidateRect(StringGrid1->Handle, &R3, false);

    oldRow = newRow;
}
//---------------------------------------------------------------------------


Подправил OnClick

299
13 сентября 2005 года
3D Bob
885 / / 18.04.2005
Не то что слабо. Каонечно же нет. Но вот ф-ций обновления не знаю(не знал).
246
14 сентября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by 3D Bob
Не то что слабо. Каонечно же нет. Но вот ф-ций обновления не знаю(не знал).


Не слышу, мой вариант не катит?

299
14 сентября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by GIZMO
Не слышу, мой вариант не катит?


Вполне. Только я его еще боле до минимума переработал.
StringGrid1->VisibleColCount - слишком много.

246
14 сентября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by 3D Bob
Вполне. Только я его еще боле до минимума переработал.
StringGrid1->VisibleColCount - слишком много.


Покажи, что наваял...

299
14 сентября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by GIZMO
Покажи, что наваял...



За то что показал ф-ции спасибо.
Твой способ у меня тоже заставял экран дергаться, но ты мне дал идею.

А вот мой, просто все красиво и плавненько. Вот так..

 
Код:
void __fastcall TRequest::SelectCell(TObject *, int ACol,int ARow, bool &){
        RECT R = Grid->CellRect(ACol,OldRow);
        InflateRect(&R, Grid->Width, Grid->DefaultRowHeight);
        InvalidateRect(Grid->Handle, &R, false);
        OldRow = ARow;
        R = Grid->CellRect(ACol,ARow);
        InflateRect(&R, Grid->Width, Grid->DefaultRowHeight);
        InvalidateRect(Grid->Handle, &R, false);
}

СПАСИБО за ф-ции.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог