if (ARow==Grid->Row) Background = ...
else Background=...
Перерисовать TDrawGrid
Дело вот в чем: у меня в DrawCell стоит примерно такой код
Код:
Так вот при выборе определенной ячейки, этим кодом графически предполагается, что будет выделена вся строка. Но выделяется только текущая ячейка. А вся строка выделяется только если перерисовать Grid полностью, например свернув и развернут окно приложения.
Вот, как сделать перерисовку программно.
Пытался так:
Засовывал в SelectCell Такой код
Код:
SendMessage(Grid->Handle,WM_PAINT,NULL,NULL);
Не помогло
И даже так
Код:
UpdateWindow(Grid->Handle);
А нужно всего-то чтобы нажать на строку, и она была вся выделена... А старая строка потеряля выделение..
Не исключено, что сперва нужно будет вызвать
Grid->Invalidate();
Цитата:
Originally posted by Mоngооsе
Grid->Repaint();
Не исключено, что сперва нужно будет вызвать
Grid->Invalidate();
Grid->Repaint();
Не исключено, что сперва нужно будет вызвать
Grid->Invalidate();
Cпасибо.
Начал использовать
Grid->Repaint(); - глюки сплошные. Запаздывание...
А вот в SelectCell поставил только Grid->Invalidate(); И усё пучком как задумана. Конешно, немного напрягает дерганье небольшое, но думаю от него врятли можно избавиться, у меня слмшком сложный код для рисования:( А так всё чики-пики. Спасибо.
Можно еще попробовать DrawGrid->DoubleBuffered = true;
Цитата:
Originally posted by 3D Bob
Cпасибо.
Начал использовать
Grid->Repaint(); - глюки сплошные. Запаздывание...
А вот в SelectCell поставил только Grid->Invalidate(); И усё пучком как задумана. Конешно, немного напрягает дерганье небольшое, но думаю от него врятли можно избавиться, у меня слмшком сложный код для рисования:( А так всё чики-пики. Спасибо.
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;
}
//---------------------------------------------------------------------------
#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
Не то что слабо. Каонечно же нет. Но вот ф-ций обновления не знаю(не знал).
Цитата:
Originally posted by 3D Bob
Не то что слабо. Каонечно же нет. Но вот ф-ций обновления не знаю(не знал).
Не то что слабо. Каонечно же нет. Но вот ф-ций обновления не знаю(не знал).
Не слышу, мой вариант не катит?
Цитата:
Originally posted by GIZMO
Не слышу, мой вариант не катит?
Не слышу, мой вариант не катит?
Вполне. Только я его еще боле до минимума переработал.
StringGrid1->VisibleColCount - слишком много.
Цитата:
Originally posted by 3D Bob
Вполне. Только я его еще боле до минимума переработал.
StringGrid1->VisibleColCount - слишком много.
Вполне. Только я его еще боле до минимума переработал.
StringGrid1->VisibleColCount - слишком много.
Покажи, что наваял...
Цитата:
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);
}
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);
}
СПАСИБО за ф-ции.