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

 
TStringGrid и goEditing + goAlwaysShowEditor, Автоматическая передача фокуса ввода
Asher
Отправлено: 09.06.2003, 15:51


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

Группа: Модератор
Сообщений: 550



Сделал себе таблицу
CODE

sgdInPut = new TStringGrid(this);//
sgdInPut->Options << goEditing;//Разрешить редактирование
sgdInPut->Options << goAlwaysShowEditor;//Режим редактирования постоянно

При вводе данных в ячейке проверяю значение и перебрасываю фокус в одну из следующих ячеек
CODE

TGridRect GRect;             //Регион выделенных ячеек
GRect.Top = Row;           //Требуемая строка
GRect.Bottom = Row;      //
GRect.Left = Col;             //Требуемый столбец
GRect.Right = Col;           //
sgdInPut->Selection = GRect;  //Установить выделение

Но фокус ввода не передается, т.е. требуемая ячейка в clWindow не перекрашивается и курсор ввода не появляется. Установка EditorMode в true дела не меняет(естественно при отключенном goAlwaysShowEditor). А просто нажатие на Enter прекрасно переводит таблицу в EditorMode.

Ваши предложения/рекоментации, как все-таки программно выбирать ячейку для ввода ?
Admin
Отправлено: 09.06.2003, 16:36


Владимир

Группа: Администратор
Сообщений: 1190



Наверное не привели весь код
Вот так все работает:

CODE

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

TStringGrid* sgdInPut;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
sgdInPut = new TStringGrid(Form1);
sgdInPut->Parent = Form1;
sgdInPut->Options << goEditing;
sgdInPut->Options << goAlwaysShowEditor;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
TGridRect GRect;            
GRect.Top = Edit1->Text.ToInt();          
GRect.Bottom = Edit1->Text.ToInt();      
GRect.Left = Edit2->Text.ToInt();            
GRect.Right = Edit2->Text.ToInt();          
sgdInPut->Selection = GRect;
}
//---------------------------------------------------------------------------


Отредактировано Admin — 9 Jun 2003, 16:36
Asher
Отправлено: 09.06.2003, 16:57


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

Группа: Модератор
Сообщений: 550



Да, есть еще
CODE

sgdInPut->DefaultDrawing = false;//
sgdInPut->OnDrawCell = sgdInPutDrawCell;//

но я думал что это к делу отношения не имеет, т.к. при переходе в режим редактирования по Enter или F2 для ячейки ввода все прекрасно отрисовывается и без меня, с моей sgdInPutDrawCell
Asher
Отправлено: 11.06.2003, 10:01


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

Группа: Модератор
Сообщений: 550



Убрал
CODE

sgdInPut->DefaultDrawing = false;//
sgdInPut->OnDrawCell = sgdInPutDrawCell;//

выделение появилось, но соответственно пропала вся раскраска по типам вводимых данных и блокированных ячеек. sad.gif

Осталось подумать что лучше оставить: раскраску или автовыделение ячейки ввода wink.gif

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