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