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
|
|