[Erledigt] TMemo Zeile selektieren bei OnMouseMove

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

[Erledigt] TMemo Zeile selektieren bei OnMouseMove

Beitrag von Frank Ranis »

Hallo ,

habe hier nen ollen Delphi-Code der nach Lazarus portiert werden soll.

Aufgabe :
Die Zeile unter der Maus soll selektiert werden .
Muß auch in Linux laufen .

Code: Alles auswählen

// Zeile unter Mauscursor markieren
procedure TForm1.Memo2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  Pt,i: integer;
  CharLineIndex: DWord;
  line:Integer;
  s:string;
begin
 Pt:=(X and $FFFF) or ((Y and $FFFF)shl 16);
 CharLineIndex:= SendMessage(Memo2.Handle,EM_CHARFROMPOS, 0, Pt); // <----- läuft nur unter Windows
 line:=(CharLineIndex shr 16) and $FFFF;
 s:=Memo2.Lines[line];
 i:=Pos(s, Memo2.Text);
 Memo2.SetFocus;
 Memo2.SelStart:=i-1;
 Memo2.SelLength:=Length(Memo2.Lines[line]);
end
 

Gruß

Frank
Zuletzt geändert von Frank Ranis am Fr 1. Mär 2019, 08:17, insgesamt 2-mal geändert.
www.flz-vortex.de

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: TMemo Zeile selektieren bei OnMouseMove

Beitrag von theo »

Schwierig. Vielleicht kann TSynEdit so etwas besser?

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: TMemo Zeile selektieren bei OnMouseMove

Beitrag von sstvmaster »

Hier mal mein Test dazu:

Code: Alles auswählen

procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  vFontHeight, vScrollPos, vSelectedLine, vLinePos: Integer;
begin
  // Fontgröße
  if Memo1.Font.Height > 0 then
    vFontHeight := Memo1.Font.Height
  else
    vFontHeight := Memo1.Font.GetTextHeight(Memo1.Text);
 
  // Position der Vertikalen Scrollbar als "Offset"
  vScrollPos    := Memo1.VertScrollBar.Position;
  // Selektierte Zeile (Y Pixel der Maus / Fontgröße) + Scroll Offset
  vSelectedLine := ( Y div vFontHeight ) + vScrollPos;
  { vLinePos
   Position des selktierten Textes
 
   !!! ACHTUNG !!!
   Das hat einen Nachteil, wenn der selbe Text mehrfach vorkommt
   dann springt die Selektion wieder an das erste vorkommen im Memo.
  }

  vLinePos        := Pos(Memo1.Lines[vSelectedLine], Memo1.Text);
  // Länge des Textes wo die Maus ist
  vLineLength     := Length(Memo1.Lines[vSelectedLine]);
 
  Memo1.SelStart  := vLinePos - 1;
  Memo1.SelLength := Length(Memo1.Lines[vSelectedLine]);
end;


Wie im Code kommentiert hat das ein paar macken. Vielleicht kann man das verbessern.
Bitte auch mal einer unter Linux/Mac testen, habe nur Windows.

LG Maik
Dateianhänge
MemoMouseMoveSelectLine.zip
(3.67 KiB) 129-mal heruntergeladen
Zuletzt geändert von sstvmaster am Do 28. Feb 2019, 15:06, insgesamt 4-mal geändert.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

Re: TMemo Zeile selektieren bei OnMouseMove

Beitrag von Frank Ranis »

Hi,

super Hilfe,
Jetzt habe ich ein paar Ansatzpunkte.

theo hat geschrieben:Schwierig. Vielleicht kann TSynEdit so etwas besser?


Habe ich mal geschaut , in Synedit gibt es PixelsToLogicalPos , damit könnte man an die Sache ranngehen.

Code: Alles auswählen

procedure TForm1.SynEdit1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var p,p1:tpoint;
    s:string;
begin
 p1.x:=x; p1.y:=y;
 p:=synedit1.PixelsToLogicalPos(p1);
 label3.caption:=inttostr(p.x)+' '+inttostr(p.y);
 s:=synedit1.Lines[p.y-1];
 label4.caption:=s;
end;     
 


Muß mich dann nur noch in die Machart von TsynEdit einarbeiten .

sstvmaster hat geschrieben:Hier mal mein Test dazu:

Code: Alles auswählen

procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  vFontHeight, vScrollPos, vSelectedLine, vLinePos: Integer;
begin
  // Fontgröße
  vFontHeight   := Memo1.Font.GetTextHeight(Memo1.Lines.Text);
  // Position der Vertikalen Scrollbar als "Offset"
  vScrollPos    := Memo1.VertScrollBar.Position;
  // Selektierte Zeile (Y Pixel der Maus / Fontgröße) + Scroll Offset
  vSelectedLine := ( Y div vFontHeight ) + vScrollPos;
  {
   Position des selktierten Textes
 
   !!! ACHTUNG !!!
   Das hat einen Nachteil, wenn der selbe Text mehrfach vorkommt
   dann springt die Selektion wieder an das erste vorkommen im Memo.
  }

  vLinePos        := Pos(Memo1.Lines[vSelectedLine], Memo1.Text);
  // Länge des Textes wo die Maus ist
  vLineLength     := Length(Memo1.Lines[vSelectedLine]);
 
  Memo1.SelStart  := vLinePos - 1;
  Memo1.SelLength := Length(Memo1.Lines[vSelectedLine]);
end;


Wie im Code kommentiert hat das ein paar macken. Vielleicht kann man das verbessern.
Bitte auch mal einer unter Linux/Mac testen, habe nur Windows.

LG Maik


Super Idee , damit probier ich auch noch mal .
Unter Linux läuft das auch , habe ich gerade ausprobiert , die Windows-Hürde wäre damit umschifft .
Und das Problem mit dem mehrfach finden eines Teiltextes bekomme ich sicher auch noch in den Griff.

Gruß

Frank
www.flz-vortex.de

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: TMemo Zeile selektieren bei OnMouseMove

Beitrag von sstvmaster »

Die GetTextHeight() Funktion scheint einen Bug zu haben es wird immer Texthöhe 16 Pixel ausgegeben.
Zuletzt geändert von sstvmaster am Do 28. Feb 2019, 18:35, insgesamt 1-mal geändert.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: TMemo Zeile selektieren bei OnMouseMove

Beitrag von sstvmaster »

Nochmal eine Änderung:

Code: Alles auswählen

 
...
var
  bmp: TBitmap;
...
  // Fontgröße
  bmp := TBitmap.Create;
  try
    bmp.Canvas.Font.Assign(Memo1.Font);
    vFontHeight := bmp.Canvas.TextHeight(Memo1.Text);
  finally
    bmp.Free;
  end;


Dynamische Berechnung der Fontgröße über Canvas.
Dateianhänge
MemoMouseMoveSelectLine2.zip
(4.03 KiB) 116-mal heruntergeladen
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

Re: TMemo Zeile selektieren bei OnMouseMove

Beitrag von Frank Ranis »

Hallo Maik,

danke für die Verbesserungen .

Das Thema ist für mich damit erst mal durch.

Gruß

Frank
www.flz-vortex.de

Antworten