4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
1

i % 2 == 1

08.09.2008, 10:07. Показов 2467. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе утро!!!

Ребята подскажите, пожалуйста, как лутше сделать.

Есть код выделения не чётных строк в DBGrid1, всё нормально работал, потом я добавил CheckBox1 и после этого начались проблемы.

Я хочу, чтобы по установлению галочки у меня выделялись строки сразу же, а у меня на данный момент получается так.... ставлю я галочку оно мне сразу же не выделяет и мне приходится мышкой кликать по каждой строке, для того чтобы выделить самостоятельно эти строки не смотря на то, что CheckBox1 включённый.

Подскажите, пожалуйста, как мне "пнуть" DBGrid1, чтобы он мне красил сам без моей помощи строки , после того как я включил CheckBox1.

Заранее благодарен!!!!!!!!!

Вот код....
Код
//---------------------------------------------------------------------------
 
#include <vcl.h>
 
#pragma hdrstop
 
#include "Unit3.h"
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
 
 
void __fastcall TForm3::DBGrid1DrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,
TGridDrawState State)
{
int i = DBGrid1->DataSource->DataSet->RecNo;//Присвоение порядкового номера строке.
 
if (CheckBox1->State==cbChecked)
{
 
 
if (i % 2 == 1)//Красим не чётные строки
{
 
DBGrid1->Canvas->Brush->Color=clAqua;
DBGrid1->Canvas->Font->Color=clRed;
DBGrid1->Canvas->FillRect(Rect);
 
 
 
if (Column->Alignment==taCenter)
{
DBGrid1->Canvas->TextOut(Rect.Left+23-
DBGrid1->Canvas->TextWidth(Column->Field->Text),
Rect.Top+2,Column->Field->Text);
}
else
 
 
DBGrid1->Canvas->TextOut(Rect.Left+2,Rect.Top+2,Column->Field->Text);
}
}
}
//---------------------------------------------------------------------------
0
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
08.09.2008, 11:41 2
присвоить обработчик события OnChange для CheckBox1 и в нем делать изменения цвета строки
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
09.09.2008, 09:42  [ТС] 3
Чото нету события OnChange для CheckBox1, пробовал делать через OnClick так он не понимает FillRect(Rect), как это дальше делать не знаю.
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
09.09.2008, 10:10 4
так тебе же надо просто событие выбрать для прорисовки, но сама прорисовка происходит на дбгриде, а не на чекбоксе...
в событии OnClick тебе надо просто проанализировать - стоит галка или нет, и уже из этого прорисовывать(вызвать обработчик DBGrid1DrawColumnCell с соответствующими параметрами, чтобы прорисовка после клика произошла) или нет, но вообще ИМХО зря ты эти разрисовки делаешь, только работу замедлит
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
09.09.2008, 11:03  [ТС] 5
//прорисовывать(вызвать обработчик DBGrid1DrawColumnCell с соответствующими параметрами,//

Вот как раз с этим у меня и проблемы!!!!!!!!!!!!!!


Прорисовки делаются для лутшей читабельности.
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
09.09.2008, 11:09 6
слушай, а попробуй так: в событии OnClick установи указатель в таблице на первую запись методом First, по идее событие само сработает из-за такого перемещения указателя...
1
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
10.09.2008, 09:41  [ТС] 7
Хорошо, попробую, потом скажу.....

Добавлено через 22 часа 28 минут 37 секунд
Спасибо, WooDooMan, фокус с методом First удался, когда я ставлю галочку строки выделяются через одну всё как надо.


Но теперь постала следующая проблема, теперь надо сделать так, чтобы я убрал галочку в CheckBox1 и строки опять стали прежними т.е весь фон белай, а буквы чёрные, начал делать через метод Prior.


Есть кое-какие наработки, но пока не получается. Заранее спасибо.

Вот код...

Код
#include <vcl.h>
 
#pragma hdrstop
 
