Page 1 of 1

Entering text and seeking information

Posted: Mon Apr 11, 2011 6:39 pm
by Ceprotec
Hello Sergey.
Everything good?

I'm having a hard time and need your help. First explain what happens. Srichviewedit I use as a component for printing from a register, or seek information from a database and insert the srichview in the form of a text, ok. So I need to know:

1) What is the position of the last valid character (blank space can not count) in row and column?
2) How many characters still fit within that page?
3) How many lines there are still empty from the last character to the end of the page?
4) How to get text input from the line (x) and column (y)?

I need these data apart from the cursor position. I need this information in time for the automatic insertion of text in srichviewedit.

Why is this .. I will use a method where I will give a "InsertText" from "x" and "y " and need to know how many characters can I enter to the final page.

Thank you for listening.
Graciously Ceprotec.

Posted: Tue Apr 12, 2011 11:25 am
by Sergey Tkachenko
I am afraid these questions cannot be answered.
Each character has different width (unless you use a monospace font), so you cannot tell how many characters will fit.
Lines can have different heights as well.

Posted: Wed Apr 13, 2011 4:24 pm
by Ceprotec
Ok so let's go party.
1) You can find the position of the last valid character?

Posted: Wed Apr 13, 2011 4:57 pm
by Sergey Tkachenko
Do you need a position as Line, Column?

What if the document is ended with a picture, should I ignore it and process text before it?
What is the last character is a table? In this case, Line/Column does not make too much sense. Or should I ignore this table as well?

Posted: Wed Apr 13, 2011 5:21 pm
by Ceprotec
Yes, I need the position in row / column. You can skip images, and tables because at the time table will not have nor images, text only.

Posted: Wed Apr 13, 2011 5:40 pm
by Sergey Tkachenko

Code: Select all

var i, j, l, c: Integer;
    rve: TCustomRichViewEdit;
    s: String;
begin
  rve := SRichViewEdit1.RichViewEdit;
  for i := rve.ItemCount-1 downto 0 do
    if (rve.GetItemStyle(i)>=0) then begin
      s := rve.GetItemText(i);
      for j := Length(s) downto 1 do
        if s[j]<>' ' then begin
          rve.SetSelectionBounds(i, j, i, j);
          rve.GetCurrentLineCol(l, c);
          Caption := Format('(%d %d)', [l, c]);
          exit;
        end;
    end;
  Caption := 'no characters';
end;
This code returns the global line, not the line on the page.
It moves the caret before this character. If you need version without moving the caret, let me know.

Posted: Wed Apr 13, 2011 6:42 pm
by Ceprotec
Ok I got with this formula. Thanks.
Now the next step.

2) How to insert text from a line (l) and column (c)?

Posted: Thu Apr 14, 2011 9:55 am
by Sergey Tkachenko
I can write this function, but it would require using some undocumented methods.
But do you really need using (line, column) kind of coordinates for defining position in the document? They are not native for TRichViewEdit/TSRichViewEdit, so using them require additional efforts that better to be avoided.

The most simple and efficient for TRichViewEdit is using (Item index, offset in item) pair of coordinate.
Or there are functions allowing working with "position from the beginning" coordinate (i.e. richedit-like SelStart).

Posted: Thu Apr 14, 2011 11:25 am
by Ceprotec
Actually I only need the line, it will always be in column 0 (zero).
Example:

With the formula above I know that line is the last character. Now I need a formula to insert text from the line (l). Like a InsertText ('', l). Would do that?

That also would direct the cursor to the line (l) / column (c) and use a InsertText () normal.

Posted: Thu Apr 14, 2011 12:23 pm
by Sergey Tkachenko
Lines depend on word wrapping. When you insert something at the beginning of line that is not the beginning of paragraph, this line may be wrapped differently. You may insert at the beginning of line, but after the insertion it may become not a beginning.
Are you sure that you mean "lines", not "paragraphs"?

Posted: Thu Apr 14, 2011 2:15 pm
by Ceprotec
Yesterday you gave me a formula that took the position of the last character, right?
Suppose that the last character is on the line ( 18 ) and column ( 58 ), right?
so I need a command that will insert a string line (19) and column (0), which would be the beginning of the paragraph within the margin set, for example.

Posted: Thu Apr 14, 2011 4:06 pm
by Sergey Tkachenko
Than function returns the position of the last non-space character. So there may be some lines after this line (empty text or spaces, or pictures), or may be not.
So, in your example, the line #19 may exist or may not exist.

Ok, below is the function that works in all cases:

Code: Select all

uses DLines;
procedure GoToLine(LineNo: Integer; rve: TCustomRichViewEdit);
var i: Integer;
begin
  // moving before existing line, if possible
  for i := 0 to rve.RVData.DrawItems.Count-1 do
    if rve.RVData.DrawItems[i].FromNewLine then begin
      dec(LineNo);
      if LineNo=0 then begin
        rve.SetSelectionBounds(rve.RVData.DrawItems[i].ItemNo,
          rve.RVData.DrawItems[i].Offs,
          rve.RVData.DrawItems[i].ItemNo,
          rve.RVData.DrawItems[i].Offs);
        exit;
      end;
    end;
  // adding new lines
  i := rve.ItemCount-1;
  rve.SetSelectionBounds(i, rve.GetOffsAfterItem(i), i, rve.GetOffsAfterItem(i));
  while LineNo>0 do begin
    rve.InsertText(#13#10);
    dec(LineNo);
  end;
end;
...
GoToLine(SRichViewEdit1.RichViewEdit, 19);
SRichViewEdit1.RichViewEdit.InsertText('Hi!');


Posted: Thu Apr 14, 2011 7:25 pm
by Ceprotec
Thank you Sergey, was exactly what I needed. Thanks.
:D :P :o