On 04/04/2011 19:59, Martin wrote:
On 04/04/2011 17:23, patspiper wrote:
On 04/04/2011 06:47 PM, Martin wrote:

but what about using LogicalCaretXY, then getting the line, and reading it?

possible subtracting the length of CurrentString.
I am almost there (by giving it another shot at the ide sources):

  Line:=SynEdit1.LineText;
  p1:=SynEdit1.LogicalCaretXY;
  if (p1.x>length(Line)+1) or (Line='') then exit;
  SynEdit1.GetWordBoundsAtRowCol(p1, x1, x2);
  // There must be a saner way than subtracting 2
  p1.x := x1-2;
  SynEdit1.GetWordBoundsAtRowCol(p1, x1, x2);
  WordToken := copy(Line, x1, x2);

However, what is the correct way to go back to the previous token? Subtracting 2 is not the way.

The caret is at the end of currentstring.
So your dot should be 1 before. But if you allow spaces after the dot, then it can be anything before..., and maybe you even allow it on the previous line?

Note that LogicalCaret is 1 based, and 1 is before the first char.
Also you must use LogicalCaret, normal Caret will not work if there are multybyte chars, or tabs.
- LogicalCaret: BYTE (not char) pos in text
-Caret (sometime PhysicalCaret): screenpos, a tab is one byte in the text, but may be 4 chars on the screen // an a-umlaut is 2 bytes in the text, but 1 on the screen)

If your line is
ABC.def
And the caret is between the A and B, then LogicalCaret.X = 2 (1 would be before the A)

So if you are behind the "def" LC.x = 8
x := LC.x - len(CurrentString);

makes x = 8 - 3 = 5
LineString[5] = 'd'

so you need to subtract another one to see the char before currentstring
x:= LC.x-length(CurrentString)

x:= LC.x-length(CurrentString)  -1


somehow the -1 got lost
while (x> 1) and (linestring[x] in[#32,#9]) do dec(x);

Now you should be on the first none space, before the currentstring....

and so on,
It all depends on what you believe a word/token is, what are the boundaries...

You can look at GetWordBoundsAtRowCol....

maybe it expects to be NOT at the end of the word, so by substracting one more (-2) you get into the middle (or to the start) of the word???

Not sure, haven't looked at






--
_______________________________________________
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


--
_______________________________________________
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to