![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как бороться с Clipboard [Win95/98]
Alex4444444444 © (2002-11-04 11:05:00)Если я копирую текст из "продвинутого" окна (типа IE или WordPad) и потом вставляю его в "непродвинутый" TEdit или TMemo, то получается просто куча "?""ов. Я перехватил WM_PASTE и нашел в Clipboard кучу форматов, включая UNICODE и RTF. Внимание, вопрос: что мне с ними делать? Как, скажем, преобразовать UNICODE или RTF в ASCII? (Автоматическое приведение типов не предлагать: получаются все те же "?".)
Alex4444444444 (2002-11-04 23:36:00) [1]To Shrek: не помогает (в TEdit и TMemo).
Я решил проблему, правда, per annus (форточки...), но, вроде, пока работает. Давно собирался ето сделать, т.к. задолбало открывать html в редакторе, искать там текст, выравнивать строчки, копировать... Кому интересно, вот код:
const
// Supported (desired?) code pages
// Probably, one should enumerate available codepages on startup...
CP_COUNT = 2;
CodePages: array[0..CP_COUNT-1] of Integer =
(CP_ACP, 1251);
// Will try to convert CF_UNICODETEXT to a string
function GetClipboardText(out Dest: string): Boolean;
var Data: THandle;
WP: PWideChar;
P: PChar;
Lng: Integer;
I: Integer;
BRes: Bool;
begin
Result := IsClipboardFormatAvailable(CF_UNICODETEXT);
if Result then begin
Result := OpenClipboard(Application.Handle);
if Result then try
P := nil;
Data := GetClipboardData(CF_UNICODETEXT);
if Data <> 0 then try
GetMem(P, Lng + 1);
WP := PWideChar(GlobalLock(Data));
Lng := Length(WP);
for I := 0 to CP_COUNT - 1 do
if (WideCharToMultiByte(1251, 0, WP, Lng, P, Lng + 1, nil, @BRes) <> 0) and
not BRes
then begin
SetString(Dest, P, Length(P));
Exit;
end;
Result := False;
finally
FreeMem(P);
GlobalUnlock(Data);
end
finally
CloseClipboard;
end;
end;
end;
...
procedure TCustomFDEdit.WMPaste(var Message: TWMPaste);
var Res: string;
begin
if GetClipboardText(Res) then SelText := Res
else inherited;
end;
Shrek (2002-11-04 22:11:00) [2]попробуй при копирование текста поставить рускую роскладку клавиатуры
Alex4444444444 (2002-11-04 20:32:00) [3]CP_ACP --- ето не активная ли страница? Тогда "?" и получатся. (Я так понимаю, что система именно ето и делает, когда читаешь CF_TEXT.) У меня НЕ стоит русская кодовая страница (по многим причинам). Ну, а если даже я ее поставлю, то будут те же заморочки со, скажем, французским или немецким текстом. Фокус в том, что "продвинутые" то окна как-то ее определяют! Наверное, нужно все-таки Locale извлекать... А RTF --- ето для примера просто. Там ведь, вроде, 1 байтные символы, или нет? Только написаны per annus: "fe или типа того.
Marcus (2002-11-04 20:12:00) [4]Ну к чему все это, лучше бы водки выпили. (Из писем Белинского Гоголю)
На самом деле WideCharToMultiByte(CP_ACP, ....) и все дела
Есть еще в VCL функция WideCharToString, у нее вообще один аргумент PWideChar
А с RTF нет смысла заморачиваться, все равно TMemo и TEdit он до фени...
Alex4444444444 (2002-11-04 20:07:00) [5]Никаких идей? Может, RTF формат? Как его тогда получить? В смусле, т.к. он нестандартный, надо узнать его ID...
Alex4444444444 (2002-11-04 18:15:00) [6]Поднимаю топик. Ни хрена не получается. WideCharToMultiByte требует CodePage. Где ее взять? В Clipboard есть CF_LOCALE; как из нее получить CodePage? Пробую GetLocaleInfo, но WideCharToMultiByte возвращает ошибку. Да, естественно, речь идет о кириллице (но хотелось бы, чтобы ето определялось автоматически), и, естественно, система не руссифицирована (кроме фонтов для IE и русской клавиатуры), т.е., скажем, русскую сортировку она сама не делает...
Alex4444444444 (2002-11-04 11:46:00) [7]Нет. Спасибо, попробую.
Marcus (2002-11-04 11:33:00) [8]А WideCharToMultiByte пробовал ?