3

フォームにTSynEditコントロールがあり、フォーカスされたノード テキストをTVirtualStringTreeからドラッグ アンド ドロップしたいと考えています。強調表示されたテキストをTSynEditコントロール内でドラッグ アンド ドロップしたときと同じように動作するようにしたいと思います。

  • TSynEditをドラッグすると、キャレットが現在のドロップ位置をマークするはずです。
  • テキストがドロップされると、現在強調表示されているテキストが置き換えられます。
  • ドロップ位置はタブを正しく処理する必要があります。

TSynEditの DragOverイベントのコードを確認しましたが、 privateと宣言されているため、子孫クラスでアクセスできないいくつかの変数とプロシージャが使用されています。

すべてのTSynEditデモを確認しましたが、私のニーズに対応するデモが見つかりません。

これを成功させた人はいますか?

4

2 に答える 2

2

AZ01の答えは、私が望んでいたものとまったく同じではありませんでしたが、正しい方向に向けてくれました. 最終的に使用したコードは次のとおりです。

procedure TfrmTemplateEdit.memTemplateDragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  InsertText: String;
  ASynEdit: TSynEdit;
  OldSelStart, DropIndex: Integer;
  LCoord: TBufferCoord;
begin
  // Set the Insert Text
  InsertText := 'The text to insert';

  // Set the SynEdit memo
  ASynEdit := TSynEdit(Sender);

  // Get the position on the mouse
  ASynEdit.GetPositionOfMouse(LCoord);

  // Find the index of the mouse position
  DropIndex := ASynEdit.RowColToCharIndex(LCoord);

  // Delete any selected text
  If (ASynEdit.SelAvail) and
     (DropIndex >= ASynEdit.SelStart) and
     (DropIndex <= ASynEdit.SelEnd) then
  begin
    // Store the old selection start
    OldSelStart := ASynEdit.SelStart;

    // Delete the text
    ASynEdit.ExecuteCommand(ecDeleteChar, #0, Nil);

    // Move the caret
    ASynEdit.SelStart := OldSelStart;
  end
  else
  begin
    // Position the caret at the mouse location
    ASynEdit.CaretXY := LCoord;
  end;

  // Insert the text into the memo
  ASynEdit.ExecuteCommand(ecImeStr, #0, PWideChar(InsertText));

  // Set the selection start and end points to selected the dropped text
  ASynEdit.SelStart := ASynEdit.SelStart - length(InsertText);
  ASynEdit.SelEnd := ASynEdit.SelStart + length(InsertText);

  // Set the focus to the SynEdit
  ASynEdit.SetFocus;
end;

コードは、選択、タブ、および取り消しで正しく機能するようです。

于 2012-06-27T11:13:51.717 に答える
1

DragOver/DragDrop という 2 つのイベントをエディターに割り当てることで、なんとか目標を達成できると思います。

1/ DragOver イベントで有効性をテストし、 GetPositionOfMouseを呼び出してキャレットも移動します

Procedure TForm1.EditorDragOver(Sender,Source: TObject;X,Y: Integer; State: TDragState; Var Accept: Boolean);
Var
  LCoord: TBufferCoord;
  LMemo: TSynMemo;
Begin
  LMemo := TSynMemo(Sender);
  // In your case you would rather test something with your tree...
  Accept := Clipboard.AsText <> '';
  // "As you drag over the TSynEdit, the caret should mark the current drop position": OK
  If LMemo.GetPositionOfMouse(LCoord) Then
    LMemo.CaretXY := LCoord;
End;

2/ DragDrop イベントでエディター コマンドを使用して、選択をクリアし、文字を挿入します。

Procedure TForm1.EditorDragDrop(Sender, Source: TObject; X,Y: Integer);
Var
  LMemo: TSynMemo;
Begin
  LMemo := TSynMemo(Sender);
  // "When the text is dropped, it should replace any text that is currently highlighted." : OK
  If LMemo.SelAvail Then
    LMemo.ExecuteCommand( ecDeleteChar , #0, Nil );
  // Paste, same comment as previously, here it's just an example...
  LMemo.ExecuteCommand( ecPaste, #0, Nil );
End;

これは、コンテキストに応じて少し調整する必要があります。

于 2012-06-19T15:15:05.277 に答える