📄 accidenceeditfrm.pas
字号:
unit AccidenceEditFrm;
{*******************************************
* brief: 词法编辑窗体
* autor: linzhenqun
* date: 2005-10-24
* email: linzhengqun@163.com
* blog: http://blog.csdn.net/linzhengqun
********************************************}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, BaseFrm, ExtCtrls, StdCtrls, ComCtrls, FontFrame, TabFrame,
Config;
type
{ 词法状态基类 控制一个配置文件}
TAcciState = class
protected
FAcciConfig: TAccidenceConfig; // 配置文件类
FAcciName: string; // 词法名称
FFileName: string; // 词法对应文件名 --全路径
public
constructor Create(AcciName, FileName: string); virtual;
destructor Destroy; override;
function SaveToFile: Boolean; virtual; abstract;
function LoadFromFile: Boolean; virtual; abstract;
property AcciConfig: TAccidenceConfig read FAcciConfig;
property AcciName:string read FAcciName write FAcciName; // 新建时保存所有名称列表
property FileName:string read FFileName;
end;
{ 词法状态:新建 -> AddTo Config.gSourceToConfig }
TNewAcciState = class(TAcciState)
public
function LoadFromFile: Boolean; override;
function SaveToFile: Boolean; override;
end;
{ 词法状态:编辑 直接操作文件内容 }
TEditAcciState = class(TAcciState)
public
constructor Create(AcciName: string; FileName: string); override;
function LoadFromFile: Boolean; override;
function SaveToFile: Boolean; override;
end;
TFrmAccidenceEdit = class(TFrmBase)
PageControl: TPageControl;
btnCancel: TButton;
btnOK: TButton;
TSGeneral: TTabSheet;
TSKeyWord: TTabSheet;
TSSymbols: TTabSheet;
btnAddKeyWord: TButton;
btnDelKeyWord: TButton;
Panel1: TPanel;
cbBGColor: TColorBox;
chkShowLine: TCheckBox;
chkIgnoreCase: TCheckBox;
lblBGColor: TLabel;
Bevel1: TBevel; // 常规字体
Bevel3: TBevel;
lblBaseInfo: TLabel;
lblFont: TLabel;
Panel2: TPanel;
btnDelSymbol: TButton;
btnAddSymbol: TButton;
TSNumber: TTabSheet;
NumFontFrame: TFrameFont; // 数字字体
Bevel5: TBevel;
lblFont2: TLabel;
GelFontFrame: TFrameFont;
procedure FormDestroy(Sender: TObject);
procedure btnAddKeyWordClick(Sender: TObject);
procedure btnDelKeyWordClick(Sender: TObject);
procedure btnAddSymbolClick(Sender: TObject);
procedure btnDelSymbolClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure btnOKClick(Sender: TObject);
private
{ Private declarations }
FKWTabMgr: TTabManager; // 关键字 页
FSMTabMgr: TTabManager; // 符号 页
FAcciState: TAcciState; // 文件状态类(控制一个配置文件)
(* 将UI的值赋给词法配置类 :先清配置文件内容再加入界面内容 *)
procedure SetValueToAcci;
(* 赋字体UI的值 *)
procedure SetFontFrame(AFontConfig: TFontConfig; AFontFrame: TFrameFont);
(* 设置字体配置的值 *)
procedure SetFontConfig(AFontFrame: TFrameFont; AFontConfig: TFontConfig);
(* 检查是否编辑正确 *)
function IsInputRight: Boolean;
(* 格式化关键字的值列表 *)
procedure FormatKeyWordValues(KWValues: TStrings;TabIndex: integer);
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
procedure getLangRes;override; // 资源加载
property AcciState: TAcciState read FAcciState write FAcciState;
property KWTabMgr: TTabManager read FKWTabMgr;
property MMTabMgr: TTabManager read FSMTabMgr;
end;
var
FrmAccidenceEdit: TFrmAccidenceEdit;
implementation
uses
KeyWordFrame, RenameFrm, CommonUtils, SymbolFrame, AcciInfoFrmEx,
AcciInfoFrm;
{$R *.dfm}
{
resourcestring
Qust_Delete = '是否删除当前页?';//'Do you want to delete the tab page.';
Info_BValue = '符号开始值不能为空!';//'Please input momment ''s begin value!';
Info_BValue_InVaild = '符号开始值无效,第一个字符必须不是字母或下划线。';
Info_EValue = '符号结束值不能为空!';//'Please input momment ''s end value!';
Info_BValue_Dup ='符号页 [%s] 与页 [%s] 的开始值有重复,请修改。';
Info_KeyWords_Empty ='页 [%s] 关键字列表为空,继续保存?';
Info_KeyWords_Dup ='符号页 [%s] 与页 [%s] 的关键字 [%s] 有重复,%s'+
'选择是手动修改。选择否全部自动清除重复内容。--当前页';
Info_KeyWord_Invalid = '关键字无效,第一个字符必须是字母或下划线。';
}
{ TAcciState }
constructor TAcciState.Create(AcciName, FileName: string);
begin
FAcciConfig := TAccidenceConfig.Create(AcciName); // 新对象
FAcciName := AcciName;
FFileName := FileName;
end;
destructor TAcciState.Destroy;
begin
FAcciConfig.Free;
inherited;
end;
{ TNewAcciState }
function TNewAcciState.LoadFromFile: Boolean;
begin
Result := False;
end;
function TNewAcciState.SaveToFile: Boolean;
var
Item: PItemRec;
begin
Result := False;
with TFrmAccInfoEx.Create(nil) do
try
if ShowModal = mrOk then // 录入名称、路径
begin
FAcciName := AcciName;
FFileName := FilePath; // 全路径
//保存词法文件
FAcciConfig.SaveToFile(FFileName); // Obj -> XML
Result := True;
end;
finally
Free;
end;
end;
{ TEditAcciState }
constructor TEditAcciState.Create(AcciName, FileName: string);
begin
inherited;
if FileName = '' then
Exception.Create(pubGet('Err_FilePathEmpty'));
if not LoadFromFile then
raise Exception.Create(pubGet('Err_AcciInvalide'));
end;
function TEditAcciState.LoadFromFile: Boolean;
begin
Result := True;
try
FAcciConfig.LoadFromFile(FFileName);
except
Result := False;
end;
end;
function TEditAcciState.SaveToFile: Boolean;
begin
Result := True;
FAcciConfig.SaveToFile(FFileName);
end;
{ TFrmAccidenceEdit }
procedure TFrmAccidenceEdit.getLangRes;
begin
inherited;
Self.Caption := pubGet(300);
btnOk.Caption := pubGet(5);
btnCancel.Caption := pubGet(6);
TSGeneral.Caption := pubGet(301);
lblBaseInfo.Caption := pubGet(302);
chkIgnoreCase.Caption := pubGet(303);
chkShowLine.Caption := pubGet(304);
lblBGColor.Caption := pubGet(305);
lblFont.Caption := pubGet(306);
lblFont2.Caption := lblFont.Caption ;//pubGet(306);
TSKeyWord.Caption := pubGet(307);
btnAddKeyWord.Caption := pubGet(308);
btnDelKeyWord.Caption := pubGet(309);
TSSymbols.Caption := pubGet(310);
btnAddSymbol.Caption := pubGet(311);
btnDelSymbol.Caption := pubGet(312);
TSNumber.Caption := pubGet(313);
chkIgnoreCase.Hint := pubGet(514); //忽略大小写
chkShowLine.Hint := pubGet(515);
btnOK.Hint := pubGet(516); // Save And Close
end;
constructor TFrmAccidenceEdit.Create(AOwner: TComponent);
begin
inherited;
FKWTabMgr := TTabManager.Create(PageControl.Pages[1]); // 关键字
FSMTabMgr := TTabManager.Create(PageControl.Pages[2]); // 符号
end;
procedure TFrmAccidenceEdit.FormDestroy(Sender: TObject);
begin
inherited;
FKWTabMgr.Free;
FSMTabMgr.Free;
if FAcciState <> nil then // 调用前要由调用都建立
FAcciState.Free;
end;
procedure TFrmAccidenceEdit.FormShow(Sender: TObject);
var
i: Integer;
KWFrame: TFrameKeyWord;
KWConfig: TKeyWordConfig;
SMFrame: TFrameSymbol;
SMConfig: TSymbolConfig;
begin
if Not Assigned(FAcciState) then Exit; // 未分配
// Obj -> UI
with FAcciState.FAcciConfig do
begin
// 常规
chkIgnoreCase.Checked := GeneralConfig.IgnoreCase;
chkShowLine.Checked := GeneralConfig.ShowLine;
cbBGColor.Selected := GeneralConfig.BGround;
SetFontFrame(GeneralConfig.FontConfig, GelFontFrame);
// 数字
SetFontFrame(NumberConfig.FontConfig, NumFontFrame);
// 关键字
for i := 0 to KeyWords.Count - 1 do
begin
KWFrame := TFrameKeyWord.Create(nil);
KWConfig:= TKeyWordConfig(KeyWords.Items[i]);
SetFontFrame(KWConfig.FontConfig, KWFrame.KWFontFrame);
KWFrame.KeyWords.Lines.Assign(KWConfig.Values);
FKWTabMgr.AddTab(KWFrame, KWConfig.Name);
end;
if FKWTabMgr.TabCount > 0 then
FKWTabMgr.ActiveTab := 0;
// 符号
for i := 0 to Symbols.Count - 1 do
begin
SMFrame := TFrameSymbol.Create(nil);
SMConfig := TSymbolConfig(Symbols.Items[i]);
SetFontFrame(SMConfig.FontConfig, SMFrame.SMFontFrame);
SMFrame.cbRange.ItemIndex :=
SMFrame.cbRange.Items.IndexOf(SMConfig.Range);
SMFrame.cbHightLight.ItemIndex :=
SMFrame.cbHightLight.Items.IndexOf(SMConfig.HightLight);
SMFrame.cbDoubleSym.Checked := SMConfig.DoubleSymbol;
SMFrame.edtBValue.Text := SMConfig.BeginValue;
SMFrame.edtEValue.Text := SMConfig.EndValue;
SMFrame.edtESC.Text := SMConfig.ESC;
SMFrame.cbRangeChange(nil);
FSMTabMgr.AddTab(SMFrame, SMConfig.Name);
end;
if FSMTabMgr.TabCount > 0 then
FSMTabMgr.ActiveTab := 0;
end;
end;
procedure TFrmAccidenceEdit.btnAddKeyWordClick(Sender: TObject);
var
FrameKeyWord: TFrameKeyWord;
begin
with TFrmRename.Create(nil) do
try
if Execute then
if Not FKWTabMgr.IsTabNameExist(TheName) then
begin
FrameKeyWord := TFrameKeyWord.Create(nil);
FKWTabMgr.AddTab(FrameKeyWord, TheName);
//TSKeyWord.Repaint; //ToDo: 为什么要重画?
end;
finally
Free;
end;
end;
procedure TFrmAccidenceEdit.btnDelKeyWordClick(Sender: TObject);
begin
if FKWTabMgr.TabCount > 0 then
if MessageBox(Handle, PChar(pubGet('Qust_Delete')), PChar(pubGet(2)),
MB_YESNO + MB_ICONQUESTION) = IDYES then
FKWTabMgr.DelIndexTab;
end;
procedure TFrmAccidenceEdit.btnAddSymbolClick(Sender: TObject);
var
FrameSymbol: TFrameSymbol;
begin
with TFrmRename.Create(nil) do
try
if Execute then
if Not FSMTabMgr.IsTabNameExist(TheName) then
begin
FrameSymbol := TFrameSymbol.Create(nil);
FSMTabMgr.AddTab(FrameSymbol, TheName);
//TSSymbols.Repaint; //Todo: 为什么要重画
end;
finally
Free;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -