Avatar billede runem74 Nybegynder
28. juli 2003 - 22:26 Der er 9 kommentarer og
1 løsning

Marker en line i richedit

Hej,

Er der nogen der kender en effektive måde at marker en linie i en richedit eller memo når man klikker på den.

Position af linien kan findes med

memo1.CaretPos.y

men jeg kan ikke lige finde ud af at få den markeret.

Mange hilsner,

Rune
Avatar billede athlon-pascal Juniormester
28. juli 2003 - 22:29 #1
Brug SelStart og SelLength.
Avatar billede athlon-pascal Juniormester
28. juli 2003 - 22:30 #2
Avatar billede athlon-pascal Juniormester
28. juli 2003 - 22:36 #3
Det her er testet:
procedure TForm1.Memo1Click(Sender: TObject);
var
  LineNumber: Integer;
begin
  LineNumber := SendMessage(Memo1.Handle, EM_LINEFROMCHAR, Memo1.Selstart, 0);
  Memo1.SelStart := SendMessage(Memo1.Handle, EM_LINEINDEX, LineNumber, 0);
  Memo1.SelLength := Length(Memo1.Lines[LineNumber]);
end;
Avatar billede athlon-pascal Juniormester
28. juli 2003 - 22:42 #4
Overstående løsning virker kun med TMemo. Forklaring:
Da TRichEdit ikke har nogen OnClick-event, har jeg været lidt kreativ og brugt OnMouseUp:

procedure TForm1.RichEdit1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  LineNumber: Integer;
begin
  if Button = mbLeft then
  begin
    LineNumber := SendMessage(RichEdit1.Handle, EM_LINEFROMCHAR, RichEdit1.Selstart, 0);
    RichEdit1.SelStart := SendMessage(RichEdit1.Handle, EM_LINEINDEX, LineNumber, 0);
    RichEdit1.SelLength := Length(RichEdit1.Lines[LineNumber]);
  end;
end;
Avatar billede athlon-pascal Juniormester
28. juli 2003 - 22:54 #5
Vær dog opmærksom på at RichEdit-løsningen ødelægger dine muligheder for at markere almindeligt med musen.
Jeg ved ikke lige hvad der bedst løser dette problem.
Avatar billede athlon-pascal Juniormester
28. juli 2003 - 22:54 #6
Memo-løsningen gør faktisk det samme...
Avatar billede runem74 Nybegynder
28. juli 2003 - 22:57 #7
Mange tak. Det virker. Jeg ville egentlig have hele linien markert og ikke kun den del der indeholder tekst som for eksemple i en listbox.

Dit eksemple er et godt stykke af vejen så jeg acceptere.

Mange hilsner,

Rune

Rune
Avatar billede athlon-pascal Juniormester
28. juli 2003 - 23:07 #8
En løsning kan være at registrere ved OnMouseDown hvor markøren er, og hvis den så har flyttet sig for meget ved OnMouseUp, så kan du bare lade være med at markere den aktuelle linje.

Her er et eksempel med RichEdit:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    procedure RichEdit1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure RichEdit1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  EditCursorPos: TPoint;

implementation

{$R *.DFM}

procedure TForm1.RichEdit1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  LineNumber: Integer;
begin
  if Button = mbLeft then
    if ABS((EditCursorPos.x - X) + (EditCursorPos.y - y)) < 10 then //Du kan ændre 10 til hvad du har lyst til. Det er det der afgør hvor meget man kan rykke cursoren.
    begin
      LineNumber := SendMessage(RichEdit1.Handle, EM_LINEFROMCHAR, RichEdit1.Selstart, 0);
      RichEdit1.SelStart := SendMessage(RichEdit1.Handle, EM_LINEINDEX, LineNumber, 0);
      RichEdit1.SelLength := Length(RichEdit1.Lines[LineNumber]);
    end;
end;

procedure TForm1.RichEdit1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
    EditCursorPos := Point(X, Y);
end;

end.
Avatar billede athlon-pascal Juniormester
28. juli 2003 - 23:08 #9
Hvis der ikke er behov for normal markering med musen i dit program, så kan du glemme overstående og bruge den lidt mere simple kode jeg postede tidligere.
Avatar billede athlon-pascal Juniormester
28. juli 2003 - 23:11 #10
Hvis du vil markere hele linjen, så skal du til at tegne tingene selv. Det er vist ikke helt nemt i en TRichEdit/TMemo.
Du kan også bruge en tredje komponent som f.eks. SynEdit ( http://synedit.sf.net ).
Tak for points :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester