Page 1 of 2

RichViewActions, how to get the executing richedit?

Posted: Wed Sep 09, 2015 9:39 am
by SpoQSI
Hello,

in the RichViewActions Demo, which i costumize, i need costum buttons in the toolbar.
Normal OnClick-Events don´t work, as i get exceptions with buttons without any action applied.

Therefor i wanted to create custom Actions, but i don´t know how to access the richview (scalerichview) which is on the executing form.

Here i want to open a Template-RTF which i created.

Code: Select all

procedure TsrvActionsResource.OpenPlainTemplateActionExecute(Sender: TObject);
begin

end;
In examples i found this:

Code: Select all

procedure TrvActionsResource.rvActionEvent1Execute(Sender: TObject;
  Editor: TCustomRichViewEdit);
var gr: TGraphic;
    Tag: TRVTag;
    Align: TRVVAlign;
    s: TRVAnsiString;
    info: String;
begin
  Editor.GetCurrentPictureInfo(s, gr, Align, Tag);
  info := Format('%s %dx%d', [gr.ClassName, gr.Width, gr.Height]);
  Application.MessageBox(PChar(info), 'Image Info', MB_OK or MB_ICONINFORMATION);
end;

procedure TrvActionsResource.rvActionEvent1Update(Sender: TObject;
  Editor: TCustomRichViewEdit);
var CurStyleNo: Integer;
begin
  CurStyleNo := Editor.CurItemStyle;
  (Sender as TrvActionEvent).Enabled := (CurStyleNo=rvsPicture) or
    (CurStyleNo=rvsHotPicture);
end;
But my Action-Events don´t have the "Editor: TCustomRichViewEdit".

How can i accomplish this?

Greetings, Spo

Posted: Wed Sep 09, 2015 11:18 am
by Sergey Tkachenko
Simplest way:

Do not create your own action classes. Use TrvActionEvent actions directly, assigning their OnExecute and OnUpdate events. If you want to know how to get TSRichViewEdit from Editor (TCustomRichViewEdit) parameter of these events, let me know.

---

If you create your own actions inherited from TrvAction, override Execute and UpdateTarget methods. Use GetControl(Target) to get the editor from the Target parameter (where GetControl is a method inherited from TrvAction)

---

If you create your own actions inherited from TsrvAction, everything is the same, but GetControl returns TSRichViewEdit.

---

Assigning OnClick of toolbar buttons must work as well.

Posted: Wed Sep 09, 2015 12:13 pm
by SpoQSI
I don´t understand what i have to do now. in your example in http://www.trichview.com/forums/viewtopic.php?t=4981 you say to use the Action Editor to add a new action. This is what i did. I have:

