Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Правильное копирование в буфер обмена  [new]
Антохин
Member

Откуда: Тюмень
Сообщений: 1667
Есть некий "русский текст", его необходимо правильно скопировать в буфер обмена, независимо от раскладки клавиатуры.
Как это можно реализовать???

стандартным
...
Clipboard.asText:=russian_text;
...
не получается.
нужно что-то делать с локалями или раскладкой...
19 май 11, 14:26    [10678346]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2387
Еще локаль нужно копировать (CF_LOCALE)
19 май 11, 14:36    [10678454]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
a_titeev
Member

Откуда: Невинномысск, Ставропольский край
Сообщений: 582
Антохин,

раньше, использовал такой вод код когда-то... сейчас не знаю, надо ли это, но в принципе будет работать

[source delphi]
var
..
pch, pch1: PChar;
..
case uMsg of
WM_COPY:
...
// Переключаем клавиатуру " в русский режим" , иначе - проблемы с кодировкой
getmem(pch, 100);
getmem(pch1, 100);
getkeyboardlayoutname(pch);
strcopy(pch1, pch);
while pch <> '00000419' do
begin
activatekeyboardlayout(hkl_next, 0);
getkeyboardlayoutname(pch);
if strcomp(pch, pch1) = 0 then
// Круг замкнулся - нет такого языка '00000419'
strcopy(pch, '00000419');
end;

// Данные - в буфер!!!
Clipboard.AsText := 'блаблабла';

while strcomp(pch, pch1) <> 0 do
begin // Возвращаем режим клавиатуры
activatekeyboardlayout(hkl_next, 0);
getkeyboardlayoutname(pch);
end;
freemem(pch);
freemem(pch1)
...
[/source]
19 май 11, 14:37    [10678462]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Антохин
Member

Откуда: Тюмень
Сообщений: 1667
a_titeev
Антохин,

раньше, использовал такой вод код когда-то... сейчас не знаю, надо ли это, но в принципе будет работать

[source delphi]
...
activatekeyboardlayout(hkl_next, 0);
...
[/source]

нормальный метод, но здесь сработает если добавлено 2 раскладки клавиатуры...

видел ещё метод через "ручное" выделение памяти, то есть выделили память, запихали туда текст и буфер "направили" в эту выделенную область.
19 май 11, 14:46    [10678560]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Антохин
Member

Откуда: Тюмень
Сообщений: 1667
Maxim Rusov
Еще локаль нужно копировать (CF_LOCALE)

как её скопировать и куда?)
19 май 11, 14:51    [10678604]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2387
  type
    TMyClipboard = class(TClipboard);

  procedure StrToClipboard(const AStr :string);
  var
    vLangID :LANGID;
  begin
    with TMyClipboard(Clipboard) do begin
      Open;
      try
        AsText := AStr;
        vLangID := GetUserDefaultLangID;
        SetBuffer(CF_LOCALE, vLangID, SizeOf(vLangID));
      finally
        Close;
      end;
    end;
  end;
19 май 11, 14:52    [10678619]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Антохин
Member

Откуда: Тюмень
Сообщений: 1667
Maxim Rusov,

всё работает, а почему у стандартного Clipboard нет метода SetBuffer???
19 май 11, 15:01    [10678711]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2387
Есть, но он protected. Не знаю, почему.
19 май 11, 15:02    [10678720]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Антохин
Member

Откуда: Тюмень
Сообщений: 1667
Maxim Rusov,

возможно из-за политик безопасности.
но тогда почему при наследовании он стал паблик???
19 май 11, 15:09    [10678763]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2387
Антохин
возможно из-за политик безопасности.

При чем здесь политики. Обычная недоработка, в VCL их пруд пруди.

Антохин
но тогда почему при наследовании он стал паблик???

Это трюк такой, позволяет получить доступ к protected свойствам.
19 май 11, 15:12    [10678794]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Антохин
Member

Откуда: Тюмень
Сообщений: 1667
Maxim Rusov
Антохин
возможно из-за политик безопасности.

При чем здесь политики. Обычная недоработка, в VCL их пруд пруди.

Антохин
но тогда почему при наследовании он стал паблик???

Это трюк такой, позволяет получить доступ к protected свойствам.

про политики я имею ввиду что защита от "продвинутого программиста", типа чтобы не повредил ничего в винде.

видимо и с наследованием они накосячили)))
но это довольно положительный косяк)))

