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

Вниз

ввод числа форматированный, извращённый. как??   Найти похожие ветки 

 
Алексей   (2004-02-25 12:50) [0]

Мне нужно сделать ввод числа в виде ЧЧЧ ЧЧЧ ЧЧЧ ЧЧЧ.ЧЧЧ, причём число должно быть всё время прижато к правому краю edit"а, куда я ввожу (независимо от длины числа). Не подскажите, можно ли это реализовать стандартными средствами delphi?


 
Sandman25+1   (2004-02-25 12:53) [1]

Стандартный TEdit с обработчиками OnKeyPress(для запрещения набора нецифр, непробелов и прочего) и OnChange для нужного форматирования. Только внутри OnChange Не забудьте временно убрать обработчик OnChange перед изменением Text, а то зациклится.


 
Алексей   (2004-02-25 12:55) [2]

" Не забудьте временно убрать обработчик OnChange перед изменением Text, а то зациклится."
как?


 
SPIRIT ©   (2004-02-25 12:57) [3]


> Sandman25+1 (25.02.04 12:53) [1]

согласен


> Алексей (25.02.04 12:50)

месяц где то назад в форуме подобныю задачу решали на обычном эдите...
ща попробую поискать ....


 
Defunct ©   (2004-02-25 12:57) [4]

Используйте MaskEdit.


 
Sandman25+1   (2004-02-25 12:58) [5]

[2] Алексей (25.02.04 12:55)

Edit1.OnChange := nil;
try
Edit1.Text := ...
finally
Edit1.OnChange := Edit1OnChange;
end;


 
Алексей   (2004-02-25 13:01) [6]

2 Defunct ©
"Используйте MaskEdit."
тогда вводимое число будет прижато к левому краю. Надо будет всё равно обработчик делать - пробелы добавлять.. ух..

2 Sandman25+1:
Спасибо, сейчас пообедаю и попробую. У меня если честно, пока всё на флагах - по 10 раз OnChange вызывался. В этом то скорее всего и кроются обидные глюки.

Одна из главных проблем - удаление запятой. Т.е. если выделить несколько символов (вместе с запятой) и удалить.. то начинаются вещи непредсказуемые. Как этот случай обработать - не знаю.


 
Алексей   (2004-02-25 13:02) [7]

2 SPIRIT ©
"месяц где то назад в форуме подобныю задачу решали на обычном эдите...
ща попробую поискать ...."
Буду весьма признателен.


 
Sandman25+1   (2004-02-25 13:07) [8]

[6] Алексей (25.02.04 13:01)

Честно говоря, я не представляю себе, почему так важно именно правое выравнивание и пробелы. Я обычно вообще только OnExit обрабатываю, а в OnKeyPress все "левые" сиволы заменяю на DecimalSeparator (если его еще нет в строке) либо вообще гашу (Key := #0).


 
Алексей   (2004-02-25 13:22) [9]

[8] Sandman25+1 (25.02.04 13:07)
"Честно говоря, я не представляю себе, почему так важно именно правое выравнивание и пробелы."
Такое уж требование (в проге конкуренте - так же.. начальство сказало сделать "не хуже", а пока получается хуже:)).


 
Sandman25+1   (2004-02-25 13:28) [10]

Понятно. Надеюсь, пользователи не удивляются, почему у них курсор перемещается на одну позицию влево, когда он стоит перед 123.000 и они набирают 4, делая 4 123.000. Главное - сделать удобнее, чем у конкурентов, чтобы заказчику понравилось.


 
Алексей   (2004-02-25 13:33) [11]

а курсор никуда не перемещается :). Стоит как вкопанный (с этим немало пострадал), так что ввод достаточно удобный. Послее ввода 4 (при этом курсор стоял перед 123.000) становится число 4 123.000, причём курсор остаётся перед 1 (но после 4).


 
Алексей   (2004-02-25 13:35) [12]

уже получилось гораздо удобнее чем у конкурента, но и гораздо глючнее... Та же "проблема с запятой": допустим, число 123.000, выделяем начиная с 2-ки и кончая вторым 0-м и жмём del - будет билеберда (выражающаяся тем, что постобработчик скажет, что ошибка и сотрёт всё число, оставив дефолтное 0.000).


 
Sandman25+1   (2004-02-25 13:36) [13]

>Послее ввода 4 (при этом курсор стоял перед 123.000) становится число 4 123.000, причём курсор остаётся перед 1 (но после 4).

И если теперь пользователь наберет 5, то получится:
1) 5 123.000
2) 4 523.000
3) 45 123.000
4) 4 123.000

И самое главное: пользователь заранее может уверенно предположить, что получится? При включенном Insert и выключенном.


 
Алексей   (2004-02-25 13:45) [14]

" пользователь заранее может уверенно предположить, что получится? При включенном Insert и выключенном."
Конечно! Ибо как с включенным Insert так и с выключенным - результат один (как с выключенным, т.е. вставка, а не overwrite). Слишком большой свободы пользователю предпочитаю не давать. По крайней мере пока.


 
Алексей   (2004-02-25 13:46) [15]

"И если теперь пользователь наберет 5, то получится:"
конечно же вариант 3.


 
Алексей   (2004-02-25 14:15) [16]

2 Sandman25+1
"Edit1.OnChange := nil;
try
Edit1.Text := ...
finally
Edit1.OnChange := Edit1OnChange;
end;"

В случае с Edit1 - всё понятно. А если я использую конструкцию:
with TEdit(Sender) do
begin
OnChange := nil;
try
.....
.....
finally
OnChange := XXXX;
end;
end;

Что вместо ХХХХ? Извиняюсь - просто сейчас нет времени лезть в хелпы/книги.


 
Sandman25+1   (2004-02-25 16:19) [17]

var
P: TNotifyEvent; // или Pointer

...
P := OnChange;
OnChange := nil;
try
...
finally
OnChange := P;
end;

Дело не в книгах :)
Если нужно вернуть старое значение, то это старое значение нужно где-то запомнить.



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

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

Наверх




Память: 0.5 MB
Время: 0.012 c
3-12237
lucky4me
2004-01-29 13:48
2004.03.05
TDBGrid: Как выделить строку программным путем?


3-12251
Layner
2004-02-09 13:18
2004.03.05
Как работать с XML файлом, как с таблицей БД?


1-12322
Lena19
2004-02-22 21:35
2004.03.05
как убить объект (самого себя)


3-12266
Yurko
2004-02-06 11:30
2004.03.05
Помогите с запросом


3-12269
td
2004-02-06 21:57
2004.03.05
индексы