Форум: "Основная";
Текущий архив: 2002.11.14;
Скачать: [xml.tar.bz2];
ВнизКак бороться с Clipboard Найти похожие ветки
← →
Alex4444444444 (2002-11-04 11:05) [0]Если я копирую текст из "продвинутого" окна (типа IE или WordPad) и потом вставляю его в "непродвинутый" TEdit или TMemo, то получается просто куча "?""ов. Я перехватил WM_PASTE и нашел в Clipboard кучу форматов, включая UNICODE и RTF. Внимание, вопрос: что мне с ними делать? Как, скажем, преобразовать UNICODE или RTF в ASCII? (Автоматическое приведение типов не предлагать: получаются все те же "?".)
← →
Marcus (2002-11-04 11:33) [1]А WideCharToMultiByte пробовал ?
← →
Alex4444444444 (2002-11-04 11:46) [2]Нет. Спасибо, попробую.
← →
Alex4444444444 (2002-11-04 18:15) [3]Поднимаю топик. Ни хрена не получается. WideCharToMultiByte требует CodePage. Где ее взять? В Clipboard есть CF_LOCALE; как из нее получить CodePage? Пробую GetLocaleInfo, но WideCharToMultiByte возвращает ошибку. Да, естественно, речь идет о кириллице (но хотелось бы, чтобы ето определялось автоматически), и, естественно, система не руссифицирована (кроме фонтов для IE и русской клавиатуры), т.е., скажем, русскую сортировку она сама не делает...
← →
Alex4444444444 (2002-11-04 20:07) [4]Никаких идей? Может, RTF формат? Как его тогда получить? В смусле, т.к. он нестандартный, надо узнать его ID...
← →
Marcus (2002-11-04 20:12) [5]Ну к чему все это, лучше бы водки выпили. (Из писем Белинского Гоголю)
На самом деле WideCharToMultiByte(CP_ACP, ....) и все дела
Есть еще в VCL функция WideCharToString, у нее вообще один аргумент PWideChar
А с RTF нет смысла заморачиваться, все равно TMemo и TEdit он до фени...
← →
Alex4444444444 (2002-11-04 20:32) [6]CP_ACP --- ето не активная ли страница? Тогда "?" и получатся. (Я так понимаю, что система именно ето и делает, когда читаешь CF_TEXT.) У меня НЕ стоит русская кодовая страница (по многим причинам). Ну, а если даже я ее поставлю, то будут те же заморочки со, скажем, французским или немецким текстом. Фокус в том, что "продвинутые" то окна как-то ее определяют! Наверное, нужно все-таки Locale извлекать... А RTF --- ето для примера просто. Там ведь, вроде, 1 байтные символы, или нет? Только написаны per annus: "fe или типа того.
← →
Shrek (2002-11-04 22:11) [7]попробуй при копирование текста поставить рускую роскладку клавиатуры
← →
Alex4444444444 (2002-11-04 23:36) [8]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;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c