![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как автоматически ставить пробел после запятой [D7, XP]
Dymok © (2009-08-14 15:12:00)TDBMemo
Пользователи все время тупят и забывают ставить пробел после запятой.
Как написать событие, чтобы при наборе запятой автоматически после неё вставлялся пробел?
Kolan (2009-08-17 11:28:00) [1]Конечно вы произносите не правильно. Нужно очень плохо знать русский и английский, чтобы букву «О» произнести как «У». Даже дети не ошибаются, так как буквы выглядят одинаково.
На счет стандартного дерьма — вы не правильно трактуете мои слова. Смысл их в том, что ошибки в дизайне той программы я вижу и сам, поэтому и критиковать её особого смысла нет, но тогда, я не знал как можно сделать лучше. А программы я показал в ответ на комментарий Раскова.
Теперь по сабжу. То что вы написали — это не сценарий, это задание кодеру, который его тупо реализует. Поэтому формулируя вопрос таким образом вы можете рассчитывать только на техническое решение.
Технически можно сделать так, как вы делали и это будет работать.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Memo1: TMemo;
BitBtn1: TBitBtn;
procedure Memo1KeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FReactOnKeyPress: Boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FReactOnKeyPress := True;
end;
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
if (Key = ',') and FReactOnKeyPress then
begin
FReactOnKeyPress := False;
try
SendMessage(Memo1.Handle, WM_CHAR, Word(','), 0);
SendMessage(Memo1.Handle, WM_CHAR, Word(' '), 0);
Key := #0;
finally
FReactOnKeyPress := True;
end;
end;
end;
end.
Но! Так как тут собрались не роботы, а нормальные люди, которые думают, то уже в [2] вам заметили, что ваше решение будет работать мягко говоря не всегда.
Поэтому вам и предложили форматировать строку нужным образом перед вставкой в базу.
А я еще добавляю, что, скорее всего (сценариев вы так и не показали) ваше решение будет раздражать пользователей, так как то, что они вводят будет изменяться по не понятным правилам.
В той же авто замене в Вёрде есть возможность отменить эту автозамену, вы будите реализовывать такую возможность? — Нет конечно, потому что она там не нужна, как и сама автозамена.
Я лично присоединяюсь к Раскову [20]. С точки зрения человеко-машинного взаимодействия это вариант неплох. Пользователи вводят так, как могут и никто их не дергает. Да и с точки зрения кода все очень просто.
---
Вам нужно научится слушать (или читать), на этом форуме люди редко занимаются пиаром, рекламой, самоутверждением и пр. Наоборот, часто ответы формулируются так, чтобы человек увидел свои ошибки.
Dymok (2009-08-17 10:52:00) [2]Кулан (а я правильно произношу?), легче всего, когда не знаешь решения, объявить что, дескать, задача не имеет смысла и делать все надо совсем по-
другому. В то же время не забыть дешево пропиарить совершенно ни к месту собственные программные продукты, предлложить собеседнику сделать тоже самое (может еще членами померяемся?), одновременно обвинив партнера в незрелости и недальновидностии. Вы просто дурно воспитаны, мой друг. Вы стремитесь возвыситься в глазах общества за счет унижения других. Кто занимается вашим воспитанием? Предвижу ответ типа: "Когда папа Карло, а когда никто."
Причем, почти сразу вы демонстрируете огромную неуверенность в своих собственных силах, при малейшейневинной критике со стороны Andy BitOff Вы пытаетесь сохранить лицо, самоуничижая себя. Типа "Я то сам супер, но смотрите каким "стандртным дерьмом" (это я вас цитирую) приходиться заниматься, на что приходиться тратить свою бесценую молодость. Неужели так боитесь критики? Надо броться с комплексами, иначе они Вас задушат, Kolan.
А задача в общем-то проста. Не надо пытаться вникать в "сценарий" программы, отловить возможные подводные камни, это лишний труд, воспринимайте её как абстрактную.
Как после ввода запятой в TDBMemo замечательным, умным, самым продвинутым в мире пользователем, автоматически вставлять пробел после этой запятой, в месте ввода/редактирвания. Аналог функции "Автоформат" в любом текстовом редакторе например Word или OpenOffice.Writer
И еще. Сделайте одолжение - если не знаете решения этой и других задач в других темах - не пишите ничего, не выставляйте напоказ собственную недоразвитость.
Virgo_Style (2009-08-17 09:53:00) [3]
> говна
</I
> дерьмо
>
Мы в пивной?
Kolan (2009-08-15 23:17:00) [4]Инженерная психология — это когнетика видимо.
Я, Andy BitOff, не пойму какая информация по вашему мнению и как разбросана. То есть в программа ужасна, но где информация разбросана — я не вижу.
Чтобы вам было проще вот сценарии, они простые.
1. Приходит мужик и хочет взять кредит. Тётка нажимает кнопку «Добавить должника». Вводит его данные и сохраняет. Тут же ей предлагается открыть на него кредит (да, мерзотной модальной формой). Тыкает «Да». Заполняет данные кредита (процент, сумму и пр.) и сохраняет. Печатает док-ты, который тут же открываются.
2. Приходит мужик и хочет заплатить бабки. Тётка тыкает дважды его фамилию или использует пункт контекстного меню или кнопку на тул баре (ага, множественный выбор и куча невидимых функция, гадость да?). Вводит сумму. Печатает отчеты.
3. Иногда программа индексирует просрочки. Крупные задолжники выделяются красным и жирным. Тётка печатает спец. команде их данные и они с ними работают.
Стандартная программа, стандартное дерьмо и то, что я сделал её за две недели (включая выработку ТЗ и понимание того, как вообще это все должно работать) вечеров меня не оправдывает. Просто тогда я лучше не мог.
Andy BitOff (2009-08-15 16:20:00) [5]Дык, Николай, я ничего не предлагаю и, собственно, советовать ничего не собираюсь. Просто, на мой взгяд, пространство формы расходуется не оптимально и если касаться эргономики в той ее части, что относится к биомеханике (в меньшей степени) и к инженернерной психологии (в большей), то это также не эффективно, т.к. юзеру сложно увидеть картину полностью из-за большого разброса данных по форме. Ему приходится выискивать интересующие его данные глазами, что и является не оптимальным. Конечно, через некоторое время юзер привыкает и знает где находится интересующая его информация, но вы же должны знать, как сказывается на дальнейшем восприяти продукта, первое знакомство с ним.
Kolan (2009-08-15 00:04:00) [6]Andy BitOff, говорите конкретнее и предлагайте чётче.
Andy BitOff (2009-08-14 23:38:00) [7]> Kolan © (14.08.09 23:24) [39]
> Посмотреть можно на Менеджер кредитов ( http://www.ksoftware.ru/wiki/kcred
> itsmanages) — пример совково-дельфового говна с вкраплениями
> орехов кое где.
Не эффективное расходование рабочего пространства, на лицо. Эх, на писали вы для рабочих мест с разрешением 640х480.
Kolan (2009-08-14 23:26:00) [8]Вместо «нравится им забывать ставить запятые» правильно читать «нравится им забывать ставить пробелы после запятых»
Kolan (2009-08-14 23:24:00) [9]Димок (я правильно произношу?), чтобы я был не голословен, обнародуйте сценарий работы пользователя и несколько скриншотов программы и я постараюсь объяснить свои слова.
*И почему мне кажется, что сценарий никто не писал, а может, даже никто и не знает что это такое?
Я почти уверен, что вы решаете не ту задачу. Отстаньте от ваших бедных пользователей, нравится им забывать ставить запятые — пусть забывают, а вы потом, после того, как они всё введут, исправляйте данные так, как вам угодно. Как это сделать вам уже рассказали.
Да, RASkov, к сожалению, показать особенно и нечего. Все использующиеся в данный момент программы я написал, когда думал примерно так же как автор этого вопроса.
Вот КСИНО есть ( http://www.ksoftware.ru/wiki/ksino), но это интерфейс просто не очень ужасный, до хорошего ему далеко. Да и пощупать негде.
Посмотреть можно на Менеджер кредитов ( http://www.ksoftware.ru/wiki/kcreditsmanages) — пример совково-дельфового говна с вкраплениями орехов кое где.
Медвежонок Пятачок (2009-08-14 18:39:00) [10]лучше вообще не бодаться с обработкой налету как уже было сказано.
но парень решил идти своим путем.
тем более что такое последний символ? я курсор двину в середину строки и нажму запятую, и вся логика упадет.
а так try/finally будет железобетонно работать отключая обработчик и включая снова
Inovet (2009-08-14 18:35:00) [11]> [36] Медвежонок Пятачок © (14.08.09 17:53)
> а отключить обработчик перед сендмессаджем а потом включить
> снова ты опять конечно же догадался
Лучше смотреть последний символ, и если это знак препинания, а текущий не знак препинания, то посылать пробел.
Медвежонок Пятачок (2009-08-14 17:53:00) [12]а отключить обработчик перед сендмессаджем а потом включить снова ты опять конечно же догадался, но попробуешь только в понедельник.
угадал?
Dymok (2009-08-14 17:48:00) [13]SendMessage(dbZavNom.Handle, WM_CHAR, Word(','), 0);
SendMessage(dbZavNom.Handle, WM_CHAR, Word(' '), 0);
Key:=#0;
???
Не-а ... Получается после любого SendMess c запятой вновь лезет в Onkeypress
Медвежонок Пятачок (2009-08-14 17:43:00) [14]- не работает. Вставляет несколько пробелов.
Два сендмессджа. Один с запятой, второй с пробелом.
После чего вар-параметр убиваем в ноль.
Dymok (2009-08-14 17:41:00) [15]Наверно после SendMessage(Memo1.Handle, WM_CHAR, Word(','), 0); вновь идет обработка key пресс
Dymok (2009-08-14 17:39:00) [16]Копи пасты и бекспейсы - это на усмотрение пользователя, мы ему автозамену при воде предлагаем (вспомните тот же MS Office), которую можно отменить и т.п.
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = char(',') then
begin
Key = ' ';
SendMessage(Memo1.Handle, WM_CHAR, Word(','), 0);
end
end;
- не работает. Вставляет несколько пробелов.
Форматирование - в понедельник попробую, может и понравиться
Медвежонок Пятачок (2009-08-14 17:30:00) [17]А чем тебе неоднократно советовавшееся форматирование не угодило?
он не ожидает копи-паста в мемо. или бэкспейса после запятой.
верующий он короче.
Inovet (2009-08-14 17:28:00) [18]> [26] Dymok © (14.08.09 17:22)
> Накопал
>
> procedure TForm1.Memo1KeyPress(Sender: TObject; var Key:
> Char);
> begin
> if Key = char(',') then
> SendMessage(Memo1.Handle, WM_CHAR, Word(' '), 0);
> end;
>
> Но, к сожалению, сначала пробел вставляет, зараза, а потом
> уже запятую...
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = char(',') then
begin
Key = ' ';
SendMessage(Memo1.Handle, WM_CHAR, Word(','), 0);
end
end;
Ы?:)
А чем тебе неоднократно советовавшееся форматирование не угодило?
Медвежонок Пятачок (2009-08-14 17:27:00) [19]Два раза сендмессадж и кей := 0 ?
Dymok (2009-08-14 17:26:00) [20]Догадаться, я и сам догадался. А вот как исправить...