![]() |
Text markieren und dann per Drag and Drop verschieben
Irgendwie steck ich fest...Wie funktioniert die "Markieren und verschieben" - Funktion die überall in Windows Standardmäßig funktioniert?
Also in einem Form mit 2 TEdit Komponenten, bei einem Edit wird ein Teil des Textes markiert (mit der Maus oder mit der Tastatur), dann wird auf die Markierung geklickt und per Drag and Drop ins 2. Edit Feld verschoben. Alle meine Lösungsansätze scheitern irgendwie und jetzt weiss ich nimma weiter :( Kann mir da wer helfen? (Beim angehängten Code funktioniert das Drag "nicht immer"...is zwar schon nah dran aber zufrieden bin ich damit noch nicht :( )
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, StrUtils, Buttons, ExtCtrls, Math; type TfrmDragDrop = class(TForm) btnClose: TButton; edtDrag1: TEdit; edtDrag2: TEdit; procedure btnCloseClick(Sender: TObject); procedure edtDrag1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); procedure edtDrag2DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure edtDrag2DragDrop(Sender, Source: TObject; X, Y: Integer); procedure edtDrag1StartDrag(Sender: TObject; var DragObject: TDragObject); procedure edtDrag1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } SelectedStart, SelectedEnd: Integer; InDragMode: Boolean; public { Public declarations } end; var frmDragDrop: TfrmDragDrop; implementation {$R *.dfm} procedure TfrmDragDrop.edtDrag1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var CursorPos: integer; begin CursorPos := edtDrag1.Perform(EM_CHARFROMPOS, 0, X); // Cursorstelle if InDragMode then edtDrag1.EndDrag(False); if (CursorPos >= SelectedStart) and (CursorPos <= SelectedEnd) then if InDragMode then InDragMode := False else begin InDragMode := True; edtDrag1.BeginDrag(False, 10); end; end; procedure TfrmDragDrop.edtDrag1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if not InDragMode then begin SelectedStart := edtDrag1.SelStart; SelectedEnd := SelectedStart + edtDrag1.SelLength; end; end; procedure TfrmDragDrop.edtDrag1StartDrag(Sender: TObject; var DragObject: TDragObject); begin EdtDrag1.SelStart := SelectedStart; EdtDrag1.SelLength := SelectedEnd - SelectedStart; InDragMode := True; end; procedure TfrmDragDrop.edtDrag2DragDrop(Sender, Source: TObject; X, Y: Integer); begin EdtDrag2.Text := EdtDrag1.SelText; end; procedure TfrmDragDrop.edtDrag2DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := True; end; procedure TfrmDragDrop.FormCreate(Sender: TObject); begin SelectedStart := -1; SelectedEnd := -1; InDragMode := False; end; procedure TfrmDragDrop.btnCloseClick(Sender: TObject); begin Close; end; end. |
Re: Text markieren und dann per Drag and Drop verschieben
Bin ich tatsächlich der Einzige der sowas jemals versucht/gebraucht hat :cry:
|
Re: Text markieren und dann per Drag and Drop verschieben
Moin,
ich hab' Deinen Code mal in ein leeres Projekt getan und der funktioniert erstmal. Ob ich das so gelöst hätte, kann ich noch nicht sagen. Was geht denn nicht? Grüße, Messie |
Re: Text markieren und dann per Drag and Drop verschieben
-Wenn der komplette Text in edtDrag1 markiert wird kann man nix anderes mehr markieren und diese Markierung nicht mehr los werden (Es sei denn man schreibt einen neuen Text oder verschiebt die Markierung ;) )
-Tastatureingaben sind nicht berücksichtigt -Markierter Text kann genau einmal verschoben werden -Wenn ein Text markiert wird aber nicht verschoben sondern ein anderer Teil des Textes wiederum markiert kann der nicht verschoben werden ist mir jetzt mal auf die Schnelle aufgefallen :) Dachte evtl. geht das ganze auch einfacher/schneller oder ist auch schon vorgefertigt da "markieren-und-verschieben" ja eigentlich eine Standard-Windows-Funktion ist. |
Re: Text markieren und dann per Drag and Drop verschieben
|
Re: Text markieren und dann per Drag and Drop verschieben
Zitat:
Ich hatte gleich eine kleine Ergänzung eingebaut
Delphi-Quellcode:
Damit ist der Focus dort, wo man weiterarbeiten will und man kann danach wieder beliebig ins edtDrag1 zurückgehen und dort neue Dinge tun.
procedure TfrmDragDrop.edtDrag2DragDrop(Sender, Source: TObject; X, Y: Integer);
begin EdtDrag2.Text := EdtDrag1.SelText; EdtDrag2.SetFocus; EdtDrag1.SelStart := 0; EdtDrag1.SelLength := 0; end; Grüße, Messie |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz