![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что неверно в этом коде?
Грициан © (2007-04-25 14:56:00)
type
TEditStreamCallBack = function (dwCookie : DWORD; buf : PWideChar;
bytestoread : LongInt; var bytesread : LongInt): DWORD; stdcall;
TEditStream = record
dwCookie: Longint;
dwError: Longint;
pfnCallback: TEditStreamCallBack;
end;
StreamOps = (readop, writeop);
TRTFCookieData = record
streamop : readop..writeop;
UnicodeBuff: PWideChar;
end;
PRTFData = ^TRTFCookieData;
function EditStreamCallBack(dwCookie : DWORD; buf : PWideChar;
bytestoread : LongInt; var bytesread : LongInt): DWORD; stdcall;
var
UnicodeBuff: PWideChar;
RTFData : PRTFData;
begin
RTFData := PRTFData(dwCookie);
UnicodeBuff := RTFData.UnicodeBuff;
result := S_OK;
bytesread := 0;
try
if RTFData.streamop = readop then
Move(UnicodeBuff, buf, bytestoread)
else
Move(buf, UnicodeBuff, bytestoread);
bytesread := bytestoread;
except
result := S_FALSE;
end;
end;
procedure RTF_To_Stream(RE : THandle; Buff: PWideChar);
var
CookieData : TRTFCookieData;
EditStream : TEditStream;
begin
CookieData.streamop := writeop;
CookieData.UnicodeBuff := Buff;
EditStream.dwCookie := DWORD(@CookieData);
EditStream.pfnCallback := EditStreamCallBack;
EditStream.dwError := S_OK;
SendMessage(RE, EM_STREAMOUT, SF_TEXT or SF_UNICODE, LongInt(@EditStream));
end;
procedure RTF_From_Stream(RE : THandle; Buff: PWideChar);
var
CookieData : TRTFCookieData;
EditStream : TEditStream;
begin
CookieData.streamop := readop;
CookieData.UnicodeBuff := Buff;
EditStream.dwCookie := DWORD(@CookieData);
EditStream.pfnCallback := EditStreamCallBack;
EditStream.dwError := S_OK;
SendMessage(RE, EM_STREAMIN, SF_TEXT or SF_UNICODE, LongInt(@EditStream));
end;
function TJvCustomRichEdit.GetTextW(): WideString;
var
Buff: PWideChar;
begin
Buff := AllocMem(GetTextLen * SizeOf(WideChar));
RTF_To_Stream(Handle, Buff);
Result := Buff;
end;
Хочу получить юникодный текст из RichEdit. В коллбек функции видно, что данные таки передаются. Но при выходе из функции получаю AV. Что тут неправильно?
icWasya (2007-04-25 15:58:00) [1]по синтаксису Паскаля вместо
Move(UnicodeBuff, buf, bytestoread)
нужно
Move(UnicodeBuff^, buf^, bytestoread)
clickmaker (2007-04-25 15:54:00) [2]GetTextLen * SizeOf(WideChar) + 1);
на null-терминатор