20-12-2016, Saat: 22:13
function GetPointPosition(Memo: TMemo; Pt: TPointF; RoundToWord: Boolean = False): TCaretPosition; var I, LPos: Integer; Rgn: TRegion; begin Result.Line := -1; Result.Pos := -1; for I := 0 to Memo.Lines.Count - 1 do begin if Memo.Lines.Objects[I] is TTextLayout then begin LPos := TTextLayout(Memo.Lines.Objects[I]).PositionAtPoint(Pt, RoundToWord); if LPos >= 0 then begin if LPos > 0 then begin Rgn := TTextLayout(Memo.Lines.Objects[I]).RegionForRange(TTextRange.Create(LPos, 1), RoundToWord); if (Length(Rgn) > 0) and (Rgn[0].Top > Pt.Y) then Dec(LPos); end; Result.Line := I; Result.Pos := LPos; Break; end; end; end; end;
xe2 de memo içerisinde verilen noktanın caretposition değerini almak mümkündü fakat sonrasında bu özelliği kaldırmışlar ama yerini neyle doldurmuşlar açıkcası ben bulamadım..
kendimce yöntemler denedim ama caret position değerini hızlı bi şekilde bulamıyorum ve klavyeyi kitliyor.. mousemove eventi içerisine şunları yazdım
try if memo2.Text.Length>0 then begin line := memo2.Lines.Count-1; pos := memo2.Lines[line].Length; posOK := false; memo2.CaretPosition := TCaretPosition.Create(line,(memo2.Lines[line].Length)); while not posok do begin if ((memo2.Caret.Pos.x> x)or(memo2.Caret.Pos.Y> Y))and (memo2.CaretPosition.Line+memo2.CaretPosition.Pos > 0)then memo2.CaretPosition:= TCaretPosition.Create(line,pos) else posok := true;// doğru caret position değerini buldu if (pos>0) and (not posok) then dec(pos) else if (line>0) and (not posok) then begin dec(line); pos:= memo2.Lines[line].Length; end else posOk:=True; // 0,0 olduğunda end; end; except on e : exception do memo1.Lines.Add(e.ToString); end;
Pozisyonu bulduruyorum ama hantal bi yöntem oldu.. konuyla ilgili denemesi olan arkadaşım oldumu?


son haliyle şu şekilde formun touch eventi içinde kullanıyorum