Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

Частичная автоматизация.   Найти похожие ветки 

 
ikondakov   (2004-03-18 14:55) [0]

Здравствуйте. Есть база данных на Фоксе. Создаётся вводилка на Delphi с помощью автоматического переноса полей. Надо сделать так, чтобы как только максимальное количество символов достигнет MaxLength у поля ввода надо перескочить на другое (следущее) без нажатия клавиш. И, к стати, как это MaxLength автоматически выставлять при переносе полей. В соответствии с таблицей естественно!


 
Domkrat   (2004-03-18 15:56) [1]

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


 
KSergey ©   (2004-03-18 16:01) [2]

Чтол есть перенос "полей"? Пока я понял лишь, что длинный текст решено разбивать по полям одной записи. Или разных??
Да и Domkrat прав...


 
ikondakov   (2004-03-18 16:26) [3]

Все компоненты DBEdit. Перенос полей - это перетаскивание поля из редактора полей Table (если по нему 2 наза кликнуть) на форму. В результате Дельфя сама выбирает какой компонент использовать.
Поля не разбиваются, просто у каждого из них разное количество символов (цифр) можно ввести.


 
Соловьев ©   (2004-03-18 16:45) [4]

надо чтобы фокус ввода менялся? или данные на части разбивались?
если первое - то пользователи тебя убьют(по табу или ентеру надо делать), а если второе - то может тебе надо BLOB? только причем здесь цифры?


 
KSergey ©   (2004-03-18 16:52) [5]

Видимо, автору хочется передавать фокус ;)
В принципе, вещь не всегда ужасная, например в случае наличия большого кол-во полей с относительно короткими текстами фиксированной длины. Это вполне может оказаться удобно при "вбивке" большого объема данных (через 2-3 буквы/цифры жать Tab? не, это не очень здорово)

Думаю, надо рыть в сторону обработчика onChange элементов ввода. Сделать для всех единый и в нем разруливать завершенность ввода (см. параметр Sender в этом обработчике).

PS
Что можно поля таскать на форму - не знал ;)


 
ikondakov   (2004-03-18 16:53) [6]

Мне надо первое, причём ровно так как я написал.
Дело в том, что так на фоксе реализовано когда там проги делаешь! Пользователи меня не убьют, потому что вводщики - им пофиг они просто коды вбивают и всё, главное базу заполнить. По табу и ентеру я знаю как и это не прокатит, лишний лик. я делал так:

procedure TForm1.DBEdit1Change(Sender: TObject);
begin
if length(DBEDIT1.Text)=dbedit1.MaxLength then
Perform(WM_NEXTDLGCTL,0,0);
end;

но полей довига и для каждого такое прописывать... это гимор. может есть что-то более обобщённое?


 
KSergey ©   (2004-03-18 16:55) [7]

Более обобщенное - см. 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 17:15) [8]

не хочет он перескакивать. просто ничего не происходит.


 
Соловьев ©   (2004-03-18 17:19) [9]

имхо...гониво это все. Оператор должен быть не просто набивалкой, а как-то фиксировать как-то свои действия...Табом или энтером...

Брекпойнт поставь(Perform) и посмотри что происходит...
А у Едитов.Tabstop = true?


 
ikondakov   (2004-03-18 17:23) [10]

за оператором прога следить будет. Они тупы по жизни. (Заранее прошу прощения у всех операторов, но у нас они такие)у Едитов.Tabstop = true. Вот моя конструкция работает, а эта попадает на оператор Perform(WM_NEXTDLGCTL,0,0); но ничего не происходит!


 
stud ©   (2004-03-18 17:27) [11]

вот еще вариант
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:38) [12]

newvrachf - а что это?


 
stud ©   (2004-03-18 17:45) [13]

это форма на которой лежат у меня компоненты


 
panov ©   (2004-03-18 17:55) [14]

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/>


 
ikondakov   (2004-03-18 18:22) [15]

спасибо, это то, что надо!!!


 
KSergey ©   (2004-03-19 07:44) [16]

> 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;



Страницы: 1 вся ветка

Текущий архив: 2004.04.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.076 c
6-1076183970
sadretro
2004-02-07 22:59
2004.04.18
как проверить все IP адресса в локалке .


1-1080721853
DmitryNekl
2004-03-31 12:30
2004.04.18
Как сделать невидимым окно?


1-1080888551
Relaxxx
2004-04-02 10:49
2004.04.18
Экспорт в Эксель(как заполнять сразу большие блоки)


4-1075355181
Lefan
2004-01-29 08:46
2004.04.18
как получить список служб и их состояние?


6-1075749027
Djon007
2004-02-02 22:10
2004.04.18
NMSMTP? или IdSMTP?