|
<< Нажмите, чтобы показать Содержание >> Как создать редактор простого текста |
Примеры кода приведены для версии VCL и Lazarus для Windows.
▪Исключите все опции кроме текста из свойства AcceptDragDropFormat.
▪Обработайте событие OnPaste (см. ниже).
▪Уберите все команды пользовательского интерфейса, меняющие атрибуты текста и абзацев.
procedure TMyForm.MyRichViewEditPaste(Sender: TCustomRichViewEdit;
var DoDefault: Boolean);
var s: String;
begin
if Clipboard.HasFormat(CF_TEXT) the
begin
s := Clipboard.AsText;
Sender.InsertText(s, False);
end;
DoDefault := False;
end;
▪Исключите все опции кроме текста из свойства AcceptDragDropFormat.
▪Обработайте событие OnPaste (см. ниже).
▪Обработайте событие OnOleDrop (см. ниже).
▪Уберите все команды пользовательского интерфейса, меняющие атрибуты текста и абзацев и вставляющие многострочный текст.
▪Установите свойство WordWrap = False.
▪Включите опцию rvoDoNotWantReturns в EditorOptions.
▪Установите свойство VSmallStep = 1 перед вызовом Format.
▪Если также не нужны символы табуляции, установите RVStyle.SpacesInTab = 4.
uses Clipbrd, ActiveX;
// Возвращает одну строку текста, сделанную из s.
// Функция заменяет все переводы строки ' | '.
// Вы можете изменить эту функцию, например возвращать
// первую строку (текст до первого перевода строки)
function MakeOneLineString(const s: String): String;
var p: Integer;
begin
Result := AdjustLineBreaks(s);
while True do begin
p := Pos(#13#10, Result);
if p=0 then
break;
Delete(Result, p, 2);
Insert(' | ', Result, p);
end;
end;
procedure TMyForm.MyRichViewEditOleDrop(Sender: TCustomRichView;
const DataObject: IDataObject; Shift: TShiftState; X, Y: Integer;
PossibleDropEffects: TRVOleDropEffects;
var DropEffect: TRVOleDropEffect; var DoDefault: Boolean);
var FmtEtc: TFormatEtc;
StgMedium: TStgMedium;
ptr: Pointer;
s: String;
p, ByteCount, CharCount: Integer;
begin
DoDefault := False;
FillChar(StgMedium, sizeof(StgMedium), 0);
FillChar(FmtEtc, sizeof(FmtEtc), 0);
FmtEtc.cfFormat := CF_TEXT; // CF_UNICODETEXT для Delphi 2009+
FmtEtc.dwAspect := DVASPECT_CONTENT;
FmtEtc.lindex := -1;
FmtEtc.tymed := TYMED_HGLOBAL;
if DataObject.GetData(FmtEtc, StgMedium)<>S_OK then
exit;
if StgMedium.tymed=TYMED_HGLOBAL then
begin
ptr := GlobalLock(StgMedium.HGlobal);
try
ByteCount := GlobalSize(StgMedium.HGlobal);
CharCount := ByteCount;
// CharCount := CharCount div 2; // раскомментируйте для Delphi 2009+
SetLength(s, CharCount);
Move(ptr^, PChar(s)^, ByteCount);
finally
GlobalUnlock(StgMedium.HGlobal);
end;
p := Pos(#0, s);
if p>0 then
s := Copy(s, 1, p-1);
MyRichViewEdit.InsertText(MakeOneLineString(s), False);
end;
ReleaseStgMedium(StgMedium);
end;
procedure TMyForm.MyRichViewEditPaste(Sender: TCustomRichViewEdit;
var DoDefault: Boolean);
var s: String;
begin
if Clipboard.HasFormat(CF_TEXT) then
begin
s := Clipboard.AsText;
Sender.InsertText(MakeOneLineString(s), False);
end;
DoDefault := False;
end;