Code: Select all

    OpenPlainTemplateAction: TAction;
    procedure OpenPlainTemplateActionExecute(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  srvActionsResource: TsrvActionsResource;

implementation

{$R *.dfm}

// ------------------------------------------------------------------------------------------------------------------------------

procedure TsrvActionsResource.OpenPlainTemplateActionExecute(Sender: TObject);
begin
  // Here i want to access the RichEdit to load a Template RTF <---------------
end;

If i try to use the OnClick Events of a TToolButton in the MainUnit i get a EListError-Exception in "TCustomrichViewEdit.UpdateAction" where "Result := inherited UpdateAction(Action);".

Posted: Thu Sep 10, 2015 10:17 am
by Sergey Tkachenko
I cannot reproduce this bug.
I took the ScaleRichView demo in Demos\ActionTest.
I added a new TAction in dmActionsSRV.pas, assigned its OnExecute event. Then I added a button on the toolbar and assigned this action to it.

By the way, you added TAction, not TrvActionEvent like it was explained in the topic.

--

Please send me a sample project reproducing this bug. Also, tell me which version of Delphi and TRichView you use.

Posted: Thu Sep 10, 2015 10:37 am
by SpoQSI
I have no bug assigning an Action to a Toolbutton. The bug, as described, occurs when i do something in the OnClick Event of a Button in the Toolbar.

I have Delphi 6 and the latest Non-Beta TRichView Version.

Posted: Thu Sep 10, 2015 12:06 pm
by Sergey Tkachenko
Please send a sample project (as simple as possible) reproducing this problem to email richviewgmailcom

Posted: Thu Sep 10, 2015 12:37 pm
by SpoQSI
A sample project is not needed. Open ActionTest (The Demo), add a button to the upper left corner (or somewhere else) on the toolbar and set a Click-Event.

Add this code to the button:

Code: Select all

procedure TForm3.Button2Click(Sender: TObject);
var appPath : string;
begin
        appPath := ExtractFilePath(Application.ExeName);
        SRichViewEdit1.RichViewEdit.Clear;
        SRichViewEdit1.RichViewEdit.LoadRTF(appPath + 'TemplateNew.rtf');
end;
And then you get an Exception.

Posted: Thu Sep 10, 2015 12:43 pm
by SpoQSI
Also, if i try it the TsrvAction-Way you mentioned i cannot compile the code as TCustomRichViewEdit is not know.

Posted: Thu Sep 10, 2015 2:30 pm
by Sergey Tkachenko
Actions cannot work with unformatted editor.
Add

Code: Select all

procedure TForm3.Button2Click(Sender: TObject); 
var appPath : string; 
begin 
        appPath := ExtractFilePath(Application.ExeName); 
        SRichViewEdit1.RichViewEdit.Clear; 
        SRichViewEdit1.RichViewEdit.LoadRTF(appPath + 'TemplateNew.rtf'); 
        [color=red]SRichViewEdit1.Format;[/color]
end; 
Also, if i try it the TsrvAction-Way you mentioned i cannot compile the code as TCustomRichViewEdit is not know.
Add RVEdit in uses of this unit.

Posted: Fri Sep 11, 2015 9:11 am
by SpoQSI
Great, the two suggestions solved my problems with that. Thank you very much.

One more Question:
How exactly can i get the current Documents RTF-Text as string without saving it to an rtf file?

I need to save and load the documents from and to a Database.

Posted: Fri Sep 11, 2015 10:09 am
by SpoQSI
Oh i noticed the problem is not solved completely. When i load an RTF now this way:

Code: Select all

procedure TsrvActionsResource.OpenNewPlainTemplateActionEventExecute(
  Sender: TObject; Editor: TCustomRichViewEdit);
var appPath : string;
begin
        appPath := ExtractFilePath(Application.ExeName);
        Editor.Clear;
        Editor.LoadRTF(appPath + 'TemplateNew.rtf');
        Editor.Format;
end;
There the RTF Documents Borders/Header/Footer-Preferences arent loaded properly, which results in Header/Footer images and Tables in the Document itself are cut.

Posted: Fri Sep 11, 2015 11:51 am
by Sergey Tkachenko
As for getting RTF:

Code: Select all

function GetRTFString(rv: TCustomRichView): AnsiString;
var Stream: TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  rv.SaveRTFToStream(Stream, False);
  SetLength(Result, Stream.Size);
  Stream.Position := 0;
  Stream.ReadBuffer(PAnsiChar(Result)^, Length(Result));
  Stream.Free;
end;
As for the error, I do not understand what exactly happens. Can you explain how to reproduce?

Posted: Fri Sep 11, 2015 1:47 pm
by SpoQSI
Correct:
This is what it should look like and what it looks, if i Load the RTF via the standard open button in the ActionTest-Demo
Image



Incorrect:
This is what it looks like when loaded with this code:

Code: Select all

procedure TsrvActionsResource.OpenNewPlainTemplateActionEventExecute(
  Sender: TObject; Editor: TCustomRichViewEdit);
var appPath : string;
begin
        appPath := ExtractFilePath(Application.ExeName);
        Editor.Clear;
        Editor.LoadRTF(appPath + 'TemplateNew.rtf');
        Editor.Format;
end;
Image

Posted: Fri Sep 11, 2015 2:03 pm
by Sergey Tkachenko
Well, I understand.
Yes, when you load a document with headers and footers in SRichViewEdit.RichViewEdit, it's not enough to call SRichViewEdit.RichViewEdit.Format, you need to call SRichViewEdit.Format.

Use this procedure:

Code: Select all

procedure CompleteFormat(rve: TCustomRichViewEdit);
var
  Ifc: IRVScaleRichViewInterface;
begin
  Ifc := rve.RVData.GetScaleRichViewInterface;
  if Ifc <> nil then
    Ifc.Format
  else
    rve.FormatAll;
end;

Code: Select all

procedure TsrvActionsResource.OpenNewPlainTemplateActionEventExecute( 
  Sender: TObject; Editor: TCustomRichViewEdit); 
var appPath : string; 
begin 
        appPath := ExtractFilePath(Application.ExeName); 
        Editor.Clear; 
        Editor.LoadRTF(appPath + 'TemplateNew.rtf'); 
        [color=red]CompleteFormat(Editor);[/color]
end;

Posted: Fri Sep 11, 2015 2:16 pm
by SpoQSI
Thank you for the fast response, but i can´t find the unit i have to add to the usings in which CompleteFormat is held.