Page 1 of 2

Samples to work with tables without rvActions

Posted: Tue Dec 07, 2010 7:06 pm
by Marsianin
I'm removing rvActions from my project and found some troubles with tables...

Is there any samples on how to detect if cursor is inside the table, adding/removing rows/cols, justifying etc.

I found almost everything in RichViewActions.pas but some things are not clear and working different.

Why I can't use table.DeleteSelectedRows directly?

Why there are a lot of Access Violations (not always and try...except helps) when starting to type letters in empty cells, removing rows/cols?

How to check if current item is a table?

Also with code from rvActions my toolbar DeleteCols/Rows buttons are enabled only if whole Col/Row is selected but in rvActions have cursor inside the table is enough.

Code: Select all

  rve:=TCustomRichViewEdit(RichViewEdit1.RVData.GetAbsoluteRootData.GetParentControl);
  if rve.GetCurrentItemEx(TRVTableItemInfo,rve,item) then begin
    table:=TRVTableItemInfo(item);
    boo:=True;          // We're inside the table, but it's not for 100%
    if table.GetNormalizedSelectionBounds(True,a,b,c,d) then begin
      if d=table.Rows.Count then bo1:=True;    //TrvActionTableDeleteCols
      if c=table.Rows[0].Count then bo2:=True; //TrvActionTableDeleteRows
    end;
    if table.CanMergeSelectedCells(True) then bo3:=True else bo4:=True;
  end;
What is TrvActionFillColor ?

Posted: Tue Dec 07, 2010 9:03 pm
by Sergey Tkachenko
For table operations, see the demo in
Editors\Editor 1, menu Table.

Info: http://www.trichview.com/help/idto_tabl ... tions.html

Posted: Thu Dec 09, 2010 6:43 am
by Marsianin
Thanks, I found the samples I need but still have some problems:

Why this code raises error with List Index Out of Bounds (-1) right after RichViewEdit1.Clear ?

Code: Select all

if RichViewEdit1.GetCurrentItemEx(TRVTableItemInfo,rve,item) then begin
...
I have this code on OnCurTextStyleChanged;

Also why RichViewEdit1..Clear fires OnCurTextStyleChanged a lot of times while clearing document?

Posted: Thu Dec 09, 2010 8:47 am
by Sergey Tkachenko
GetCurrentItemEx requires formatted document.
Add a check

Code: Select all

if RichViewEdit1.ItemCount=0 then
  exit;
Multiple calls? Probably Clear calls it once (or more than once, if the caret was in a table), then Format can call it.

The proper place to update UI for tables is OnCaretMove event.

Posted: Thu Dec 09, 2010 7:24 pm
by Marsianin
Tried if RichViewEdit1.ItemCount=0 then exit; already. Didn't help.
Will try to move updating table UI to OnCaretMove.

Posted: Fri Dec 10, 2010 8:22 am
by Marsianin
Ok, moved it to OnCaretMove and it works.
But still have some troubles:

1. How to find out if current cell can be splitted to original cells to enable/disable corresponding RadioButton (as in rvActions dialog).

2. How to find out if I split to original cols/rows is allowed to enable/disable corresponding CheckBoxes.

3. This code fires List Index Out Of Bound (-1) for 6-7 times but finally merges cells:

Code: Select all

      rve.BeginItemModify(ItemNo,Data);
      begin  // Merge cells
        rve.BeginUndoGroup(rvutModifyItem);
        rve.SetUndoGroupMode(True);
        try
          boo:=table.GetNormalizedSelectionBounds(True,r,c,cs,rs);
          table.MergeSelectedCells(True);
          table.DeleteEmptyRows;
          table.DeleteEmptyCols;
          if boo then table.Select(r,c,0,0);
        finally
          rve.SetUndoGroupMode(False);
        end;
      end;
      rve.EndItemModify(ItemNo,Data); <<<<< ERROR APPEARS HERE

Posted: Fri Dec 10, 2010 9:27 am
by Sergey Tkachenko
As for disabling/enabling UI for table operations, see the same demo, TForm1.mpdTableClick.

As for the error, please give me step-by-step instructions how to reproduce.

Posted: Fri Dec 10, 2010 3:34 pm
by Marsianin
That demo contains different menu items than demo with rvActions and there is no Split Cells dialog there.

Posted: Fri Dec 10, 2010 6:19 pm
by Sergey Tkachenko
This demo does not have this dialog, but its commands are implemented as menu items:
Table | Split submenu
Table | Unmerge submenu

Posted: Tue Dec 14, 2010 7:55 am
by Marsianin
Unmerge menu items are always enabled even if there is nothing to unmerge.
Sample from rvActions works but I'm getting access violation running this code right after using table.UnmergeSelectedCells(CheckBox3.Checked,CheckBox2.Checked):

Code: Select all

  boo:=table.GetNormalizedSelectionBounds(True,r,c,cs,rs);
  if boo then begin
    bo1:=table.CanMergeSelectedCells(True);
    bo2:=(table.CanMergeSelectedCells(True)or(table.GetEditedCell(r,c)<>nil));
    table.Rows.GetMainCell(r,c,r,c);
    SplitCellsOrig := (cs = table.Cells[r,c].ColSpan) and
                            (rs = table.Cells[r,c].RowSpan);
    SplitCellsOrig := SplitCellsOrig or table.CanMergeSelectedCells(True);
  end;
Another problem appeared when I moved UptadeToolbarUI routine to rveOnCaretMove because while modifying table that event occurred. But this fixed with a simple flag.
Nut after table manipulations I have to update toolbars and calling rveCaretMove(self) raises access violation in table.Rows.GetMainCell(r,c,r,c); in the code above.

Posted: Tue Dec 14, 2010 2:09 pm
by Sergey Tkachenko
Please send me a simple project to reproduce this problem.

Posted: Thu Dec 23, 2010 11:16 pm
by Marsianin
My project is not simple.

But I think that problematic code fires some event which cannot be processed on that stage. I'm going to study it.

Maybe you can help me to check what events fires this code from rvActions?

Posted: Fri Dec 24, 2010 4:59 pm
by Sergey Tkachenko
Find the line of TRichView code that raises the exception, and a call stack at the moment of the exception.

Posted: Mon Dec 27, 2010 12:42 am
by Marsianin
It seems I found a bug with tables in the latest RichViewEdit.
To reproduce:

1. Open RichViewEdit Editor Demo 1
2. Insert Table Example 2
3. Delete text and button
4. Unmerge (rows and cols) that cell were was a button
5. You'll get a clear 6x10 table
6. Select full rows beginning from 2 to 7, merge them
7. Try to unmerge just merged cells with original rows and cols
8. Original amount of rows is lost

P.S. Found an event which produced error while splitting cells to original rows/cols but still sometimes I'm getting Accss Violation splitting cells and debugger doesn't stops - just popup message (in debug configuration of course)

Posted: Mon Dec 27, 2010 8:15 am
by Sergey Tkachenko
1) You can see that the demo calls table.DeleteUnusedCols and table.DeleteUnusedRows after cell merging. These methods delete "ghost" columns and rows (consisting only of nil-cells). Such columns/rows could confuse the user. However, as you can see, the number of columns/rows is changed.

2) Sorry, without knowing your code I cannot help. If you will be able to reproduce on trichview demos, or if you can create a simple project reproducing this problem, let me know.