Сергей |
Отправлено: 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.
Как поставить курсор ввода "в середину" не знаю (просто не интересовало ). Будет время — попробую поискать, получится — сообщу. |
|
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 то курсор ввода останется на месте. |
|