![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Частичная автоматизация. [D7, dBase, FoxPro]
ikondakov © (2004-03-18 14:55:00)Здравствуйте. Есть база данных на Фоксе. Создаётся вводилка на Delphi с помощью автоматического переноса полей. Надо сделать так, чтобы как только максимальное количество символов достигнет MaxLength у поля ввода надо перескочить на другое (следущее) без нажатия клавиш. И, к стати, как это MaxLength автоматически выставлять при переносе полей. В соответствии с таблицей естественно!
KSergey (2004-03-19 07:44:00) [1]> KSergey © (18.03.04 16:55) [7]
> Этот обработчик назначить всем DBEdit'ам
> ikondakov (18.03.04 17:15) [8]
> не хочет он перескакивать. просто ничего не происходит.
> ikondakov (18.03.04 17:23) [10]
> Вот моя конструкция работает, а эта попадает на
> оператор Perform(WM_NEXTDLGCTL,0,0); но ничего не происходит!
Блин, а голова на что дадена? только примеры копировать?? А подумать почему оно так работает, а так - нет?
Да, недодумал немного. Надо было так:
procedure TForm1.OnDBEditChange(Sender: TObject);
begin
with Sender as TDBEdit do
if length(Text)=MaxLength then
Self.Perform(WM_NEXTDLGCTL,0,0);
end;
ikondakov (2004-03-18 18:22:00) [2]спасибо, это то, что надо!!!
panov (2004-03-18 17:55:00) [3]
procedure TForm1.DBEdit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=13 then
begin
Key := 0;
SelectNext((Sender as TDBedit),True,True);
Exit;
end;
if Key in [VK_UP,VK_DOWN,VK_TAB,VK_LEFT,VK_RIGHT,VK_SHIFT,VK_END,VK_HOME] then Exit;
if (Sender as TDBedit).MaxLength=Length((Sender as TDBedit).Text)
then SelectNext((Sender as TDBedit),True,True);
end;
<CODE/>
stud (2004-03-18 17:45:00) [4]это форма на которой лежат у меня компоненты
ikondakov (2004-03-18 17:38:00) [5]newvrachf - а что это?
stud (2004-03-18 17:27:00) [6]вот еще вариант
if length((sender as TdxEdit).Text)=((sender as TdxEdit).MaxLength) then
begin
beep;
newvrachf.SelectNext((newvrachf.ActiveControl),true,true);
(newvrachf.ActiveControl as TdxEdit).SelLength:=0;
end;
ikondakov (2004-03-18 17:23:00) [7]за оператором прога следить будет. Они тупы по жизни. (Заранее прошу прощения у всех операторов, но у нас они такие)у Едитов.Tabstop = true. Вот моя конструкция работает, а эта попадает на оператор Perform(WM_NEXTDLGCTL,0,0); но ничего не происходит!
Соловьев (2004-03-18 17:19:00) [8]имхо...гониво это все. Оператор должен быть не просто набивалкой, а как-то фиксировать как-то свои действия...Табом или энтером...
Брекпойнт поставь(Perform) и посмотри что происходит...
А у Едитов.Tabstop = true?
ikondakov (2004-03-18 17:15:00) [9]не хочет он перескакивать. просто ничего не происходит.
KSergey (2004-03-18 16:55:00) [10]Более обобщенное - см. KSergey © (18.03.04 16:52) [5]
Код примерно такой:
procedure TForm1.OnDBEditChange(Sender: TObject);
begin
with Sender as TDBEdit do
if length(Text)=MaxLength then
Perform(WM_NEXTDLGCTL,0,0);
end;
Этот обработчик назначить всем DBEdit'ам
ikondakov (2004-03-18 16:53:00) [11]Мне надо первое, причём ровно так как я написал.
Дело в том, что так на фоксе реализовано когда там проги делаешь! Пользователи меня не убьют, потому что вводщики - им пофиг они просто коды вбивают и всё, главное базу заполнить. По табу и ентеру я знаю как и это не прокатит, лишний лик. я делал так:
procedure TForm1.DBEdit1Change(Sender: TObject);
begin
if length(DBEDIT1.Text)=dbedit1.MaxLength then
Perform(WM_NEXTDLGCTL,0,0);
end;
но полей довига и для каждого такое прописывать... это гимор. может есть что-то более обобщённое?
KSergey (2004-03-18 16:52:00) [12]Видимо, автору хочется передавать фокус ;)
В принципе, вещь не всегда ужасная, например в случае наличия большого кол-во полей с относительно короткими текстами фиксированной длины. Это вполне может оказаться удобно при "вбивке" большого объема данных (через 2-3 буквы/цифры жать Tab? не, это не очень здорово)
Думаю, надо рыть в сторону обработчика onChange элементов ввода. Сделать для всех единый и в нем разруливать завершенность ввода (см. параметр Sender в этом обработчике).
PS
Что можно поля таскать на форму - не знал ;)
Соловьев (2004-03-18 16:45:00) [13]надо чтобы фокус ввода менялся? или данные на части разбивались?
если первое - то пользователи тебя убьют(по табу или ентеру надо делать), а если второе - то может тебе надо BLOB? только причем здесь цифры?
ikondakov (2004-03-18 16:26:00) [14]Все компоненты DBEdit. Перенос полей - это перетаскивание поля из редактора полей Table (если по нему 2 наза кликнуть) на форму. В результате Дельфя сама выбирает какой компонент использовать.
Поля не разбиваются, просто у каждого из них разное количество символов (цифр) можно ввести.
KSergey (2004-03-18 16:01:00) [15]Чтол есть перенос "полей"? Пока я понял лишь, что длинный текст решено разбивать по полям одной записи. Или разных??
Да и Domkrat прав...
Domkrat (2004-03-18 15:56:00) [16]Смотря какой компонент Вы используете для ввода данных ?