Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648

Как контролировать процесс копирования в окно редактирования из буфера обмена

03.08.2018, 13:04. Показов 1284. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.

Нужно окно редактирования для корректного ввода чисел с минимальным кодом.
Самый простой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
    if ((Key == '.') || (Key == ','))
    {   // Точку или запятую заменяем десятичным разделителем, проверив что он в числе единственный
        if( (strchr(Edit1->Text.c_str(), '.')) == 0 && (strchr(Edit1->Text.c_str(), ',')) == 0)
            Key = DecimalSeparator;
        else
            Key = 0;
    }
    else if (Key == '-')
    {
        // Проверяем, что вводимый минус единственный и стоит самым первым в числе
        if((Edit1->SelStart) || (Edit1->Text[1] == '-') ) Key = 0;
    }
    else if (Key == 8)  {}  // Разрешаем BackSpace
    else if (Key < '0' || Key > '9') Key = 0;  // Запрещаем нецифровые символы
}
Но как предусмотреть такой случай: пользователь копирует откуда-либо нечисловое выражение, например "asdf", через буфер обмена и воспользовавшись контекстным меню компонента Edit1 вставляет в него ошибочные (нечисловые) данные. Как бы ему это не позволить сделать?

Не по теме:

Можно ли в предложенном выше коде имя компонента Edit1 заменить на обращение Sender и как?

0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.08.2018, 13:04
Ответы с готовыми решениями:

Убрать диалоговое окно очистки буфера обмена
Помогите пожалуйста! Мне нужно очистить в Exel буфер обмена данными без появления диалогового окна с запросом, что делать с данными. ...

Выполнение вставки из буфера обмена в произвольное активное окно
Здравствуйте товарищи! Подскажите как возможно реализовать вставку информации из буфера обмена в любое активное окно? Т.е. без привязки...

Как запустить процесс и контролировать его
Привет. Я новичок. Я хочу попробовать запускать внешнюю программу из своей (допустим, это будет some.exe) и контролировать исходящие пакеты...

6
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33407 / 21517 / 8236
Регистрация: 22.10.2011
Сообщений: 36,917
Записей в блоге: 12
03.08.2018, 13:12
Цитата Сообщение от jkrnd Посмотреть сообщение
Как бы ему это не позволить сделать?
Не позволить вообще что-то вставлять из буфера? Легко: https://www.cyberforum.ru/post4803331.html
1
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,423
Записей в блоге: 3
03.08.2018, 14:40
Цитата Сообщение от jkrnd Посмотреть сообщение
Нужно окно редактирования для корректного ввода чисел
SpinEdit? (FloatSpinEdit?)
1
483 / 275 / 57
Регистрация: 08.10.2015
Сообщений: 1,190
03.08.2018, 20:02
А еще возможно e, E (их количество и положение надо проверить) и тогда может появиться второй минус (плюс). И его положение надо тоже проверить. А также проверить положение точки.
Не проще ли просто целиком взять строку символов из Edit и проанализировав её преобразовать в число или просигналить об ошибке ввода? Так конечно будет длиннее, но можно избежать любых ошибок.
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
04.08.2018, 02:10
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Цитата Сообщение от jkrnd Посмотреть сообщение
Можно ли в предложенном выше коде имя компонента Edit1 заменить на обращение Sender
Ещё вариант__
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
     TEdit *edi = (TEdit*)Sender;  float fD;
     if(edi->Text=="-" || edi->Text=="") return; 
     try { fD = edi->Text.ToDouble(); }
     catch(...) { Timer1->Tag=8; }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    if( !Timer1->Tag) return;
    Edit1->Color = Timer1->Tag %2 ? clWhite : clRed;
    Timer1->Tag = Timer1->Tag -1;
    if(!Timer1->Tag) Edit1->Text = "";
}
1
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
04.08.2018, 03:18
C++
1
2
3
4
5
6
      Set <char, 0, 255> Dig;
      Dig << '0' << '1' << '2' << '3' << '4' << '5' << '6' << '7' << '8' << '9' << '.' << '-';
 
       if(Key==13) Edit2->SetFocus();
       if(Dig.Contains(Key)) KeyPress(Key);
       else Key=0;
Так я делал запрет на ввод нечисловых значений в Edit при вводе. Можно прикрутить к обработчику OnChange

Добавлено через 1 минуту
Кстати, взято из Архангельского
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
04.08.2018, 07:26  [ТС]
volvo, подскажите пожалуйста что нужно включить в модуль чтобы не появлялось
Qualifier 'Winapi' is not a class or namespace name

Добавлено через 1 минуту
может как-то можно подменить стандартное контекстное меню TEdit пустым своим?

Добавлено через 11 минут
Цитата Сообщение от TrollHammer Посмотреть сообщение
Можно прикрутить к обработчику OnChange
там нет Key.
А как быть с дублированием минусов, точек? С неверным вводом разделителя?
С возможностью редактирования клавишей BackSpace?
И, наконец, с возможностью вставки нечисловых значений через буфер обмена?

Добавлено через 9 минут
nick42, Ваш вариант наиболее подходит:
C++
1
2
3
4
5
6
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
     TEdit *edi = (TEdit*)Sender;  float fD;
     try { fD = edi->Text.ToDouble(); }
     catch(...) { edi->Text=""; }
}
Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.08.2018, 07:26
Помогаю со студенческими работами здесь

Как вставить из буфера обмена?
Подскажите как нажатием кнопки вставить содержимое буфера обмена в окошко другой программы, к примеру в открытый блокнот, вернее как...

Как получить текст из буфера обмена?
Пишу макрос (Word), вот фрагмент кода: Selection.Copy Windows('EMA').Activate Selection.Find.ClearFormatting With Selection.Find ...

Как получить изображение с буфера обмена
вообще хочу сделать такую штуку,нажимаю принтскрин и вставку изображения в форме,сначала изображение помещается в буфер обмена,как вообще...

Как получить текст из буфера обмена?
Господа и Дамы программисты, кто подскажет как средствами С# получить текст из буфера обмена? А еще лучше выделенный текст из любого...

Как получить текст из буфера обмена
вот код как получить Clipboard.GetText(); чет оно не юзает внешние данные не из программы. as is get Clipboard.GetText(); ? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru