Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Drag&drop en un richedit (https://www.clubdelphi.com/foros/showthread.php?t=26540)

RaulRuiz 26-10-2005 08:54:04

Drag&drop en un richedit
 
Hola, buenas.

Os comento: tengo un richedit donde el usuario puede introducir un texto y ahora quisiera añadir cierta funcionalidad: que se pueda hacer drag&drop de una cadena de texto desde un list hasta el memo.

El problema es que la única manera de posicionarme es tomar las coordenadas del caret. Es decir, si el cursor está posicionado en la última línea pero hago drop entre la primera y segunda palabra de la primera línea, en lugar de colocar el texto en esta última posición, se colocaría al final.

En el evento onmouseup tengo las coordenadas en pixels pero no sé como convertir esta información a "coordenadas" en caracteres.

¿A alguno de vosotros se le ocurre algo?
Gracias

dec 26-10-2005 09:18:16

Hola,

Creo que algo así puede conseguir lo que precisas, esto es, que el elemento de la lista (en este caso un "TListBox") se sitúe en el lugar en que esté en ese momento el cursor del "TRichEdit":

Código Delphi [-]
 procedure TForm1.rEditorDragDrop(Sender, Source: TObject; X, Y: Integer);
 var
   i: integer;
 begin
   if not (Source is TListBox) then Exit;
   i := (Source as TListBox).ItemIndex;
   (Sender as TRichEdit).SelText := (Source as TListBox).Items[i];
 end;
No digo yo que no pudiera mejorarse el asunto, que lo hize en un momento y sin mirar más allá posibles consecuencias, pero, en fin, creo que por ahí van los tiros, si no estoy confundido con lo que quieres llevar a cabo, ya digo.

RaulRuiz 26-10-2005 09:26:47

Gracias dec, pero me temo que aún no se soluciona el problema.

Si utilizo 'seltext', pasa lo que comentaba: el texto va a la posición donde está el cursor y no a la posición donde he soltado el ratón.

¿Más ideas, please?

dec 26-10-2005 09:41:01

Hola,


Cita:

Empezado por RaulRuiz
Si utilizo 'seltext', pasa lo que comentaba: el texto va a la posición donde está el cursor y no a la posición donde he soltado el ratón.

Así es la verdad. Pensaba que era justo lo necesario, pero, me doy cuenta ahora de que no es así. Debe haber alguna manera de hacer lo que precisas. Yo estoy haciendo alguna prueba, pero, no puedo garantizar una posible solución, claro está. :)

RaulRuiz 26-10-2005 09:56:33

Acabo de encontrarlo!!! (o al menos eso creo).

En delphi.about.com he encontrado un artículo: 'What's the word under the mouse cursor in a TRichedit' .

Tiene buena pinta.

Muchas gracias :p

dec 26-10-2005 10:32:58

Hola,

La solución, digna de estudio (creo yo), la encontré escrita por Thomas Stutz en su ejemplo: Drag & Drop items from a TListBox to a TRichEdit? ;)

Copio a continuación el código de Thomas Stutz por considerarlo merecido y útil:

Código Delphi [-]
 function RECharIndexByPos(RichEdit: TRichEdit; X, Y: Integer): Integer;
 var
   P: TPoint;
 begin
   P := Point(X, Y);
   Result := SendMessage(RichEdit.Handle, EM_CHARFROMPOS, 0, Longint(@P));
 end;
 
 
 procedure TForm1.RichEdit1DragOver(Sender, Source: TObject; X, Y: Integer;
   State: TDragState; var Accept: Boolean);
 var
   P: TPoint;
 begin
   // Check, if Source is ListBox1
   Accept := Source = ListBox1;
   if GetCursorPos(P) then
     with RichEdit1 do
     begin
       // Get the Index from Mouse Position
       P := ScreenToClient(P);
       SelStart := RECharIndexByPos(RichEdit1, P.X, P.Y);
       SetFocus;
     end;
 end;
 
 procedure TForm1.RichEdit1DragDrop(Sender, Source: TObject; X, Y: Integer);
 begin
   // finally insert text at mouse position
   RichEdit1.SelText := ListBox1.Items[ListBox1.ItemIndex];
 end;


La franja horaria es GMT +2. Ahora son las 16:04:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi