C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Помогите, пожалуйста, TStringGrid, возможно ли это?...
HeliCOPter
Отправлено: 26.02.2006, 20:40


Не зарегистрирован







Возможно ли в StringGrid выделять несколько ячеек (с Ctrl или мышкой как в Экселе)? Например, для выделения всех выделенных ячеек одним цветом?
Grigoriy
Отправлено: 26.02.2006, 21:15


Мастер участка

Группа: Участник
Сообщений: 381



В множестве TGridOptions элемент goRangeSelect установить в true.

Тогда свойство Selection:TGridRect
указывает на группу выделенных ячеек в координатах
Левая верхняя
//Selection.Left
//Selection.Top

и правая нижняя

//Selection.Right
//Selection.Bottom

ячейки.
HeliCOPter
Отправлено: 27.02.2006, 15:15


Не зарегистрирован







Я просто только недавно начал разбираться с билдером, ты не мог бы по-подробнее немного рассказать. Я goRangeSelect поставил true, но мышкой ячейки больше одной не выделяются. И где искать TRecord? Нужно что-то еще добавлять? Заранне большое спасибо.
Grigoriy
Отправлено: 27.02.2006, 17:19


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (HeliCOPter @ 27/02/2006, 15:15)
Я просто только недавно начал разбираться с билдером, ты не мог бы по-подробнее немного рассказать. Я goRangeSelect поставил true, но мышкой ячейки больше одной не выделяются. И где искать TRecord? Нужно что-то еще добавлять? Заранне большое спасибо.

Когда включен элемент
goEditing
в множество
TGridOptions
тогда запрещено множественное выделение ячеек по-любому.
Представьте себе такую ситуацию : вы выделили несколько ячеек и пытаетесь ввести что-то в таблицу. И в какую ячейку же будут вводиться символы ?

Значит перед выделением нескольких ячеек нужно удалить элемент
goEditing
из множества
TStringGrid->Options

Это делается так
CODE

StringGrid1->Options >> goEditing;
StringGrid1->Options << goRangeSelect;


А затем обратно включить этот элемент

CODE

StringGrid1->Options << goEditing;
StringGrid1->Options >> goRangeSelect;


Отредактировано Grigoriy — 27/02/2006, 17:23
HeliCOPter
Отправлено: 27.02.2006, 20:42


Не зарегистрирован







Огромное спасибо!!!
А возможно как-нибудь отследить такую ситуацию:
Если кликнули по мышке и потянули за пределы границ одной ячейки, то goediting выключается и выделяется группа ячеек, а если отпустили на этой же одной ячейке, не перетаскивая курсор на другие, то она редактируется?
HeliCOPter
Отправлено: 27.02.2006, 20:53


Не зарегистрирован







И еще вопрос: Как обратиться к Selection?
Grigoriy
Отправлено: 28.02.2006, 05:05


Мастер участка

Группа: Участник
Сообщений: 381



Ура.
Я нашел способ совместимости выделения и редактирования ячеек.

Действуем так.

1. В файле "*.h" проекта в том объявлении класса формы, которая содержит компонент типа TStringGrig
Нужно добавить объявление обработчика событий

void __fastcall hooku(tagMSG& fr,bool& re);

Вот так должен выглядеть, например файл "*.h" проекта
CODE

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

#ifndef Unit1stringgridextH
#define Unit1stringgridextH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Grids.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
       TStringGrid *StringGrid1;
       void __fastcall FormCreate(TObject *Sender);
     
private: // User declarations
public:  // User declarations
       __fastcall TForm1(TComponent* Owner);
void __fastcall hooku(tagMSG& fr,bool& re);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif



Затем в файле "*.cpp" модуля проекта написать такой обработчик событий винды

CODE

void __fastcall TForm1::hooku(tagMSG& fr,bool& re)
{
tagPOINT tp;
int Col1,Row1;
if (fr.hwnd==StringGrid1->Handle)
{
if (fr.message==WM_LBUTTONDOWN)
{
tp=StringGrid1->ScreenToClient(fr.pt);
StringGrid1->MouseToCell(tp.x,tp.y,Col1,Row1);
if (!((Col1==StringGrid1->Col)&&(Row1==StringGrid1->Row)))
{
StringGrid1->Options >> goEditing;
StringGrid1->Options << goRangeSelect;
};
};
if (fr.message==WM_LBUTTONUP)
{
StringGrid1->Options << goEditing;
StringGrid1->Options >> goRangeSelect;
};
};
};


И в обработчик события создания формы поместить присваивание адреса подпрограммы перехвата сообщений
CODE

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnMessage=hooku;
}


QUOTE

И еще вопрос: Как обратиться к Selection?


CODE

int a,b,c,d;
TGridCoord e,f;
//.......
a=StringGrid1->Selection.Left;
//.......
b=StringGrid1->Selection.Top;
//.......
c=StringGrid1->Selection.Right;
//.......
d=StringGrid1->Selection.Bottom;
//.......
e=StringGrid1->Selection.TopLeft;
//.......
f=StringGrid1->Selection.BottomRight;
//.......
Grigoriy
Отправлено: 28.02.2006, 05:23


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE
...Если кликнули по мышке и потянули за пределы границ одной ячейки, то goediting выключается и выделяется группа ячеек...


Увы использование стандартных присваиваний адресов обработчиков событий от мыши свойствам, содержащим эти адреса
например

StringGrid1->OnMouseMove
StringGrid1->OnMouseWheel
StringGrid1->OnMouseUp
StringGrid1->OnMouseDown

непоможет в этой ситуации.
Объяснение заключается в том, что код, обрабатывающий события адрес первого байта которого (этого кода) хранится в соответствующем свойстве, выполняться начинает уже
ПОСЛЕ ТОГО
как выполнится стандартный код обработки события нажатия клавиши мыши, при выполнении которого (стандартного кода) происходит так называемая настройка режима реакции таблицы на действия пользователя.
Так, например, если в обработчике события StringGrid1->OnMouseDown
добавить в множество свойств таблицы элемент разрешающий множественное выделение ячеек, то этот элемент множества включится после того как это множество будет использовано в стандартном коде обрабатывающем события от мыши !

Если поступить так как я поступил, то получается, что
МОЙ КОД, обрабатывающий событие от мыши выполняется
первее всех кодов, обрабатывающих это событие,
ГА.

Согласны со мной !

QUOTE

...а если отпустили на этой же одной ячейке, не перетаскивая курсор на другие, то она редактируется...


А кто знает как "нормальным" путем перевести программно ячейку в режим редактирования ?
Послать таблице сообщение программно, как будто оно пришло от мыши ?

QUOTE

Огромное спасибо!!!


Пожалуйста.
Скорее незачто...

Отредактировано Grigoriy — 28/02/2006, 05:24

Вернуться в Вопросы программирования в C++Builder