Page 1 of 1

Change some tables' order(sequence)

Posted: Mon May 30, 2022 9:21 am
by wolf1860
There are many tables(TRVTableItemInfo) in a rvf file,I want to change some tables' order ,Have u any better ways than cut/paste?
I want to change the table item's style such as changing the table's outline color/border when the mouse over or click the table area,can u give me some ideas or some codes?

Thank u:)

Re: Change some tables' order(sequence)

Posted: Mon May 30, 2022 10:41 am
by Sergey Tkachenko
1. Unless you implement something special in your code, user can reorder items only by cut&paste.
For reordering table rows, there is a "Sort" command in RichViewActions.

2. Changing table border color below the mouse pointer is not a standard feature.
You can change colors in OnMouseMove event.
Here is an example of changing border color to clRed below the mouse pointer.
The code assumes that it is called for RichViewEdit1
(there is one line that refers to it: RichViewEdit1.RefreshAll;)

The following fields must be added to the Form:
HighlightedTable: TRVTableItemInfo;
StoredBorderColor: TColor;
StoredBorderStyle: TRVTableBorderStyle;

Code: Select all

// Sets undo recording off (if Value=0)/ on (if Value=-1)
procedure SetUndoLimit(Ctrl: TObject; Value: Integer);
begin
  if Ctrl is TCustomRichViewEdit then
    TCustomRichViewEdit(Ctrl).UndoLimit := Value;
end;

procedure TForm3.RichViewEdit1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  RVData: TCustomRVFormattedData;
  Pt: TPoint;
  ItemNo, Offs: Integer;
  Table: TRVTableItemInfo;
  Changed: Boolean;
begin
  // getting table below the mouse pointer
  Pt := TCustomRichViewEdit(Sender).ClientToDocument(Point(X, Y));
  Table := nil;
  TCustomRichViewEdit(Sender).GetItemAt(Pt.X, Pt.Y, RVData, ItemNo, Offs, False);
  if RVData.GetItem(ItemNo) is TRVTableItemInfo then
    Table := TRVTableItemInfo(RVData.GetItem(ItemNo))
  else if RVData.GetSourceRVData is TRVTableCellData then
    Table := TRVTableCellData(RVData.GetSourceRVData).GetTable;
  // assigning HighlightedTable and changing its BorderColor
  Changed := False;
  if (HighlightedTable <> nil) and (HighlightedTable <> Table) then
  begin
    SetUndoLimit(Sender, 0);
    HighlightedTable.BorderColor := StoredBorderColor;
    HighlightedTable.BorderStyle := StoredBorderStyle;
    SetUndoLimit(Sender, -1);
    Changed := True;
  end;
  if (Table <> nil) and (HighlightedTable <> Table) then
  begin
    StoredBorderColor := Table.BorderColor;
    StoredBorderStyle := Table.BorderStyle;
    SetUndoLimit(Sender, 0);
    Table.BorderStyle := rvtbColor;
    Table.BorderColor := clRed;
    SetUndoLimit(Sender, -1);
    Changed := True;
  end;
  HighlightedTable := Table;
  if Changed then
    RichViewEdit1.RefreshAll;
end;

procedure TForm3.RichViewEdit1ItemAction(Sender: TCustomRichView;
  ItemAction: TRVItemAction; Item: TCustomRVItemInfo;
  var Text: TRVUnicodeString; RVData: TCustomRVData);
begin
  case ItemAction of
    rviaDestroying, rviaMovingToUndoList:
      if Item = HighlightedTable then
        HighlightedTable := nil;
  end;
end;


Re: Change some tables' order(sequence)

Posted: Mon May 30, 2022 2:39 pm
by wolf1860
Thanks a lot!

Re: Change some tables' order(sequence)

Posted: Tue May 31, 2022 9:34 am
by wolf1860
The onMouseMove event raise exception at "Pt := TCustomRichViewEdit(Sender).ClientToDocument(Point(X, Y));",My TSRichViewEdit is in a frame,maybe that's the reason for "access violation" exception? Trace the code step by step to the method" TCustomRichView.ClientToDocument", the first line can not pass:)

Re: Change some tables' order(sequence)

Posted: Tue May 31, 2022 3:10 pm
by Sergey Tkachenko
The code for ScaleRichView is a bit different.
For example, in OnMouseMove event, the Sender parameter is TSRichViewEdit, so typecasting it to TRichViewEdit leads to an exception.
Also, the methods for hit testing are different.
I'll create a code for ScaleRichView tomorrow.

Re: Change some tables' order(sequence)

Posted: Sat Jun 04, 2022 2:14 pm
by Sergey Tkachenko
Here is the code for ScaleRichView.
As you can see, it's almost the same, the difference is only in finding the item below the mouse pointer.

The following fields must be added to the Form:
HighlightedTable: TRVTableItemInfo;
StoredBorderColor: TColor;
StoredBorderStyle: TRVTableBorderStyle;

Code: Select all

// Sets undo recording off (if Value=0)/ on (if Value=-1)
procedure SetUndoLimit(Ctrl: TObject; Value: Integer);
begin
  if Ctrl is TCustomRichViewEdit then
    TCustomRichViewEdit(Ctrl).UndoLimit := Value;
end;

procedure TfrmMain.SRichViewEdit1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  pt: TPoint;
  SRV: TSRichViewEdit;
  RVData: TCustomRVFormattedData;
  InPageArea, InLeftArea, InTextArea: Boolean;
  ItemNo, Offs: Integer;
  Table: TRVTableItemInfo;
  Changed: Boolean;
begin
  SRV := (Sender as TSRichViewEdit);
  pt := SRV.ConvertSRVtoRV(Point(X, Y), InTextArea, InLeftArea, InPageArea);
  if not InTextArea then
    exit;
  pt := SRV.ActiveEditor.ClientToDocument(pt);
  SRV.ActiveEditor.GetItemAt(pt.X, pt.Y, RVData, ItemNo, Offs, False);
  Table := nil;
  if RVData.GetItem(ItemNo) is TRVTableItemInfo then
    Table := TRVTableItemInfo(RVData.GetItem(ItemNo))
  else if RVData.GetSourceRVData is TRVTableCellData then
    Table := TRVTableCellData(RVData.GetSourceRVData).GetTable;
  // assigning HighlightedTable and changing its BorderColor
  Changed := False;
  if (HighlightedTable <> nil) and (HighlightedTable <> Table) then
  begin
    SetUndoLimit(SRV.ActiveEditor, 0);
    HighlightedTable.BorderColor := StoredBorderColor;
    HighlightedTable.BorderStyle := StoredBorderStyle;
    SetUndoLimit(SRV.ActiveEditor, -1);
    Changed := True;
  end;
  if (Table <> nil) and (HighlightedTable <> Table) then
  begin
    StoredBorderColor := Table.BorderColor;
    StoredBorderStyle := Table.BorderStyle;
    SetUndoLimit(SRV.ActiveEditor, 0);
    Table.BorderStyle := rvtbColor;
    Table.BorderColor := clRed;
    SetUndoLimit(SRV.ActiveEditor, -1);
    Changed := True;
  end;
  HighlightedTable := Table;
  if Changed then
    SRV.ActiveEditor.Repaint;
end;

procedure TfrmMain.SRichViewEdit1ItemAction(Sender: TCustomRichView;
  ItemAction: TRVItemAction; Item: TCustomRVItemInfo;
  var Text: TRVUnicodeString; RVData: TCustomRVData);
begin
  case ItemAction of
    rviaDestroying, rviaMovingToUndoList:
      if Item = HighlightedTable then
        HighlightedTable := nil;
  end;
end;