Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Частичная автоматизация. [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]

Смотря какой компонент Вы используете для ввода данных ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо