[Erledigt] TMemo Zeile selektieren bei OnMouseMove

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

[Erledigt] TMemo Zeile selektieren bei OnMouseMove

Beitragvon Frank Ranis » 28. Feb 2019, 10:25 [Erledigt] TMemo Zeile selektieren bei OnMouseMove

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 1. Mär 2019, 08:17, insgesamt 2-mal geändert.
www.flz-vortex.de
Frank Ranis
 
Beiträge: 141
Registriert: 24. Jan 2013, 21:22
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon theo » 28. Feb 2019, 12:32 Re: TMemo Zeile selektieren bei OnMouseMove

Schwierig. Vielleicht kann TSynEdit so etwas besser?
theo
 
Beiträge: 8166
Registriert: 11. Sep 2006, 18:01

Beitragvon sstvmaster » 28. Feb 2019, 13:29 Re: TMemo Zeile selektieren bei OnMouseMove

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
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von sstvmaster am 28. Feb 2019, 15:06, insgesamt 4-mal geändert.
sstvmaster
 
Beiträge: 196
Registriert: 22. Okt 2016, 22:12
Wohnort: Dresden
OS, Lazarus, FPC: Windows 7 32bit (L 2.0.2 FPC 3.0.4) | 
CPU-Target: 32Bit
Nach oben

Beitragvon Frank Ranis » 28. Feb 2019, 14:09 Re: TMemo Zeile selektieren bei OnMouseMove

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
Frank Ranis
 
Beiträge: 141
Registriert: 24. Jan 2013, 21:22
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon sstvmaster » 28. Feb 2019, 14:25 Re: TMemo Zeile selektieren bei OnMouseMove

Die GetTextHeight() Funktion scheint einen Bug zu haben es wird immer Texthöhe 16 Pixel ausgegeben.
Zuletzt geändert von sstvmaster am 28. Feb 2019, 18:35, insgesamt 1-mal geändert.
sstvmaster
 
Beiträge: 196
Registriert: 22. Okt 2016, 22:12
Wohnort: Dresden
OS, Lazarus, FPC: Windows 7 32bit (L 2.0.2 FPC 3.0.4) | 
CPU-Target: 32Bit
Nach oben

Beitragvon sstvmaster » 28. Feb 2019, 18:34 Re: TMemo Zeile selektieren bei OnMouseMove

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
sstvmaster
 
Beiträge: 196
Registriert: 22. Okt 2016, 22:12
Wohnort: Dresden
OS, Lazarus, FPC: Windows 7 32bit (L 2.0.2 FPC 3.0.4) | 
CPU-Target: 32Bit
Nach oben

Beitragvon Frank Ranis » 1. Mär 2019, 08:15 Re: TMemo Zeile selektieren bei OnMouseMove

Hallo Maik,

danke für die Verbesserungen .

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

Gruß

Frank
www.flz-vortex.de
Frank Ranis
 
Beiträge: 141
Registriert: 24. Jan 2013, 21:22
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried