Как создать редактор простого текста

<< Нажмите, чтобы показать Содержание >>

Как создать редактор простого текста

Примеры кода приведены для версии VCL и Lazarus для Windows.

Как создать редактор простого текста на основе TRichViewEdit

Исключите все опции кроме текста из свойства 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: TRVOleDropEffectvar 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