#include "Unit3.h"
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm3::DBGrid1DrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,
TGridDrawState State)
{
int i = DBGrid1->DataSource->DataSet->RecNo;//Присвоение порядкового номера строке.
 
if (CheckBox1->Checked==true)
{
 
 
if (i % 2 == 1)//Красим не чётные строки
{
 
DBGrid1->Canvas->Brush->Color=clAqua;
DBGrid1->Canvas->Font->Color=clRed;
DBGrid1->Canvas->FillRect(Rect);
 
 
 
if (Column->Alignment==taCenter)
{
DBGrid1->Canvas->TextOut(Rect.Left+23-
DBGrid1->Canvas->TextWidth(Column->Field->Text),
Rect.Top+2,Column->Field->Text); }
 
else
 
DBGrid1->Canvas->TextOut(Rect.Left+2,Rect.Top+2,Column->Field->Text);
}
}
}
// if (CheckBox1->Checked==false)
//---------------------------------------------------------------------------
void __fastcall TForm3::CheckBox1Click(TObject *Sender)
 
{
 
if (CheckBox1->State==cbChecked)
 
{
DBGrid1->DataSource->DataSet->First();}
 
 
else if (CheckBox1->State==cbUnchecked)
 
{
DBGrid1->DataSource->DataSet->Prior();}
}
//---------------------------------------------------------------------------
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
10.09.2008, 09:49 8
слушай, тебе не надо делать приор, вообще просто делай всегда без проверки first да и все(это делается для того, чтобы событие сгенерировалось, куда скакать неважно), а уже в DBGrid1DrawColumnCell, когда снимаешь галочку, нужно восстанавливать состояние дбгрида...
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
10.09.2008, 09:55  [ТС] 9
DefaultDrawColumnCell <- помоиму вот это надо делать, где-то я вычитал, что это используется для перерисовки(сброса DBGrida), так или нет?????
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
10.09.2008, 10:09 10
а так не пойдет?
Код
DBGrid1->Canvas->Brush->Color=clWhite;
DBGrid1->Canvas->Font->Color=clBlack;
DBGrid1->Canvas->FillRect(Rect);
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
10.09.2008, 11:37  [ТС] 11
Я понимаю, но проверку надо делать уже в DBGrid1, но не OnClick, потому-что если я буду размалёвывать строки в событии OnClick, вывидится ошибка о не понимании FillRect, потому-что я уже это пробывал.
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
10.09.2008, 11:40 12
вообще, событие OnClick используется только для того, чтобы сгенерить событие, где у вас идет прорисовка, и не больше не для чего
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
11.09.2008, 09:13  [ТС] 13
Понял буду пробывать..........

Добавлено через 21 час 31 минуту 6 секунд
WooDooMan, всё получилось, начало включать и убирать подцветку. Для того чтобы убирать подцветку я использовал Refresh;

У меня назрел ещё один вопрос, событие OnKeyUp имеет отношение к кнопке со стрелочкой вверх, или нет???

Заранее спасибо!!!!!!!!!!!!!!!!!!!!
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
11.09.2008, 09:29 14
да, это событие генерится при нажатии такой клавиши, в отличии от onkeypress
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
11.09.2008, 09:34  [ТС] 15
Спасибо!!!!!!!!!!!!!!!!
0
132 / 99 / 11
Регистрация: 21.11.2007
Сообщений: 544
26.09.2008, 11:48 16
Я на Дельфях в событии "OnDrawCell" StringGrid'а делал наподобие того, что WooDooMan описал. Только не канву заливал, а толи ячейку, толи строку - не помню ужо. Плюс к тому текст филил (залитый прямоугольник текст закрывал). Там пинать никого не надо было. В DB'шной версии грида разьве это событие не происходит постоянно?
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
26.09.2008, 11:50 17
dioxidin, ну вообще это событие генерится, когда что-то происходит с гридом, а установка флажка этого не делает, вот и приходится дергать что-то, чтобы отрисовка началась
0
26.09.2008, 11:50
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru