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

Ваш аккаунт

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

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

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

Выделение строк в Гриде

1.2K
20 января 2005 года
richel
142 / / 20.01.2005
Что-то не получается у меня совместить нажатие на RxCheckListBox1 и выделение строк в Гриде.
Но по порядку.
1 часть. У меня работает такой код:
Цитата:
void __fastcall TForm1::DBGridEh2DrawColumnCell(TObject *Sender,
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

Цитата:
TR = RxCheckListBox1->Items->Strings[RxCheckListBox1->ItemIndex];


Но событие DBGridEh2DrawColumnCell наступает раньше, чем событие OnClickCheck. Как сделать, чтобы выделение записей происходило только после нажатия на Item RxCheckListBox1?

259
20 января 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by richel
Что-то не получается у меня совместить нажатие на RxCheckListBox1 и выделение строк в Гриде.
Но по порядку.
1 часть. У меня работает такой код:

Выделяется строка, где в поле GostID есть значение "01". Как задать переменную TR, чтобы выделялись все строки, значения rкоторых в поле начинались на "01".
2 часть: Переменная TR должна определиться в событии OnClickCheck компонента RxCheckListBox1

Но событие DBGridEh2DrawColumnCell наступает раньше, чем событие OnClickCheck. Как сделать, чтобы выделение записей происходило только после нажатия на Item RxCheckListBox1?


Попробуй OnGetCellParams вместо OnDrawColumnCell.

1.2K
20 января 2005 года
richel
142 / / 20.01.2005
Цитата:
Originally posted by AlexandrVSmirno

Попробуй OnGetCellParams вместо OnDrawColumnCell.


А код использовать тот же? И что это за событие (хотелось бы узнать)

259
20 января 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by richel

А код использовать тот же? И что это за событие (хотелось бы узнать)


Событие RxDBGrid.
Происходит каждый раз, когда необходимо перерисовать ячеку.

 
Код:
void __fastcall TForm1::RxDBGrid1GetCellParams(TObject *Sender,
      TField *Field, TFont *AFont, TColor &Background, bool Highlight)
/* Параметры
 TField - поле, значение которого заносится в ячеку
 TFont - шрифт текста в ячейке.
 TColor - цвет фона
 Highlight - показывает выделена ячейка или нет.*/
1.2K
20 января 2005 года
richel
142 / / 20.01.2005
Не поделитесь кодом для этого события. Поискала по Интернету, никаких конкретных примеров нет. Даже не знаю, как подступиться.:)
259
20 января 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by richel
Не поделитесь кодом для этого события. Поискала по Интернету, никаких конкретных примеров нет. Даже не знаю, как подступиться.:)


Вот два примера.

Код:
//---------------------------------------------------------------------------
//Вывод отрицательных сумм красным.
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;
    }
}
1.2K
20 января 2005 года
richel
142 / / 20.01.2005
Спасибо большое! Это мне помогло.:) Но есть несколько огрехов. Если сможете, помогите мне с ними справиться.
Коды:
Цитата:
void __fastcall TForm1::RxCheckListBox1ClickCheck(TObject *Sender)
{
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" и производила бы выделение вручную мышкой.
Вот такие вопросы.:-?

259
20 января 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by richel
Спасибо большое! Это мне помогло.:) Но есть несколько огрехов. Если сможете, помогите мне с ними справиться.
Коды:

и

Получается вот что: компонент RxCheckListBox1 у меня находится в режиме MultiSelect. При выборе одного Item-а (например, 01) у меня выделяются строки, значения которых в поле начинаются на 01. Но выделение происходит только после того, как мышкой я щелкну по Гриду. Это недостаток. Нужно, чтобы выделение происходило на щелчок по RxCheckListBox1.
2. Я могу одновременно выбрать два Item-а - 01 и 02. У меня сначала должны выделиться строки с 01, а затем с 02. А на самом деле при нажатии на 02 строки выделенные по 01 гаснут. Мне нужно, чтобы выделение оставалось (также, если бы я держала клавишу "Ctrl" и производила бы выделение вручную мышкой.
Вот такие вопросы.:-?


1. Добавь в событие OnClick у CheckListBox твой Grid->Refresh();
2. Когда нажимаю на 02, про 01 ты уже забыла. Нужно изменить алгоритм определения, что выделено в CheckListBox. Попробую быстренько что - то накидать на эту тему.

1.2K
20 января 2005 года
richel
142 / / 20.01.2005
Цитата:
1. Добавь в событие OnClick у CheckListBox твой Grid->Refresh();


Это сработало. Сама не догадалась, хотя могла бы. Вместо Refresh впихнула SetFocus, это ничего не дало. Осталось выяснить вопрос по поводу сброса выделения.
Очень благодарна за помощь.:)

259
20 января 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by richel

Это сработало. Сама не догадалась, хотя могла бы. Вместо 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();
}
//---------------------------------------------------------------------------
1.2K
20 января 2005 года
richel
142 / / 20.01.2005
Цитата:
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);
{/QUOTE]
У меня DBGridEh. У него нет свойство Field.
[QUOTE]void __fastcall TForm1::DBGridEh2GetCellParams(TObject *Sender,
TColumnEh *Column, TFont *AFont, TColor &Background,
TGridDrawState State)


Что-то совсем отупелаX)-

Цитата:
if(Column->FieldName == "Person_Id")

А что нужно поставить сюда

Цитата:
AnsiString fStr = Field->AsString;

?

259
20 января 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by richel

Что-то совсем отупелаX)-

А что нужно поставить сюда ?


1. Это проверка на то, что мы находимся в столбце, который прикреплен к полю таблицы БД с именем Person_Id. Он в примере числовой и нам не нужен. Только именно Field->FieldName. (см. п. 2)

2. Field, тип TField передается в обработчик в качестве параметра и содержит указатель на значение поля из таблицы или запроса БД для текущей ячейки.

Короче для твоего примера это будет выглядить примерно так:

Код:
void __fastcall TForm1:BGridEh2GetCellParams(TObject *Sender,
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.2K
20 января 2005 года
richel
142 / / 20.01.2005
Цитата:
Originally posted by AlexandrVSmirno

1. Это проверка на то, что мы находимся в столбце, который прикреплен к полю таблицы БД с именем Person_Id. Он в примере числовой и нам не нужен. Только именно Field->FieldName. (см. п. 2)

2. Field, тип TField передается в обработчик в качестве параметра и содержит указатель на значение поля из таблицы или запроса БД для текущей ячейки.



Что-то не совсем поняла. У меня ругается на строку

Цитата:
AnsiString fStr = Field->AsString;


Говорит, что неопределен символ Field

259
20 января 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by richel


Что-то не совсем поняла. У меня ругается на строку


Говорит, что неопределен символ Field


Извини не заметил. Я писал для RxDBGrid. Но это дела не меняет делаем тогда так:

Код:
void __fastcall TForm1:BGridEh2GetCellParams(TObject *Sender,
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;
      }
  }
}
1.2K
20 января 2005 года
richel
142 / / 20.01.2005
Все заработало. Но остался маленький момент: теперь выделяется только столбец, а не строка. Хотя в событии можно выделить и строку (до этого выделялась строка). Что-то нужно задать?
259
20 января 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by richel
Все заработало. Но остался маленький момент: теперь выделяется только столбец, а не строка. Хотя в событии можно выделить и строку (до этого выделялась строка). Что-то нужно задать?


 
Код:
Убери
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)
1.2K
20 января 2005 года
richel
142 / / 20.01.2005
Цитата:
Originally posted by AlexandrVSmirno

 
Код:
Убери
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, огромное спасибо за помощь. Все работает.:}

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