📄 richedeh.pas
字号:
{*******************************************************}
{ }
{ EhLib v3.6 }
{ Design time Rich Edit window }
{ }
{ Copyright (c) 1998-2004 by Dmitry V. Bolshakov }
{ }
{*******************************************************}
unit RichEdEh {$IFDEF CIL} platform{$ENDIF};
{$I EhLib.Inc}
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, ImgList,
{$IFDEF CIL} Borland.Vcl.Design.DesignIntf,
Borland.Vcl.Design.DesignEditors,
Borland.Vcl.Design.VCLEditors, Variants,
System.Drawing.Text,
EhLibVCLNET,
Types,
{$ELSE}
EhLibVCL,
{$IFDEF EH_LIB_6}DesignIntf, DesignEditors,
{$ELSE}DsgnIntf, {$ENDIF}
{$ENDIF}
Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, Menus, ComCtrls, ClipBrd,
ToolWin, PrnDBGEh;
type
TRichStrEditDlgEh = class(TForm)
MainMenu: TMainMenu;
FileNewItem: TMenuItem;
FileOpenItem: TMenuItem;
FileSaveItem: TMenuItem;
FileSaveAsItem: TMenuItem;
FilePrintItem: TMenuItem;
FileExitItem: TMenuItem;
EditUndoItem: TMenuItem;
EditCutItem: TMenuItem;
EditCopyItem: TMenuItem;
EditPasteItem: TMenuItem;
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
PrintDialog: TPrintDialog;
Ruler: TPanel;
FontDialog1: TFontDialog;
FirstInd: TLabel;
LeftInd: TLabel;
RulerLine: TBevel;
RightInd: TLabel;
N5: TMenuItem;
miEditFont: TMenuItem;
Editor: TRichEdit;
StatusBar: TStatusBar;
StandardToolBar: TToolBar;
OpenButton: TToolButton;
SaveButton: TToolButton;
PrintButton: TToolButton;
ToolButton5: TToolButton;
UndoButton: TToolButton;
CutButton: TToolButton;
CopyButton: TToolButton;
PasteButton: TToolButton;
ToolButton10: TToolButton;
FontName: TComboBox;
FontSize: TEdit;
ToolButton11: TToolButton;
UpDown1: TUpDown;
BoldButton: TToolButton;
ItalicButton: TToolButton;
UnderlineButton: TToolButton;
ToolButton16: TToolButton;
LeftAlign: TToolButton;
CenterAlign: TToolButton;
RightAlign: TToolButton;
ToolButton20: TToolButton;
BulletsButton: TToolButton;
ToolbarImages: TImageList;
ToolButton2: TToolButton;
Bevel1: TBevel;
Panel1: TPanel;
Panel2: TPanel;
OKButton: TButton;
CancelButton: TButton;
ToolButton1: TToolButton;
tbSelectFont: TToolButton;
procedure SelectionChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ShowHint(Sender: TObject);
procedure FileOpen(Sender: TObject);
procedure FileSave(Sender: TObject);
procedure FileSaveAs(Sender: TObject);
procedure FilePrint(Sender: TObject);
procedure FileExit(Sender: TObject);
procedure EditUndo(Sender: TObject);
procedure EditCut(Sender: TObject);
procedure EditCopy(Sender: TObject);
procedure EditPaste(Sender: TObject);
procedure SelectFont(Sender: TObject);
procedure RulerResize(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure BoldButtonClick(Sender: TObject);
procedure ItalicButtonClick(Sender: TObject);
procedure FontSizeChange(Sender: TObject);
procedure AlignButtonClick(Sender: TObject);
procedure FontNameChange(Sender: TObject);
procedure UnderlineButtonClick(Sender: TObject);
procedure BulletsButtonClick(Sender: TObject);
procedure RulerItemMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure RulerItemMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FirstIndMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure LeftIndMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure RightIndMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormShow(Sender: TObject);
procedure RichEditChange(Sender: TObject);
procedure EditorKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
FFileName: string;
FUpdating: Boolean;
FDragOfs: Integer;
FDragging: Boolean;
function CurrText: TTextAttributes;
procedure GetFontNames;
procedure SetupRuler;
procedure SetEditRect;
procedure UpdateCursorPos;
procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
procedure PerformFileOpen(const AFileName: string);
procedure SetModified(Value: Boolean);
end;
type
TRichEditStringsEh = class(TClassProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure Edit; override;
end;
var
RichStrEditDlgEh: TRichStrEditDlgEh;
procedure Register;
implementation
uses RichEdit, ShellAPI;
resourcestring
sOverWrite = 'OK to overwrite %s';
sModified = 'Modified';
sColRowInfo = 'Line: %3d Col: %3d';
const
RulerAdj = 4 / 3;
GutterWid = 6;
{$R *.DFM}
procedure Register;
begin
RegisterPropertyEditor(TypeInfo(TStrings), TPrintDBGridEh, 'BeforeGridText', TRichEditStringsEh);
RegisterPropertyEditor(TypeInfo(TStrings), TPrintDBGridEh, 'AfterGridText', TRichEditStringsEh);
end;
procedure TRichStrEditDlgEh.SelectionChange(Sender: TObject);
begin
with Editor.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 Editor.SelAttributes.Style;
ItalicButton.Down := fsItalic in Editor.SelAttributes.Style;
UnderlineButton.Down := fsUnderline in Editor.SelAttributes.Style;
BulletsButton.Down := Boolean(Numbering);
FontSize.Text := IntToStr(Editor.SelAttributes.Size);
FontName.Text := Editor.SelAttributes.Name;
case Ord(Alignment) of
0: LeftAlign.Down := True;
1: RightAlign.Down := True;
2: CenterAlign.Down := True;
end;
UpdateCursorPos;
finally
FUpdating := False;
end;
end;
function TRichStrEditDlgEh.CurrText: TTextAttributes;
begin
// if Editor.SelLength > 0 then Result := Editor.SelAttributes
// else Result := Editor.DefAttributes;
Result := Editor.SelAttributes;
end;
{$IFDEF CIL}
procedure TRichStrEditDlgEh.GetFontNames;
var
i: Integer;
InstalledFonts: System.Drawing.Text.InstalledFontCollection;
begin
FontName.Items.BeginUpdate;
try
FontName.Items.Clear;
InstalledFonts := System.Drawing.Text.InstalledFontCollection.Create;
for i := 0 to Length(InstalledFonts.Families) - 1 do
FontName.Items.Add(InstalledFonts.Families[i].Name);
finally
FontName.Items.EndUpdate;
end;
end;
{$ELSE}
function EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric;
FontType: Integer; Data: Pointer): Integer; stdcall;
begin
TStrings(Data).Add(LogFont.lfFaceName);
Result := 1;
end;
procedure TRichStrEditDlgEh.GetFontNames;
var
DC: HDC;
begin
DC := GetDC(0);
try
EnumFonts(DC, nil, @EnumFontsProc, Pointer(FontName.Items));
finally
ReleaseDC(0, DC);
end;
FontName.Sorted := True;
end;
{$ENDIF}
procedure TRichStrEditDlgEh.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 TRichStrEditDlgEh.SetEditRect;
var
R: TRect;
begin
with Editor do
begin
R := Rect(GutterWid, 0, ClientWidth - GutterWid, ClientHeight);
{$IFDEF CIL}
SendStructMessage(Handle, EM_SETRECT, 0, R);
{$ELSE}
SendMessage(Handle, EM_SETRECT, 0, Longint(@R));
{$ENDIF}
end;
end;
{ Event Handlers }
procedure TRichStrEditDlgEh.FormCreate(Sender: TObject);
begin
GetFontNames;
SetupRuler;
SelectionChange(Self);
CurrText.Name := DefFontData.Name;
CurrText.Size := -MulDiv(DefFontData.Height, 72, Screen.PixelsPerInch);
end;
procedure TRichStrEditDlgEh.ShowHint(Sender: TObject);
begin
if Length(Application.Hint) > 0 then
begin
StatusBar.SimplePanel := True;
StatusBar.SimpleText := Application.Hint;
end
else StatusBar.SimplePanel := False;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -