Page 1 of 1
How to determin, if selected text is inside a table cell?
Posted: Wed Oct 12, 2005 2:26 pm
by Bulvaye
Hello,
let me explain, what I'm going to do:
My RVEdit will load any RichText files with or w/o tables. Each document contains macro names like "{$name}", which will be replaced by the program with certain strings. So far so good.
Now, it's necessary to determin, if a specific macro name is inside a table cell or not. If it is inside a table cell, the whole table row should be duplicated instead of only relpacing the macro name with a text string.
So - How can I implement this feature? There are the following things to do for me (as far as I think):
1) Determin, if a text item (or the current selection or the caret) is inside a table cell.
2) Select and copy the whole row, this determinde cell belongs to
3) Inserting the copied row after this row.
Can anybody help me? Especially how to realize 1)
Thank you for any hints!
Posted: Wed Oct 12, 2005 2:34 pm
by Sergey Tkachenko
If you are really asking for the location of the SELECTED text, it's easy: the selected text is in the cell if table.InplaceEditor<>nil.
This table can be found by GetCurrentItemEx method, for example.
Saving row: table.SaveRowsToStream.
Loading row: InsertRows, then (undocumented) LoadFromStreamEx.
table.LoadFromStreamEx(Stream: TStream; StartRow: Integer);
StartRow - the top row where the stream content will be loaded.
Posted: Wed Oct 12, 2005 4:20 pm
by Bulvaye
Thank you, this hint helped me a lot!
Now, trying to replace the copied cell text with another string, I get some problems. The cell text is selected but inserting a new text, does not overwrite the selected cell text but inserts the new text to the top if the document. Have a look to my code, please:
Code: Select all
var Item: TCustomRVItemInfo;
RV: TCustomRichViewEdit;
Row, Col: Integer;
Stream: TStream;
begin
RVEdit.GetCurrentItemEx(TRVTableItemInfo, RV, Item);
if Item is TRVTableItemInfo then
begin
(Item as TRVTableItemInfo).GetEditedCell(Row, Col);
Stream := TMemoryStream.Create;
with Item as TRVTableItemInfo do
try
SaveRowsToStream(Stream, Row, 1);
InsertRowsBelow(1);
Stream.Position := 0;
LoadFromStreamEx(Stream, Row+1);
RV.Format;
Cells[Row+1, Col].SelectAll;
RV.InsertText('Sample Text');
finally
Stream.Free;
end;
end;
end;
What do I wrong?
Posted: Wed Oct 12, 2005 4:42 pm
by Sergey Tkachenko
Call Cells[Row+1, Col].Edit before Cells[Row+1, Col].SelectAll;
Calling cell.Edit is necessary in the editor before selecting in this cell.
Note 1: Calling BeginItemModify before SaveRowsToStream and EndItemModify may be faster than calling Format.
Note 2: Please call RV.ClearUndo after this code, because this code is a mix of viewer-style and editing-style methods, so it cannot be undone correctly.
Posted: Fri Oct 14, 2005 9:45 am
by Bulvaye
Thank you,
but how have I to call "BeginItemModify"? It's no member of the Item class itself. I found this method as member of the TCustomRichViewEdit, but what is the ItemNo of my "Item as TRVTableItemInfo" and what is the meaning of the var ModifyData?
Posted: Sat Oct 15, 2005 8:18 am
by Sergey Tkachenko
These are methods of RichViewEdit, not of the table class.
They must be called for the editor that directly contains the table (it is returned by GetCurrentItemEx, in RV in your code).
The purpose of BeginItemModify-EndItemModify is replacing Format.
They try to reformat only the table, not the whole document, so they are faster.
The meaning of the parameter is not so important. It is something calculated in BeginItemModify and used in EndItemModify for more efficient processing.