📄 fr_rxrtf.pas
字号:
end;
function TfrRxRichView.LostSpace: Integer;
var
n, lc, cc: Integer;
begin
AssignRich(SRichEdit, RichEdit);
if (Flags and flTextOnly) = 0 then
GetRichData(SRichEdit);
lc := LastChar;
cc := CurChar;
CharFrom := 0;
SRichEdit.SelStart := 0;
SRichEdit.SelLength := LastChar;
SRichEdit.SelText := '';
ShowRich(False);
n := SRichEdit.GetTextLen - LastChar + 1;
if n > 0 then
begin
SRichEdit.SelStart := LastChar;
SRichEdit.SelLength := n;
SRichEdit.SelText := '';
end;
CharFrom := 0;
n := DoCalcHeight;
if n < dy then
n := dy;
Result := Round(Abs(dy - n)) + gapy * 2 + Round(FrameWidth * 2);
LastChar := lc;
CurChar := cc;
end;
procedure TfrRxRichView.LoadFromStream(Stream: TStream);
var
b: Byte;
n: Integer;
begin
inherited LoadFromStream(Stream);
Stream.Read(b, 1);
Stream.Read(n, 4);
if b <> 0 then RichEdit.Lines.LoadFromStream(Stream);
Stream.Seek(n, soFromBeginning);
end;
procedure TfrRxRichView.SaveToStream(Stream: TStream);
var
b: Byte;
n, o: Integer;
re: TRxRichEdit;
begin
inherited SaveToStream(Stream);
re := RichEdit;
if Flag then
re := SRichEdit;
b := 0;
if re.Lines.Count <> 0 then b := 1;
Stream.Write(b, 1);
n := Stream.Position;
Stream.Write(n, 4);
if b <> 0 then re.Lines.SaveToStream(Stream);
o := Stream.Position;
Stream.Seek(n, soFromBeginning);
Stream.Write(o, 4);
Stream.Seek(0, soFromEnd);
end;
procedure TfrRxRichView.GetBlob(b: TfrTField);
var
s: TMemoryStream;
begin
s := TMemoryStream.Create;
frAssignBlobTo(b, s);
RichEdit.Lines.LoadFromStream(s);
s.Free;
end;
procedure TfrRxRichView.ShowEditor;
begin
with frRxRichForm do
begin
AssignRich(RichEdit1, RichEdit);
if ShowModal = mrOk then
begin
frDesigner.BeforeChange;
AssignRich(RichEdit, RichEdit1);
end;
RichEdit1.Lines.Clear;
end;
end;
procedure TfrRxRichView.RichEditor(Sender: TObject);
begin
ShowEditor;
end;
procedure TfrRxRichView.DefinePopupMenu(Popup: TPopupMenu);
var
m: TMenuItem;
begin
inherited DefinePopupMenu(Popup);
m := TMenuItem.Create(Popup);
m.Caption := frLoadStr(STextOnly);
m.OnClick := P1Click;
m.Checked := (Flags and flTextOnly) <> 0;
Popup.Items.Add(m);
end;
procedure TfrRxRichView.P1Click(Sender: TObject);
var
i: Integer;
t: TfrView;
begin
frDesigner.BeforeChange;
with Sender as TMenuItem do
begin
Checked := not Checked;
for i := 0 to frDesigner.Page.Objects.Count - 1 do
begin
t := frDesigner.Page.Objects[i];
if t.Selected and ((t.Restrictions and frrfDontModify) = 0) then
t.Flags := (t.Flags and not flTextOnly) + Word(Checked) * flTextOnly;
end;
end;
frDesigner.AfterChange;
end;
{------------------------------------------------------------------------}
procedure TfrRxRichForm.SelectionChange(Sender: TObject);
begin
with RichEdit1.Paragraph do
try
FUpdating := True;
FirstInd.Left := Trunc(FirstIndent * RulerAdj) - 4 + GutterWid;
LeftInd.Left := Trunc((LeftIndent + FirstIndent) * RulerAdj) - 4 + GutterWid;
RightInd.Left := Ruler.ClientWidth - 6 - Trunc((RightIndent + GutterWid) * RulerAdj);
BoldButton.Down := fsBold in RichEdit1.SelAttributes.Style;
ItalicButton.Down := fsItalic in RichEdit1.SelAttributes.Style;
UnderlineButton.Down := fsUnderline in RichEdit1.SelAttributes.Style;
BulletsButton.Down := Boolean(Numbering);
FontSize.Text := IntToStr(RichEdit1.SelAttributes.Size);
FontName.Text := RichEdit1.SelAttributes.Name;
case Ord(Alignment) of
0: LeftAlign.Down := True;
1: RightAlign.Down := True;
2: CenterAlign.Down := True;
end;
finally
FUpdating := False;
end;
end;
function TfrRxRichForm.CurrText: TRxTextAttributes;
begin
if RichEdit1.SelLength > 0 then
Result := RichEdit1.SelAttributes else
Result := RichEdit1.DefAttributes;
end;
procedure TfrRxRichForm.SetupRuler;
var
I: Integer;
S: String;
begin
SetLength(S, 201);
I := 1;
while I < 200 do
begin
S[I] := #9;
S[I+1] := '|';
Inc(I, 2);
end;
Ruler.Caption := S;
end;
procedure TfrRxRichForm.SetEditRect;
var
R: TRect;
begin
with RichEdit1 do
begin
R := Rect(GutterWid, 0, ClientWidth - GutterWid, ClientHeight);
SendMessage(Handle, EM_SETRECT, 0, Longint(@R));
end;
end;
{ Event Handlers }
procedure TfrRxRichForm.FormResize(Sender: TObject);
begin
SetEditRect;
SelectionChange(Sender);
end;
procedure TfrRxRichForm.FormPaint(Sender: TObject);
begin
SetEditRect;
end;
procedure TfrRxRichForm.FileOpen(Sender: TObject);
begin
OpenDialog.Filter := frLoadStr(SRTFFile) + ' (*.rtf)|*.rtf';
if OpenDialog.Execute then
begin
RichEdit1.Lines.LoadFromFile(OpenDialog.FileName);
RichEdit1.SetFocus;
SelectionChange(Self);
end;
end;
procedure TfrRxRichForm.FileSaveAs(Sender: TObject);
begin
SaveDialog.Filter := frLoadStr(SRTFFile) + ' (*.rtf)|*.rtf|' +
frLoadStr(STextFile) + ' (*.txt)|*.txt';
if SaveDialog.Execute then
RichEdit1.Lines.SaveToFile(SaveDialog.FileName);
end;
procedure TfrRxRichForm.EditUndo(Sender: TObject);
begin
with RichEdit1 do
if HandleAllocated then SendMessage(Handle, EM_UNDO, 0, 0);
end;
procedure TfrRxRichForm.SelectFont(Sender: TObject);
begin
FontDialog1.Font.Assign(RichEdit1.SelAttributes);
if FontDialog1.Execute then
CurrText.Assign(FontDialog1.Font);
RichEdit1.SetFocus;
end;
procedure TfrRxRichForm.RulerResize(Sender: TObject);
begin
RulerLine.Width := Ruler.ClientWidth - RulerLine.Left * 2;
end;
procedure TfrRxRichForm.BoldButtonClick(Sender: TObject);
var
s: TFontStyles;
begin
if FUpdating then Exit;
s := [];
if BoldButton.Down then s := s + [fsBold];
if ItalicButton.Down then s := s + [fsItalic];
if UnderlineButton.Down then s := s + [fsUnderline];
CurrText.Style := s;
end;
procedure TfrRxRichForm.AlignButtonClick(Sender: TObject);
begin
if FUpdating then Exit;
case TControl(Sender).Tag of
312: RichEdit1.Paragraph.Alignment := paLeftJustify;
313: RichEdit1.Paragraph.Alignment := paCenter;
314: RichEdit1.Paragraph.Alignment := paRightJustify;
end;
end;
procedure TfrRxRichForm.FontNameChange(Sender: TObject);
begin
if FUpdating then Exit;
CurrText.Name := FontName.Text;
end;
procedure TfrRxRichForm.BulletsButtonClick(Sender: TObject);
begin
if FUpdating then Exit;
RichEdit1.Paragraph.Numbering := TRxNumbering(BulletsButton.Down);
end;
{ Ruler Indent Dragging }
procedure TfrRxRichForm.RulerItemMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FDragOfs := (TLabel(Sender).Width div 2);
TLabel(Sender).Left := TLabel(Sender).Left + X - FDragOfs;
FDragging := True;
end;
procedure TfrRxRichForm.RulerItemMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if FDragging then
TLabel(Sender).Left := TLabel(Sender).Left + X - FDragOfs
end;
procedure TfrRxRichForm.FirstIndMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FDragging := False;
RichEdit1.Paragraph.FirstIndent :=
Trunc((FirstInd.Left + FDragOfs - GutterWid) / RulerAdj);
LeftIndMouseUp(Sender, Button, Shift, X, Y);
end;
procedure TfrRxRichForm.LeftIndMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FDragging := False;
RichEdit1.Paragraph.LeftIndent :=
Trunc((LeftInd.Left + FDragOfs - GutterWid) / RulerAdj) - RichEdit1.Paragraph.FirstIndent;
SelectionChange(Sender);
end;
procedure TfrRxRichForm.RightIndMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FDragging := False;
RichEdit1.Paragraph.RightIndent :=
Trunc((Ruler.ClientWidth - RightInd.Left + FDragOfs - 2) / RulerAdj) - 2 * GutterWid;
SelectionChange(Sender);
end;
procedure TfrRxRichForm.CancBtnClick(Sender: TObject);
begin
ModalResult := mrCancel;
end;
procedure TfrRxRichForm.OkBtnClick(Sender: TObject);
begin
ModalResult := mrOk;
end;
procedure TfrRxRichForm.SpeedButton2Click(Sender: TObject);
var
s: String;
begin
s := frDesigner.InsertExpression;
if s <> '' then
RichEdit1.SelText := s;
end;
procedure TfrRxRichForm.FontSizeChange(Sender: TObject);
begin
CurrText.Size := StrToInt(FontSize.Text);
RichEdit1.SetFocus;
end;
procedure TfrRxRichForm.FormActivate(Sender: TObject);
begin
RichEdit1.SetFocus;
end;
procedure TfrRxRichForm.Localize;
begin
Caption := frLoadStr(frRes + 560);
OpenButton.Hint := frLoadStr(frRes + 561);
SaveButton.Hint := frLoadStr(frRes + 562);
UndoButton.Hint := frLoadStr(frRes + 563);
BoldButton.Hint := frLoadStr(frRes + 564);
ItalicButton.Hint := frLoadStr(frRes + 565);
LeftAlign.Hint := frLoadStr(frRes + 566);
CenterAlign.Hint := frLoadStr(frRes + 567);
RightAlign.Hint := frLoadStr(frRes + 568);
UnderlineButton.Hint := frLoadStr(frRes + 569);
BulletsButton.Hint := frLoadStr(frRes + 570);
SpeedButton1.Hint := frLoadStr(frRes + 571);
HelpBtn.Hint := frLoadStr(frRes + 032);
CancBtn.Hint := frLoadStr(frRes + 572);
OkBtn.Hint := frLoadStr(frRes + 573);
SpeedButton2.Hint := frLoadStr(frRes + 575);
FontName.Hint := frLoadStr(frRes + 576);
FontSize.Hint := frLoadStr(frRes + 577);
if frDesignerClass <> nil then
begin
BoldButton.Glyph.Handle := frLocale.LoadBmp('FR_BOLD');
ItalicButton.Glyph.Handle := frLocale.LoadBmp('FR_ITALIC');
UnderlineButton.Glyph.Handle := frLocale.LoadBmp('FR_UNDRLINE');
end;
end;
procedure TfrRxRichForm.FormCreate(Sender: TObject);
begin
OpenDialog.InitialDir := ExtractFilePath(ParamStr(0));
SaveDialog.InitialDir := OpenDialog.InitialDir;
SetupRuler;
SelectionChange(Self);
end;
procedure TfrRxRichForm.FormShow(Sender: TObject);
begin
Localize;
end;
type
THackBtn = class(TfrSpeedButton)
end;
procedure TfrRxRichForm.HelpBtnClick(Sender: TObject);
begin
Screen.Cursor := crHelp;
SetCapture(Handle);
THackBtn(HelpBtn).FMouseInControl := False;
HelpBtn.Invalidate;
end;
procedure TfrRxRichForm.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
c: TControl;
begin
HelpBtn.Down := False;
Screen.Cursor := crDefault;
c := frControlAtPos(Self, Point(X, Y));
if (c <> nil) and (c <> HelpBtn) then
Application.HelpCommand(HELP_CONTEXTPOPUP, c.Tag);
end;
initialization
frRxRichForm := TfrRxRichForm.Create(nil);
SRichEdit := frRxRichForm.RichEdit1;
frRegisterObject(TfrRxRichView, frRxRichForm.Image1.Picture.Bitmap,
IntToStr(SInsRich2Object));
finalization
frRxRichForm.Free;
frRxRichForm := nil;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -