📄 evaldlg.pas
字号:
unit EvalDlg;
{$O+,F+,S-,X+}
interface
uses Objects, Drivers, Views, Dialogs;
const
cmEvaluate = 1030;
cmModify = 1031;
type
PEvalDialog = ^TEvalDialog;
TEvalDialog = object(TDialog)
Expression: PInputLine;
Result: PInputLine;
NewValue: PInputLine;
ModifyButton: PButton;
constructor Init;
constructor Load(var S: TStream);
procedure HandleEvent(var Event: TEvent); virtual;
procedure SetData(var Rec); virtual;
procedure Store(var S: TStream);
end;
const
REvalDialog: TStreamRec = (
ObjType: 3010;
VmtLink: Ofs(TypeOf(TEvalDialog)^);
Load: @TEvalDialog.Load;
Store: @TEvalDialog.Store
);
implementation
uses App, TVars, Compiler, Controls, Context, StrNames;
constructor TEvalDialog.Init;
var
R: TRect;
begin
R.Assign(10, 3, 69, 18);
TDialog.Init(R, 'Evaluate and Modify');
Options := Options or ofCentered;
R.Assign(3, 3, 38, 4);
Expression := PInputLine(SetHelp(New(PEditLine, Init(R, 127)), hcExpression));
Insert(Expression);
Insert(StandardLabel('E~x~pression', Expression, lfTop));
Insert(StandardHistory(Expression, hlExpression));
R.Move(0, 3);
Result := PInputLine(SetHelp(New(PInputLine, Init(R, 255)), hcResult));
Insert(Result);
Insert(StandardLabel('~R~esult', Result, lfTop));
R.Move(0, 3);
NewValue := PInputLine(SetHelp(New(PInputLine, Init(R, 127)), hcNewValue));
Insert(NewValue);
Insert(StandardLabel('~N~ew value', NewValue, lfTop));
Insert(StandardHistory(NewValue, hlNewValue));
Insert(NewButton(43, 3, 13, '~E~valuate', cmEvaluate, bfDefault,
hcEvaluateButton));
ModifyButton := NewButton(43, 6, 13, '~M~odify', cmModify, bfNormal,
hcModifyButton);
Insert(ModifyButton);
Insert(NewButton(43, 9, 13, 'Cancel', cmCancel, bfNormal, hcCnlButton));
Insert(NewButton(43, 12, 13, 'Help', cmHelp, bfNormal, hcEvaluateDialog));
SelectNext(False);
end;
constructor TEvalDialog.Load(var S: TStream);
begin
TDialog.Load(S);
GetSubViewPtr(S, Expression);
GetSubViewPtr(S, Result);
GetSubViewPtr(S, NewValue);
GetSubViewPtr(S, ModifyButton);
end;
procedure TEvalDialog.HandleEvent(var Event: TEvent);
procedure Eval(Modi: Boolean);
var
P: PInputLine;
L: Longint;
CanModify: Boolean;
begin
if Expression^.Data^ <> '' then
begin
P := Expression;
L := Evaluate(P^.Data^, Result^.Data^, CanModify);
if L = 0 then
begin
if Modi and (NewValue^.Data^ <> '') then
begin
if not CanModify then
L := 65536 + 60
else
begin
P := NewValue;
L := Modify(P^.Data^, Result^.Data^);
if L = 0 then
Message(Desktop, evDebugger, cmRefreshInfo, nil);
end;
end else
begin
NewValue^.Data^ := '';
NewValue^.SelectAll(False);
end;
end;
P^.Select;
P^.SelectAll(True);
if L <> 0 then
begin
Result^.Data^ := Strings^.Get(LongRec(L).Lo + sErrorBase);
P^.CurPos := LongRec(L).Hi - 1;
P^.DrawView;
end;
Result^.DrawView;
end;
ClearEvent(Event);
end;
begin
TDialog.HandleEvent(Event);
case Event.What of
evCommand, evBroadcast:
case Event.Command of
cmEvaluate:
Eval(False);
cmModify:
Eval(True);
cmReleasedFocus, cmReceivedFocus:
if Event.InfoPtr = NewValue then
ModifyButton^.MakeDefault(Event.Command = cmReceivedFocus);
end;
end;
end;
procedure TEvalDialog.SetData(var Rec);
begin
Expression^.SetData(Rec);
end;
procedure TEvalDialog.Store(var S: TStream);
begin
TDialog.Store(S);
PutSubViewPtr(S, Expression);
PutSubViewPtr(S, Result);
PutSubViewPtr(S, NewValue);
PutSubViewPtr(S, ModifyButton);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -