Правильное копирование в буфер обмена

Антохин
Дата: 19.05.2011 14:26:47
Есть некий "русский текст", его необходимо правильно скопировать в буфер обмена, независимо от раскладки клавиатуры.
Как это можно реализовать???

стандартным
...
Clipboard.asText:=russian_text;
...
не получается.
нужно что-то делать с локалями или раскладкой...
Maxim Rusov
Дата: 19.05.2011 14:36:52
Еще локаль нужно копировать (CF_LOCALE)
a_titeev
Дата: 19.05.2011 14:37:22
Антохин,

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

[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.05.2011 14:46:45
a_titeev
Антохин,

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

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

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

видел ещё метод через "ручное" выделение памяти, то есть выделили память, запихали туда текст и буфер "направили" в эту выделенную область.
Антохин
Дата: 19.05.2011 14:51:46
Maxim Rusov
Еще локаль нужно копировать (CF_LOCALE)

как её скопировать и куда?)
Maxim Rusov
Дата: 19.05.2011 14:52:50
  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.05.2011 15:01:22
Maxim Rusov,

всё работает, а почему у стандартного Clipboard нет метода SetBuffer???
Maxim Rusov
Дата: 19.05.2011 15:02:20
Есть, но он protected. Не знаю, почему.
Антохин
Дата: 19.05.2011 15:09:26
Maxim Rusov,

возможно из-за политик безопасности.
но тогда почему при наследовании он стал паблик???
Maxim Rusov
Дата: 19.05.2011 15:12:07
Антохин
возможно из-за политик безопасности.

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

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

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