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

 
Пмоготе плз по курсачу мальенькая проблемка, StringGrid
Сергей
Отправлено: 06.01.2005, 05:13


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







помогите с курчачем такая проблема
на форме есть Stringgrid
есть 10 столбцов и 10 строк
вообщем необходимо чтобы при вводе значений ячеек курсор перепрыгивал на следующую ячейку и ввод проболжался там то есть сначала в ячейке 1.1 потом в 1.2 потом в 1.3 и тп (колонка . стобец)
притом в одной ячейке должно быть не больше 4 символов
и если кликнуть мышкой в середину ячейки почередине 4 символов ново вводимые символы заменяли предыдущие когда я начал это все делать столкнулся с проблемой что я немогу отменить ввод в ячейку символа через онкейпресс и как програмно выставить курсор ввода на произвольный символ ячейке тоже не понял к примеру в едите все понятно а тут ерунда какая то как я еще понял это возможно сделать через TCustomGrid но как к этому зверю обратиться тоже не понял!
Помогите с этим разобраться хотя бы как обратиться к TCustomGrid.у там я мож сам разберусь что как! спасибо!
AVC
Отправлено: 06.01.2005, 09:24


Ветеран

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



Для перепрыгивания по cell'ам когда то делал так:
CODE

void __fastcall TF_aaa::Grd_MainKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
TStringGrid *grd = (TStringGrid*)(Sender);
int ARow = grd->Row;
int ACol = grd->Col;

if (Key == VK_ESCAPE)
{  Key = 0x00;
   if (!grd->EditorMode) { Bt_Save->SetFocus(); return; }
   grd->Cells[ACol][ARow] = OldValue;
   grd->EditorMode = false;
   return;
}

if (!(grd->EditorMode && (Key == VK_UP || Key == VK_DOWN))) return;

int key = Key;
Key = 0x00;
grd->EditorMode = false;

int rows = grd->RowCount;

if (key == VK_UP) { if (ARow > 1)    grd->Row = ARow-1; }
else { if (ARow < (rows-1)) grd->Row = ARow+1; }
grd->Col = ACol;
}

Обратите внимание на ->EditorMode

TCustomGrid это просто базовый класс для построения "сеток разных в ассортименте". Следовательно все что можно через TCustomGrid можно и через TStringGrid.

Как поставить курсор ввода "в середину" не знаю (просто не интересовало smile.gif ). Будет время — попробую поискать, получится — сообщу.
AVC
Отправлено: 06.01.2005, 12:27


Ветеран

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



Как обещал — сообщаю.
"как програмно выставить курсор ввода на произвольный символ ячейке"?
Например так
CODE

class TTmpStringGrid : public TStringGrid
{
public:
TInplaceEdit* __fastcall GetInplaceEditor (void) { return TStringGrid::InplaceEditor; }
};

void __fastcall TF_aaa::Grd_MainGetEditText (TObject *Sender, int ACol, int ARow, AnsiString &Value)
{
TStringGrid *grd = (TStringGrid*)(Sender);
OldValue = grd->Cells[ACol][ARow];
Value = OldValue;

// Поставить курсор ввода перед четвертым символом с конца
if (ACol == 2)
{  TTmpStringGrid* sgrd = (TTmpStringGrid*) Sender;
   TInplaceEdit*   ie = sgrd->GetInplaceEditor();
   for (int i=0; ie && i < 4; i++)
    {  PostMessage(ie->Handle, WM_KEYDOWN, VK_LEFT, 0);
       PostMessage(ie->Handle, WM_KEYUP,   VK_LEFT, 0);
    }
// В этом месте работать не должно и не работает
   //((TCustomEdit*)(ie))->SelStart  = 3;
   //((TCustomEdit*)(ie))->SelLength = 0;
}
}

Сергей!
Отправлено: 06.01.2005, 13:02


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







Спасибо перемещиние работает!
только вот насчет запрета ввода я неправильно высказался наверно
мне надо чтобы при вводе запрещенных символов как бы ничего не происходило
то есть стоит курсор ввода в ячейке нажал я скажем "f" а это к примеру запрещенный символ и как бы ничего не должно измениться 8)
Сергей
Отправлено: 06.01.2005, 13:06


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







А соответственно курсор ввода должен оставаться на месте!
AVC
Отправлено: 06.01.2005, 13:40


Ветеран

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



Не знаю почему у вас не так, а у меня TStringGrid::OnKeyPress работает именно как вы и хотите.
CODE

void __fastcall TF_aaa::Grd_MainKeyPress(TObject *Sender, char &Key)
{
AnsiString skey = "_";
skey[1] = Key;
if ((AnsiString("1234")).Pos(skey) > 0)
{  Key = 0x00;
   return;
}
}

Символы 1/2/3/4 не вводятся и курсор остается на месте. Как бы и чего и не происходит.
Сергей
Отправлено: 06.01.2005, 18:17


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







Со всем вроде бы разобрался осталось только последнее!
при выделение ячейки выделяется текст и показывается курсор ввода
непойму как убирать выделение текста при выборе ячейки и чтоб курсор ввода текста оставался!

почему то Deselect не работает
AVC
Отправлено: 10.01.2005, 09:10


Ветеран

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



Если не сумеете подобрать "правильное" событие, то во втором моем примере (с расшареным private) есть побочный эффект — пропадает select. Если сделать Right, затем Left то курсор ввода останется на месте.

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