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

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

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

Примеры кода приведены для версии 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: 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;