Page 1 of 1

How to, set cell border in table (show, hide) ?

Posted: Tue Aug 12, 2014 2:54 pm
by Darken
Hello Sergey!

I'm insert table in RichViewEdit, and need set show or hide borders as MS Word. (I'm need use drop down list as Word)

var table: TRVTableItemInfo;
r, c: integer;
begin
table := TRVTableItemInfo.CreateEx(Y + 1, X + 1, RVE.RVData);

table.Color := clNone;
table.BorderStyle := rvtbColor;
table.CellBorderStyle := rvtbColor;

table.BorderColor := clBlack;
table.BorderWidth := 0;
table.BorderVSpacing := 0;
table.BorderHSpacing := 0;
table.CellBorderWidth := 1;
table.CellPadding := 2;
table.CellVSpacing := -1;
table.CellHSpacing := -1;
table.BestWidth := -100;

for r := 0 to table.Rows.Count-1 do
for c := 0 to table.Rows[r].Count-1 do
table.Cells[r,c].BestWidth := 100;

if RVE.InsertItem('', table) then begin
end;
end;


- How to recognize, keybord cursor in table cell? (IsCellSelected(Y, X) - does't work)
- How to hide left, right.. etc. border? but if hide all borders, not visible only in selection borders.

var
item: TCustomRVItemInfo;
table: TRVTableItemInfo;
Data: Integer;
rve_E: TCustomRichViewEdit;
ItemNo: Integer;
X, Y: integer;
begin

if not RVE.CanChange or
not RVE.GetCurrentItemEx(TRVTableItemInfo, rve_e, item) then
exit;


table := TRVTableItemInfo(item);
ItemNo := RVE_E.GetItemNo(table);
RVE_E.BeginItemModify(ItemNo, Data);

for Y := 0 to table.RowCount - 1 do
for X := 0 to table.ColCount - 1 do
begin
if table.IsCellSelected(Y, X) then begin
table.SetCellVisibleBorders(false, false, false, false, Y, X);
end;
end;

RVE_E.EndItemModify(ItemNo, Data);
RVE_E.Change;

rve.Format;


В двух словах на русском, добавить таблицу могу, границы тонкие тоже все ок. Дальше как в ворде нужно устанавливать, левую/правую границы по желанию пользователя, с этим моментом возникли проблемы.
- как определить что курсор в ячейке?, а выделить одну ячейку не очень получается;
- если выделена область в таблице, границы выключаются для всего диапазона выделенных ячеек, но внешние границы, в случае выше приведенного кода остаются, хотелось бы что бы и их можно было отключать;
- еще вопрос касательно границ, есть границы таблицы, а есть просто границы в тексте. Так вот выделяем какую то часть текста добавляем границы, добавляются сразу на всю строку (в ворде только выделенные слова)

ParaBorder.Top := true;
ParaBorder.Bottom := true;
ParaBorder.Right := true;
ParaBorder.Left := true;
rve.ApplyParaStyleConversion(PARA_BORDER);


procedure rveParaStyleConversion
PARA_BORDER:
begin
ParaInfo.Border.VisibleBorders.SetValues(
ParaBorder.Left,
ParaBorder.Top,
ParaBorder.Right,
ParaBorder.Bottom);
ParaInfo.Border.Width := 1;
ParaInfo.Border.Style := rvbSingle;
end;

при нажатии Энтер, происходит обвод границ новой строки (в ворде иначе, там расширяется граница).
По сути задача совместить границы что бы работали и для таблицы и для обычного текста работали корректно.

Заранее спасибо! (и извиняюсь за свой корявый английский)

Posted: Wed Aug 13, 2014 11:31 am
by Sergey Tkachenko
Keyboard in table cell:
For the table received from GetCurrentItemEx, call GetEditedCell.

TRichView tables have borders around each cell (you can change them using SetCellVisibleBorders) and a border around the table (SetTableVisibleBorders)

In MS Word, characters may have borders too, so it can apply borders to characters, paragraphs, cells (but it does not have a border around tables)
In TRichView, characters do not have borders, so you can apply them to paragraphs, cells and tables. However, styles of borders are different for paragraphs and for cells/tables.

Posted: Thu Aug 14, 2014 2:14 pm
by Darken
Thank you Sergey for quick answer.

But I have new question. When I'm select cell's of table (multiselect), how catch event? (when select complete).

OnCurTextStyleChanged - work only for non selected tables cells.

Maybe exist best desion for catch event, when user complete select cells in table?

Thank You!

(Повторюсь на русском. Есть таблица, в которой границы включены или выключены (отображение), и есть так же кнопки с помощью которых пользователь может эти самые границы включить или выключить (это делаю), но нужно еще что бы на этих кнопках корректно отображалось есть граница или нет, если одна ячейка OnCurTextStyleChanged и могу определить что в ячейке есть/нету границ. Но когда выделяю много ячеек, в это событие ничего не приходит, возможно есть лучшее решение?

Заранее спасибо! )

Posted: Thu Aug 14, 2014 6:58 pm
by Sergey Tkachenko
OnSelect occurs when the selection is changed - not necessary in tables, but in tables too