Выделение строк в Гриде
Но по порядку.
1 часть. У меня работает такой код:
const TRect &Rect, int DataCol, TColumnEh *Column,
TGridDrawState State)
{
AnsiString TR;
TR = "01";
TDBGridEh * Eh_Oper = (TDBGridEh *)Sender;
if( !State.Contains(gdSelected) && ( Eh_Oper->DataSource->DataSet->FieldByName("GostID")->AsString.Trim() == TR)) {
Eh_Oper->Canvas->Brush->Color = TColor(0x00C6FFFF);
Eh_Oper->Canvas->FillRect(Rect);
Eh_Oper->Canvas->TextOut(Rect.Left+2,Rect.Top+2,Column->Field->Text);
Eh_Oper->DefaultDrawColumnCell(Rect,DataCol,Column,State);
}
Выделяется строка, где в поле GostID есть значение "01". Как задать переменную TR, чтобы выделялись все строки, значения rкоторых в поле начинались на "01".
2 часть: Переменная TR должна определиться в событии OnClickCheck компонента RxCheckListBox1
Но событие DBGridEh2DrawColumnCell наступает раньше, чем событие OnClickCheck. Как сделать, чтобы выделение записей происходило только после нажатия на Item RxCheckListBox1?
Что-то не получается у меня совместить нажатие на RxCheckListBox1 и выделение строк в Гриде.
Но по порядку.
1 часть. У меня работает такой код:
Выделяется строка, где в поле GostID есть значение "01". Как задать переменную TR, чтобы выделялись все строки, значения rкоторых в поле начинались на "01".
2 часть: Переменная TR должна определиться в событии OnClickCheck компонента RxCheckListBox1
Но событие DBGridEh2DrawColumnCell наступает раньше, чем событие OnClickCheck. Как сделать, чтобы выделение записей происходило только после нажатия на Item RxCheckListBox1?
Попробуй OnGetCellParams вместо OnDrawColumnCell.
Попробуй OnGetCellParams вместо OnDrawColumnCell.
А код использовать тот же? И что это за событие (хотелось бы узнать)
А код использовать тот же? И что это за событие (хотелось бы узнать)
Событие RxDBGrid.
Происходит каждый раз, когда необходимо перерисовать ячеку.
TField *Field, TFont *AFont, TColor &Background, bool Highlight)
/* Параметры
TField - поле, значение которого заносится в ячеку
TFont - шрифт текста в ячейке.
TColor - цвет фона
Highlight - показывает выделена ячейка или нет.*/
Не поделитесь кодом для этого события. Поискала по Интернету, никаких конкретных примеров нет. Даже не знаю, как подступиться.:)
Вот два примера.
//Вывод отрицательных сумм красным.
void __fastcall TFLimits::RxDBGrid4GetCellParams(TObject *Sender,
TField *Field, TFont *AFont, TColor &Background, bool Highlight)
{
if(Field->FieldName != "Total")
return;
if(Field->AsCurrency < 0)
AFont->Color = clRed;
else
AFont->Color = clBlack;
}
//---------------------------------------------------------------------------
//Вывод синим в зависимотси от поля запроса
void __fastcall TFLimits::RxDBGrid2GetCellParams(TObject *Sender,
TField *Field, TFont *AFont, TColor &Background, bool Highlight)
{
if(Highlight)
return;
if(DBM1->ClList->FieldByName("Client_Id")->AsInteger == 21)
{
if(Query5->FieldByName("L")->AsInteger == 1)
AFont->Color = clBlue;
else
AFont->Color = clBlack;
}
else
{
if(Query1->FieldByName("L")->AsInteger == 1)
AFont->Color = clBlue;
else
AFont->Color = clBlack;
}
}
Коды:
{
TR = RxCheckListBox1->Items->Strings[RxCheckListBox1->ItemIndex];
DBGridEh2->OnGetCellParams = DBGridEh2GetCellParams;
DBGridEh2->SetFocus();
}
и
void __fastcall TForm1::DBGridEh2GetCellParams(TObject *Sender,
TColumnEh *Column, TFont *AFont, TColor &Background,
TGridDrawState State)
{
TDBGridEh * Eh_Oper = (TDBGridEh *)Sender;
if(Eh_Oper->DataSource->DataSet->FieldByName("GostID")->AsString.Trim().SubString(1,2) == TR)
{
AFont->Color = clRed;
Background = TColor(0x00C6FFFF);
}
}
Получается вот что: компонент RxCheckListBox1 у меня находится в режиме MultiSelect. При выборе одного Item-а (например, 01) у меня выделяются строки, значения которых в поле начинаются на 01. Но выделение происходит только после того, как мышкой я щелкну по Гриду. Это недостаток. Нужно, чтобы выделение происходило на щелчок по RxCheckListBox1.
2. Я могу одновременно выбрать два Item-а - 01 и 02. У меня сначала должны выделиться строки с 01, а затем с 02. А на самом деле при нажатии на 02 строки выделенные по 01 гаснут. Мне нужно, чтобы выделение оставалось (также, если бы я держала клавишу "Ctrl" и производила бы выделение вручную мышкой.
Вот такие вопросы.:-?
Спасибо большое! Это мне помогло.:) Но есть несколько огрехов. Если сможете, помогите мне с ними справиться.
Коды:
и
Получается вот что: компонент RxCheckListBox1 у меня находится в режиме MultiSelect. При выборе одного Item-а (например, 01) у меня выделяются строки, значения которых в поле начинаются на 01. Но выделение происходит только после того, как мышкой я щелкну по Гриду. Это недостаток. Нужно, чтобы выделение происходило на щелчок по RxCheckListBox1.
2. Я могу одновременно выбрать два Item-а - 01 и 02. У меня сначала должны выделиться строки с 01, а затем с 02. А на самом деле при нажатии на 02 строки выделенные по 01 гаснут. Мне нужно, чтобы выделение оставалось (также, если бы я держала клавишу "Ctrl" и производила бы выделение вручную мышкой.
Вот такие вопросы.:-?
1. Добавь в событие OnClick у CheckListBox твой Grid->Refresh();
2. Когда нажимаю на 02, про 01 ты уже забыла. Нужно изменить алгоритм определения, что выделено в CheckListBox. Попробую быстренько что - то накидать на эту тему.
Это сработало. Сама не догадалась, хотя могла бы. Вместо Refresh впихнула SetFocus, это ничего не дало. Осталось выяснить вопрос по поводу сброса выделения.
Очень благодарна за помощь.:)
Это сработало. Сама не догадалась, хотя могла бы. Вместо Refresh впихнула SetFocus, это ничего не дало. Осталось выяснить вопрос по поводу сброса выделения.
Очень благодарна за помощь.:)
Вот пример: в боксе 4 буквы А,Б,В,Г. Выделяет все ячейки, кроме id, которые начинаются на выбранные буквы. И снимает тоже.
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "RXCtrls"
#pragma link "RXDBCtrl"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RxDBGrid1GetCellParams(TObject *Sender,
TField *Field, TFont *AFont, TColor &Background, bool Highlight)
{
if(Field->FieldName == "Person_Id") return;
AnsiString fStr = Field->AsString;
AnsiString fA = fStr.SubString(1,1);
for(int i = 0;i < RxCheckListBox1->Items->Count;i++)
{
if(RxCheckListBox1->Checked)
if(fA == RxCheckListBox1->Items->Strings)
{
AFont->Color = clRed;
Background = TColor(0x00C6FFFF);
break;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RxCheckListBox1ClickCheck(TObject *Sender)
{
RxDBGrid1->Refresh();
}
//---------------------------------------------------------------------------
TField *Field, TFont *AFont, TColor &Background, bool Highlight)
{
if(Field->FieldName == "Person_Id") return;
AnsiString fStr = Field->AsString;
AnsiString fA = fStr.SubString(1,1);
{/QUOTE]
У меня DBGridEh. У него нет свойство Field.
[QUOTE]void __fastcall TForm1::DBGridEh2GetCellParams(TObject *Sender,
TColumnEh *Column, TFont *AFont, TColor &Background,
TGridDrawState State)
Что-то совсем отупелаX)-
А что нужно поставить сюда
?
Что-то совсем отупелаX)-
А что нужно поставить сюда ?
1. Это проверка на то, что мы находимся в столбце, который прикреплен к полю таблицы БД с именем Person_Id. Он в примере числовой и нам не нужен. Только именно Field->FieldName. (см. п. 2)
2. Field, тип TField передается в обработчик в качестве параметра и содержит указатель на значение поля из таблицы или запроса БД для текущей ячейки.
Короче для твоего примера это будет выглядить примерно так:
TColumnEh *Column, TFont *AFont, TColor &Background,
TGridDrawState State)
{
if(Field->FieldName != "GostID") return;
for(int i = 0;i < RxCheckListBox1->Items->Count;i++)
{
if(RxCheckListBox1->Checked)
if(Field->AsString.Trim().SubString(1,2) == RxCheckListBox1->Items->Strings)
{
AFont->Color = clRed;
Background = TColor(0x00C6FFFF);
break;
}
}
}
1. Это проверка на то, что мы находимся в столбце, который прикреплен к полю таблицы БД с именем Person_Id. Он в примере числовой и нам не нужен. Только именно Field->FieldName. (см. п. 2)
2. Field, тип TField передается в обработчик в качестве параметра и содержит указатель на значение поля из таблицы или запроса БД для текущей ячейки.
Что-то не совсем поняла. У меня ругается на строку
Говорит, что неопределен символ Field
Что-то не совсем поняла. У меня ругается на строку
Говорит, что неопределен символ Field
Извини не заметил. Я писал для RxDBGrid. Но это дела не меняет делаем тогда так:
TColumnEh *Column, TFont *AFont, TColor &Background,
TGridDrawState State)
{
if(Column->FieldName != "GostID") return;
for(int i = 0;i < RxCheckListBox1->Items->Count;i++)
{
if(RxCheckListBox1->Checked)
if(Column->Field->AsString.Trim().SubString(1,2) == RxCheckListBox1->Items->Strings)
{
AFont->Color = clRed;
Background = TColor(0x00C6FFFF);
break;
}
}
}
Все заработало. Но остался маленький момент: теперь выделяется только столбец, а не строка. Хотя в событии можно выделить и строку (до этого выделялась строка). Что-то нужно задать?
if(Column->FieldName != "GostID") return;
и вместо
if(Column->Field->AsString.Trim().SubString(1,2) == RxCheckListBox1->Items->Strings)
поставь
if(Eh_Oper->DataSource->DataSet->FieldByName("GostID")->AsString.Trim().SubString(1,2) == RxCheckListBox1->Items->Strings)
if(Column->FieldName != "GostID") return;
и вместо
if(Column->Field->AsString.Trim().SubString(1,2) == RxCheckListBox1->Items->Strings)
поставь
if(Eh_Oper->DataSource->DataSet->FieldByName("GostID")->AsString.Trim().SubString(1,2) == RxCheckListBox1->Items->Strings)
Я увидела разницу. Первое условие пробовала удалять, а во втором фигурировало Column - не заметила.
Alexandr, огромное спасибо за помощь. Все работает.:}