Change some tables' order(sequence)

General TRichView support forum. Please post your questions here
Post Reply
wolf1860
Posts: 118
Joined: Sat Nov 21, 2015 2:04 am

Change some tables' order(sequence)

Post 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:)
Sergey Tkachenko
Site Admin
Posts: 17559
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Change some tables' order(sequence)

Post 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;

wolf1860
Posts: 118
Joined: Sat Nov 21, 2015 2:04 am

Re: Change some tables' order(sequence)

Post by wolf1860 »

Thanks a lot!
wolf1860
Posts: 118
Joined: Sat Nov 21, 2015 2:04 am

Re: Change some tables' order(sequence)

Post 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:)
Sergey Tkachenko
Site Admin
Posts: 17559
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Change some tables' order(sequence)

Post 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.
Sergey Tkachenko
Site Admin
Posts: 17559
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Change some tables' order(sequence)

Post 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;
Post Reply