a_titeev, Maxim Rusov, спасибо за помощь!
19 май 11, 15:15    [10678822]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Антохин
Member

Откуда: Тюмень
Сообщений: 1667
ещё такой вопрос, в Clipbrd.pas перенёс из протектовых в паблик метод
procedure SetBuffer(Format: Word; var Buffer; Size: Integer);
, но он всё равно недоступен, почему?
19 май 11, 15:26    [10678944]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2387
Наверное, он не компилируется. Не в путях, или используются packages.
19 май 11, 15:29    [10678980]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Антохин
Member

Откуда: Тюмень
Сообщений: 1667
Maxim Rusov
Наверное, он не компилируется. Не в путях, или используются packages.

что значит не в путях и используются packages???
это же обычный Clipbrd.pas прикрепляется, а значит его текст "тупо вставляется" в модуль в котором прописан в
uses Clipbrd
19 май 11, 15:33    [10679029]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2387
Антохин
что значит не в путях и используются packages???

Не "и" а "или".

Антохин
это же обычный Clipbrd.pas прикрепляется, а значит его текст "тупо вставляется" в модуль в котором прописан в uses Clipbrd

Щаз. Изучай матчасть. Что такое DCU и packages. Чтобы убедиться - допусти в модуле ошибку и посмотри ругнется ли на нее Delphi при компиляции.
19 май 11, 15:38    [10679077]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Антохин
Member

Откуда: Тюмень
Сообщений: 1667
Maxim Rusov
Антохин
что значит не в путях и используются packages???

Не "и" а "или".

Антохин
это же обычный Clipbrd.pas прикрепляется, а значит его текст "тупо вставляется" в модуль в котором прописан в uses Clipbrd

Щаз. Изучай матчасть. Что такое DCU и packages. Чтобы убедиться - допусти в модуле ошибку и посмотри ругнется ли на нее Delphi при компиляции.

спасибо за наводку - почитал и поизучал)))

вот перекомпилированный *.DCU файл с перенесённым методом SetBuffer() из Protected в Public.(+ несколько ещё попутных дкушок которые требовали компиляции).
Разархивировать в папке Lib
Могут ещё потребоваться некоторые файлы перекомпилировать - но тут уж сами)))
20 май 11, 07:12    [10681837]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Антохин
Member

Откуда: Тюмень
Сообщений: 1667
20 май 11, 07:13    [10681838]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Антохин
Member

Откуда: Тюмень
Сообщений: 1667


К сообщению приложен файл (Lib.7z - 107Kb) cкачать
20 май 11, 07:13    [10681839]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2387
Вообще говоря, без крайней необходимости менять системный библиотеки очень не рекомендуется. После этого ты не сможешь пользоваться никакими сторонними компонентами без сорцов. И уж точно не стоит их менять в каталоге LIB.
20 май 11, 10:00    [10682314]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Антохин
Member

Откуда: Тюмень
Сообщений: 1667
Maxim Rusov
Вообще говоря, без крайней необходимости менять системный библиотеки очень не рекомендуется. После этого ты не сможешь пользоваться никакими сторонними компонентами без сорцов. И уж точно не стоит их менять в каталоге LIB.

хм... может быть...
но DevExpress норм робит...
20 май 11, 10:57    [10682713]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2387
Значит, он не подключает Clipbrd.pas...
20 май 11, 11:18    [10682867]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
Maxim Rusov,

Я пока делаю так (Delphi 7)

 ActivateKeyboardLayout(LoadKeyboardLayout('00000419', 0), 0);

 Clipboard.Clear;
 Clipboard.SetTextBuf(pChar(s));

А у этого способа есть недостатки? Или подводные камни?
20 май 11, 11:44    [10683138]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Michael Longneck
Member

Откуда: Москва
Сообщений: 2263
procedure TClipboardHelper.SetAsUnicodeText(Text: WideString);
begin
   SetBuffer(CF_UNICODETEXT, PWideChar(Text)^, Length(Text)*Sizeof(PWideChar) + 1);
end;
20 май 11, 11:51    [10683207]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Michael Longneck
Member

Откуда: Москва
Сообщений: 2263
А за прыжки раскладки "повбывав бы".
20 май 11, 11:52    [10683217]     Ответить | Цитировать Сообщить модератору
 Re: Правильное копирование в буфер обмена  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62928
А не +2?
20 май 11, 12:22    [10683479]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить