Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2022, 23:34   #1
hexor_boo
Разъяснятор
Пользователь
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 42
Вопрос Отредактировать строку в буфере обмена (RAD 10.4)

Нужно отредактировать строку в буфере обмена. А именно: убрать из неё CRLF'ы с их заменой на " " или ",". Собственно замену символов в строке я могу сделать. Интересует именно как скопировать содержимое буфера обмена в String. Как это можно сделать?

Варианты подходящих решений, как я вижу на настоящий момент:
1) Отредактировать строку с заменой символов прямо в буфере обмена и потом скопировать её в переменную типа String
2) Скопировать в переменную типа String содержимое буфера обмена и уже там делать замену символов.

Второе думаю проще?

Последний раз редактировалось hexor_boo; 28.09.2022 в 23:39. Причина: Уточнение вопроса
hexor_boo вне форума Ответить с цитированием
Старый 29.09.2022, 00:25   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,381
По умолчанию

Второе не только проще, но и правильнее. Для взаимодействия с буфером обмена используйте объект Clipboard
Код:
MyBufferString := Clipboard.AsText;
// Заменяйте все что нужно.
macomics вне форума Ответить с цитированием
Старый 30.09.2022, 20:13   #3
hexor_boo
Разъяснятор
Пользователь
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 42
По умолчанию

2 macomics, а какой юнит нужно подключить чтобы обращаться к этому объекту в Delphi RAD 10.4 (Sydney)? Пробовал Fmx.Clipboard, Fmx.Clipboard.Win - не работает...

UPD: а ларчик просто открывался - нужно подключать стандартный юнит Clipbrd

Последний раз редактировалось hexor_boo; 30.09.2022 в 20:20. Причина: Продвижение в решении задачи
hexor_boo вне форума Ответить с цитированием
Старый 30.09.2022, 20:56   #4
hexor_boo
Разъяснятор
Пользователь
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 42
По умолчанию

Задача стоит для компонента TcxTextEdit (библиотека компонентов DevExpress 19.1.2)
У него нет события OnChange и прикручено какое-то извращенство в виде OnEditing

Я пишу такой код:
Код:
procedure TFormSaveOrder.edAdrEditing(Sender: TObject; var CanEdit: Boolean);
Var
 strBuffer    : String;
 strCRLF      : String;
 strSeparator : String;
begin
 //If (edAdr.Text<>'') Then
 // Begin
   strBuffer:=Clipboard.AsText;
   strCRLF:=Chr(13)+Chr(10);
   strSeparator:='===>!<===';
   edAdr.Text:=ReplaceStr(strBuffer, strCRLF, strSeparator);
 // End;
end;
Кпирую в буфер обмена следующее:
Код:
 //If (edAdr.Text<>'') Then
 // Begin
И получаю в поле edAdr.Text следующий вывод:
Код:
 //If (edAdr.Text<>'') Then //If (edAdr.Text<>'') Then===>!<=== // Begin
Т.е. туда выводится первая из двух строк - CRLF отрубает вывод второй строки (вот это безобразие нужно как-то убрать) и далее выводятся как и нужно 1-я строка, разделитель, 2-я строка.

Встречался кто-то с такой задачкой?
hexor_boo вне форума Ответить с цитированием
Старый 30.09.2022, 21:31   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,381
По умолчанию

Странный глюк. Попробуйте так
Код:
procedure TFormSaveOrder.edAdrEditing(Sender: TObject; var CanEdit: Boolean);
Var
 strBuffer    : String;
 strCRLF      : String;
 strSeparator : String;
begin
 //If (edAdr.Text<>'') Then
 // Begin
   strBuffer:=ReplaceStr(Clipboard.AsText, #13+#10, '===>!<===');
   edAdr.Text := strBuffer;
 // End;
end;

Последний раз редактировалось macomics; 30.09.2022 в 21:36.
macomics вне форума Ответить с цитированием
Старый 30.09.2022, 21:48   #6
hexor_boo
Разъяснятор
Пользователь
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 42
По умолчанию

Результат edAdr.Text:
Код:
 //If (edAdr.Text<>'') Then //If (edAdr.Text<>'') Then===>!<=== // Begin
hexor_boo вне форума Ответить с цитированием
Старый 30.09.2022, 22:01   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,381
По умолчанию

Тогда стоит посмотреть где же глюк. В ReplaceStr или в Clipboard.AsText
Для начала выведите строки без замены из Clipboard.AsText
После попробуйте собственную функцию замены текста
Код:
function srplc(aText, aPattern, aReplace: String): String;
var
  t, r: String;
  s, l: LongInt;
begin
  t := aText;
  r := '';
  s := Pos(aPattern, t);
  l := Length(aPattern);
  while s > 0 do begin
    r := r + copy(t, Low(t), s) + aReplace;
    t := copy(t, s + l);
    s := Pos(aPattern, t);
  end;
  srplc := r + t;
end;
Как-то так. Опечатки думаю исправите. Оптимизация ни к чему. Надо понять где ошибка. А как временное решение пойдет.
macomics вне форума Ответить с цитированием
Старый 30.09.2022, 22:05   #8
hexor_boo
Разъяснятор
Пользователь
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 42
По умолчанию

Открыл cxTextEdit.pas - имена переменных-свойств и методов классов НЕ в алфавитном порядке. Ужось. Не хотелось бы углубляться в его анализ.
hexor_boo вне форума Ответить с цитированием
Старый 30.09.2022, 22:09   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,381
По умолчанию

А вам оно надо. Все решается внешними тестами.
Если хотите что-то найти, тогда открывайте контекстное меню на имени свойства и там будет 'Найти text' или как-то так. Потом по объявлению свойства в классе, на который вас перебросит сам редактор и там в контекстном меню уже будет 'Перейти к реализации text' или как-то так. Точно такого же эффекта можно добиться зажав Ctrl и щелкая ЛКМ по тексту в программе.

Последний раз редактировалось macomics; 30.09.2022 в 22:13.
macomics вне форума Ответить с цитированием
Старый 30.09.2022, 22:18   #10
hexor_boo
Разъяснятор
Пользователь
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 42
По умолчанию

2 macomics, благодарю!

Однако очень странно работает само событие OnEditing у этого компонента. Так, например если нажать CTRL+V в этом edAdr и прописать в обработчике события CanEdit:=False; (даже, например, после присвоения строки в Text), то строка в Text сотрется. А если сначала присвоить True, то потом невозможно присвоить False.

Через Ctrl-ЛКМ - это я знаю. Для этого компонента так не получилось.
Если все решается внешними тестами - нет смысла закапываться - согласен.

Последний раз редактировалось hexor_boo; 30.09.2022 в 22:23. Причина: Дополнил ответ
hexor_boo вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Гиперссылка в буфере обмена Maksim_V Microsoft Office Excel 3 07.07.2017 15:54
Автозамена в буфере обмена Егор Александрович Microsoft Office Word 1 27.02.2016 03:36
Кодировка в буфере обмена dacorp Общие вопросы Delphi 3 14.05.2011 16:46
Выловить в буфере обмена даные с значением http -=Virus=- Помощь студентам 13 20.02.2010 23:14
Что у тебя в буфере обмена? Hollander Свободное общение 26 18.02.2010 16:55