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