?? hwformula.pas.svn-base
字號:
unit HwFormula;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, atScript, DB, ADODB, StrUtils,
ActnList, atPascal, ComCtrls;
type
THwFormulaForm = class(TForm)
gbCondition: TGroupBox;
gbOperation: TGroupBox;
gbFunction: TGroupBox;
sbIf: TSpeedButton;
sbThen: TSpeedButton;
sbElse: TSpeedButton;
lbFunction: TListBox;
sbOr: TSpeedButton;
sbAnd: TSpeedButton;
SpeedButton6: TSpeedButton;
SpeedButton7: TSpeedButton;
SpeedButton8: TSpeedButton;
sbDiv: TSpeedButton;
SpeedButton10: TSpeedButton;
SpeedButton11: TSpeedButton;
SpeedButton12: TSpeedButton;
SpeedButton13: TSpeedButton;
SpeedButton14: TSpeedButton;
SpeedButton15: TSpeedButton;
SpeedButton16: TSpeedButton;
SpeedButton17: TSpeedButton;
Bevel1: TBevel;
bbtnOk: TBitBtn;
bbtnExit: TBitBtn;
bbtnCheck: TBitBtn;
Scripter: TatPascalScripter;
cbLang: TCheckBox;
gbItem: TGroupBox;
lbItem: TListBox;
ActionList1: TActionList;
ActUndo: TAction;
RichEdit1: TRichEdit;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure bbtnOkClick(Sender: TObject);
procedure bbtnExitClick(Sender: TObject);
procedure bbtnCheckClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure ScripterCompileError(Sender: TObject; var msg: String; row,
col: Integer; var ShowException: Boolean);
procedure lbItemDblClick(Sender: TObject);
procedure lbFunctionDblClick(Sender: TObject);
procedure ActUndoExecute(Sender: TObject);
procedure sbIfClick(Sender: TObject);
procedure sbThenClick(Sender: TObject);
procedure sbElseClick(Sender: TObject);
procedure sbOrClick(Sender: TObject);
procedure sbAndClick(Sender: TObject);
procedure SpeedButton6Click(Sender: TObject);
procedure SpeedButton7Click(Sender: TObject);
procedure SpeedButton8Click(Sender: TObject);
procedure sbDivClick(Sender: TObject);
procedure SpeedButton10Click(Sender: TObject);
procedure SpeedButton11Click(Sender: TObject);
procedure SpeedButton12Click(Sender: TObject);
procedure SpeedButton13Click(Sender: TObject);
procedure SpeedButton14Click(Sender: TObject);
procedure SpeedButton15Click(Sender: TObject);
procedure SpeedButton16Click(Sender: TObject);
procedure SpeedButton17Click(Sender: TObject);
procedure RichEdit1Change(Sender: TObject);
private
procedure SetInterface;
{ Private declarations }
public
AMode:string;
AType:string;
AItemNo:Integer;
AItemID:string;
AItemNm:String;
{ Public declarations }
end;
var
HwFormulaForm: THwFormulaForm;
implementation
uses CommFun, SYSDATA;
{$R *.dfm}
procedure THwFormulaForm.SetInterface;
begin
Font.Name:=AFontName;
Caption:=GetDBString('FUN10001001'); //自定義公式
bbtnCheck.Caption:=GetDBString('FUN10001002'); //語法檢查(&C)
bbtnOk.Caption:=GetDBString('FUN10001003'); //確定(&O)
bbtnExit.Caption:=GetDBString('FUN10001004'); //退出(&X)
cbLang.Caption:=GetDBString('FUN10001005'); //使用程序語言
gbFunction.Caption:=GetDBString('FUN10001006'); //函數
gbCondition.Caption:=GetDBString('FUN10001007'); //條件
gbOperation.Caption:=GetDBString('FUN10001008'); //運算符
gbItem.Caption:=GetDBString('FUN10001009'); //項目
end;
procedure THwFormulaForm.FormCreate(Sender: TObject);
begin
SetInterface;
end;
procedure THwFormulaForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
//
end;
//解析公式,即將公式中所有的函數轉換成數值
function ParseFunction(AFormulaString,AItemID:string;AItemNo:Integer):string;
var
S,R,ASubStr:String;
AStart,AEnd,I:Integer;
begin
S:=AFormulaString;
R:=S;
//取得函數的值并替換
AStart:=0;
AEnd:=0;
for I:=1 to Length(S) do
begin
if (AStart=0) and (S[I]='[') then AStart:=I
else if (AEnd=0) and (S[I]=']') then AEnd:=I;
if (AStart<>0) and (AEnd<>0) then
begin
ASubStr:=Copy(S,AStart,AEnd-AStart+1);
ReplaceString(ASubStr,'0',R);
AStart:=0;
AEnd:=0;
end;
end;
S:=R;
//取得考勤項目的值并替換
AStart:=0;
AEnd:=0;
for I:=1 to Length(S) do
begin
if (AStart=0) and (S[I]='@') then AStart:=I
else if (AEnd=0) and (S[I]='@') then AEnd:=I;
if (AStart<>0) and (AEnd<>0) then
begin
ASubStr:=Copy(S,AStart,AEnd-AStart+1);
ReplaceString(ASubStr,'0',R);
AStart:=0;
AEnd:=0;
end;
end;
S:=R;
//取得薪資項目的值并替換
AStart:=0;
AEnd:=0;
for I:=1 to Length(S) do
begin
if (AStart=0) and (S[I]='%') then AStart:=I
else if (AEnd=0) and (S[I]='%') then AEnd:=I;
if (AStart<>0) and (AEnd<>0) then
begin
ASubStr:=Copy(S,AStart,AEnd-AStart+1);
ReplaceString(ASubStr,'0',R);
AStart:=0;
AEnd:=0;
end;
end;
S:=R;
//將項目名稱替換成Result
while Pos('#'+AItemID+'#',S)<>0 do ReplaceString('#'+AItemID+'#','Result',S);
Result:=S;
end;
procedure THwFormulaForm.bbtnOkClick(Sender: TObject);
var
S:String;
begin
//確定(&O)
S:=SetFunct(RichEdit1.Text,AItemID,AItemNm,AType);
Scripter.SourceCode.Clear;
Scripter.SourceCode.Add(ParseFunction(S,AItemID,AItemNo));
Scripter.Compile;
RichEdit1.Text:=S;
ModalResult:=1;
end;
procedure THwFormulaForm.bbtnExitClick(Sender: TObject);
begin
//退出(&X)
Close;
end;
procedure THwFormulaForm.bbtnCheckClick(Sender: TObject);
var
S:string;
begin
//語法檢查(&C)
if trim(RichEdit1.Text)='' then
begin
ShowMsg('UMS10000224'); //自定義公式設置不能為空
RichEdit1.SetFocus;
Abort;
end;
S:=SetFunct(RichEdit1.Text,AItemID,AItemNm,AType);
S:=ParseFunction(S,AItemID,AItemNo);
Scripter.SourceCode.Clear;
Scripter.SourceCode.Add(S);
Scripter.Compile;
ShowMsg('UMS10000247'); //自定義公式語法檢查成功
end;
procedure THwFormulaForm.FormShow(Sender: TObject);
begin
//取得所有項目
lbItem.Clear;
SYSDM.qryQuery.Close;
SYSDM.qryQuery.SQL.Clear;
if AType='CWA' then
SYSDM.qryQuery.SQL.Add('select C150_003 from CWA150 where C150_001<>'+IntToStr(AItemNo))
else if AType='PAY' then
SYSDM.qryQuery.SQL.Add('select P150_003 from PAY150 where P150_001<>'+IntToStr(AItemNo));
SYSDM.qryQuery.Open;
while not SYSDM.qryQuery.Eof do
begin
lbItem.Items.Add(SYSDM.qryQuery.Fields[0].AsString);
SYSDM.qryQuery.Next;
end;
//取得所有函數
lbFunction.Clear;
SYSDM.qryQuery.Close;
SYSDM.qryQuery.SQL.Clear;
if AType='CWA' then
SYSDM.qryQuery.SQL.Add('select S990_002 from SYS990 where S990_003=1')
else if AType='PAY' then
SYSDM.qryQuery.SQL.Add('select S990_002 from SYS990 where S990_003 in (1,2)');
SYSDM.qryQuery.Open;
while not SYSDM.qryQuery.Eof do
begin
lbFunction.Items.Add(SYSDM.qryQuery.Fields[0].AsString);
SYSDM.qryQuery.Next;
end;
if trim(RichEdit1.Text)<>'' then
RichEdit1.Text:=GetFunct(RichEdit1.Text,AItemID,AItemNm,AType)
else
RichEdit1.Text:=AItemNm+':=;';
RichEdit1.SetFocus;
end;
procedure THwFormulaForm.ScripterCompileError(Sender: TObject;
var msg: String; row, col: Integer; var ShowException: Boolean);
begin
//語法錯誤在:行 列
ShowMsg(GetDBString('FUN10001010')+IntToStr(Row)+GetDBString('FUN10001011')+IntToStr(Col)+#13+Scripter.SourceCode.Text,1);
SetCursor(RichEdit1,Col,Row,True);
Abort;
end;
procedure THwFormulaForm.lbItemDblClick(Sender: TObject);
var
S:String;
begin
//項目
S:='{'+lbItem.Items[lbItem.ItemIndex]+'}';
InsertText(RichEdit1,S);
end;
procedure THwFormulaForm.lbFunctionDblClick(Sender: TObject);
var
S:String;
begin
//函數
S:='['+lbFunction.Items[lbFunction.ItemIndex]+']';
InsertText(RichEdit1,S);
end;
procedure THwFormulaForm.ActUndoExecute(Sender: TObject);
begin
//恢復
RichEdit1.Undo;
end;
procedure THwFormulaForm.sbIfClick(Sender: TObject);
begin
//如果
InsertText(RichEdit1,'if ');
end;
procedure THwFormulaForm.sbThenClick(Sender: TObject);
begin
//那么
InsertText(RichEdit1,'then ');
end;
procedure THwFormulaForm.sbElseClick(Sender: TObject);
begin
//否則
InsertText(RichEdit1,'else ');
end;
procedure THwFormulaForm.sbOrClick(Sender: TObject);
begin
//或
InsertText(RichEdit1,'or ');
end;
procedure THwFormulaForm.sbAndClick(Sender: TObject);
begin
//且
InsertText(RichEdit1,'and ');
end;
procedure THwFormulaForm.SpeedButton6Click(Sender: TObject);
begin
//+
InsertText(RichEdit1,'+ ');
end;
procedure THwFormulaForm.SpeedButton7Click(Sender: TObject);
begin
//-
InsertText(RichEdit1,'- ');
end;
procedure THwFormulaForm.SpeedButton8Click(Sender: TObject);
begin
//*
InsertText(RichEdit1,'* ');
end;
procedure THwFormulaForm.sbDivClick(Sender: TObject);
begin
//
InsertText(RichEdit1,'/ ');
end;
procedure THwFormulaForm.SpeedButton10Click(Sender: TObject);
begin
//=
InsertText(RichEdit1,'= ');
end;
procedure THwFormulaForm.SpeedButton11Click(Sender: TObject);
begin
//>
InsertText(RichEdit1,'> ');
end;
procedure THwFormulaForm.SpeedButton12Click(Sender: TObject);
begin
//<
InsertText(RichEdit1,'< ');
end;
procedure THwFormulaForm.SpeedButton13Click(Sender: TObject);
begin
//(
InsertText(RichEdit1,'( ');
end;
procedure THwFormulaForm.SpeedButton14Click(Sender: TObject);
begin
//<>
InsertText(RichEdit1,'<> ');
end;
procedure THwFormulaForm.SpeedButton15Click(Sender: TObject);
begin
//>=
InsertText(RichEdit1,'>= ');
end;
procedure THwFormulaForm.SpeedButton16Click(Sender: TObject);
begin
//<=
InsertText(RichEdit1,'<= ');
end;
procedure THwFormulaForm.SpeedButton17Click(Sender: TObject);
begin
//)
InsertText(RichEdit1,') ');
end;
procedure THwFormulaForm.RichEdit1Change(Sender: TObject);
begin
if not Showing then Exit;
if not Active then Exit;
CodeColors(RichEdit1,True);
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -