📄 main_.pas
字号:
end;
end;
//IVR节点被拖动后的事件
procedure Tmain.OnIVRPointMove(Sender: TObject; X, Y: Integer);
var
i: Integer;
tmpIVR: TIVRPoint;
begin
//寻找IVR事件的下一连接
for i := 0 to MAXEVENTCOUNT - 1 do
begin
if (TIVRPoint(Sender).IVREvent[i].Enable) then
begin
if (TIVRPoint(Sender).IVREvent[i].NextPoint >= 0) then
begin
tmpIVR := IVRIdToPoint(TIVRPoint(Sender).IVREvent[i].NextPoint);
TIVRPoint(Sender).DrawPathLine(i, tmpIVR.Left, tmpIVR.Top + 6);
end;
end;
end;
//定位上级事件
for i := 0 to TIVRPoint(Sender).UpLink.Count - 1 do
begin
tmpIVR := IVRIdToPoint(PUpData(TIVRPoint(Sender).UpLink[i]).UpID);
tmpIVR.DrawPathLine(
PUpData(TIVRPoint(Sender).UpLink[i]).UpEvent,
TIVRPoint(Sender).Left,
TIVRPoint(Sender).Top + 6);
end;
end;
//检查指定的IVR节点的哪一事件的下一节点ID是指定的ID号
function Tmain.GetEventIndexOfNextID(WhoIVR: TIVRPoint; NextID: Integer): Integer;
var
i: Integer;
begin
Result := -1;
for i := 0 to MAXEVENTCOUNT - 1 do
begin
if WhoIVR.IVREvent[i].NextPoint = NextID then
begin
Result := i;
Exit;
end;
end;
end;
//根据IVR的ID号,得到IVR的指针
function Tmain.IVRIdToPoint(ID: Integer): TIVRPoint;
var
i: Integer;
begin
i := IndexOfIVRList(ID);
if i >= 0 then
Result := TIVRPoint(ActiveTree.Items.Item[i].Data)
else
Result := nil;
end;
//IVR节点改名(改Caption)
procedure Tmain.actEditRenameExecute(Sender: TObject);
var
tmpIVR: TIVRPoint;
Node :TTreeNode;
s: String;
begin
Node := ActiveTree.Selected ;
tmpIVR :=TIVRPoint(Node.Data);
s := tmpIVR.Caption;
if clInputQuery('把“' + s + '”改名为……', '请尽量简短:', s) then
begin
tmpIVR.Caption := s;
Node.Text := IntToStr(tmpIVR.IVRMemo.ID) + '.' + s;
if Trim(tmpIVR.IVRMemo.iComment) = '' then
tmpIVR.IVRMemo.iComment := Copy(s, 1, 40);
end;
//修改子流程的名称 2002.09.04
if (tmpIVR.IVRMemo.iType = SubProcess) and (tmpIVR.Tag > 0) and (tmpIVR.IVRMemo.iContent = SubiContent ) then
begin
if Node.HasChildren then
begin
Node := Node.getFirstChild();
tmpIVR := TIVRPoint(Node.Data) ;
//2002.09.29
tag := 1 ;
TfcTreeNode(tmpIVR.IVRMemo.fcTreeNode).Text := s;
ViewMenu.Items[tmpIVR.IVRMemo.ParentID].Caption := s;
tag := 0;
end;
end;
end;
//根据是否选择了节点的实际情况,决定打开或者关闭某些动作。
procedure Tmain.SetSomeMenuEnable;
begin
if ActiveTree.Items.Count > 0 then
actEditDeleteIVR.Enabled := true
else
actEditDeleteIVR.Enabled := False;
actEditProperty.Enabled := actEditDeleteIVR.Enabled;
actEditRename.Enabled := actEditDeleteIVR.Enabled;
actEditInputPointer.Enabled := actEditDeleteIVR.Enabled;
end;
//连接两个IVR节点,并指定源节点的事件
procedure Tmain.ConnectIVR(SourceIVR, DescIVR: TIVRPoint; Event: Integer);
var
tmpIVR: TIVRPoint;
begin
//如果源IVR指定事件已经与目标IVR有连接,则不需要重复连接
if DescIVR.IndexOfUpLink(SourceIVR.IVRMemo.ID, Event) >= 0 then
Exit;
//如果源IVR的指定事件已经有连接的话,先断开连接
if SourceIVR.IVREvent[Event].NextPoint >= 0 then
begin
tmpIVR := IVRIdToPoint(SourceIVR.IVREvent[Event].NextPoint);
tmpIVR.DeleteUpLink(SourceIVR.IVRMemo.ID, Event);
end;
//增加连接
SourceIVR.IVREvent[Event].NextPoint := DescIVR.IVRMemo.ID;
DescIVR.AddUpLink(SourceIVR.IVRMemo.ID, Event);
//画线
SourceIVR.DrawPathLine(Event, DescIVR.Left, DescIVR.Top + 6);
end;
//在列表中选择下一IVR节点(事件的Popup菜单)
procedure Tmain.IVR3Click(Sender: TObject);
var
i: Integer;
begin
i := SelectIVR.Selec();
if i >= 0 then
begin
ConnectIVR(
ActiveTree.Selected.Data,
ActiveTree.Items.Item[i].Data,
tmpEventIndex);
end;
end;
//选择指定节点的指定事件(事件的Popup菜单)
procedure Tmain.N19Click(Sender: TObject);
begin
SelectIVRPointEvent(ActiveTree.Selected.Data, tmpEventIndex);
end;
//删除指定节点的指定事件(事件的Popup菜单)
procedure Tmain.N18Click(Sender: TObject);
var
tmpIVR: TIVRPoint;
i: Integer;
begin
//获得下一节点,并删除与其的连接
i := TIVRPoint(ActiveTree.Selected.Data).IVREvent[tmpEventIndex].NextPoint;
if i >=0 then
begin
tmpIVR := IVRIdToPoint(i);
tmpIVR.DeleteUpLink(TIVRPoint(ActiveTree.Selected.Data).IVRMemo.ID, tmpEventIndex);
end;
tmpIVR := ActiveTree.Selected.Data;
tmpIVR.SetEnable(tmpEventIndex, False);
tmpIVR.Refurbish(OnLineMouseDown);
end;
//根据iType, iContent和Index,定位在IVR属性队列里的位置
function Tmain.IndexOfPropertyList(iType, iContent,
Index: Integer): Integer;
var
i: Integer;
tmpProperty: PIVRPropertyData;
begin
Result := -1;
for i := 0 to IVRPropertyData.Count - 1 do
begin
tmpProperty := IVRPropertyData[i];
if (tmpProperty.iType = iType) and (tmpProperty.iContent = iContent) and (tmpProperty.Index = Index) then
begin
Result := i;
Exit;
end;
end;
end;
//根据iType, iContent和Index,定位在IVR事件队列里的位置
function Tmain.IndexOfEventList(iType, iContent, Index: Integer): Integer;
var
i: Integer;
tmpEvent: PIVREventData;
begin
Result := -1;
for i := 0 to IVREventData.Count - 1 do
begin
tmpEvent := IVREventData[i];
if (tmpEvent.iType = iType) and (tmpEvent.iContent = iContent) and (tmpEvent.Index = Index) then
begin
Result := i;
Exit;
end;
end;
end;
//窗体显示事件
procedure Tmain.FormShow(Sender: TObject);
begin
actFileCloseExecute(Sender);
FlashForm.Free();
end;
//新建一个项目
procedure Tmain.actFileNewExecute(Sender: TObject);
var
i: Integer;
begin
SaveDialog.Title := '建立一个空的IVR Studio项目文件';
if SaveDialog.Execute() then
begin
if actFileClose.Enabled then
actFileCloseExecute(Sender);
ProjectName := SaveDialog.FileName;
Main.Caption := Application.Title + ' - v' + clGetAppVersion(Application.ExeName) +
' [' + ExtractFileName(ProjectName) + ']';
for i := 0 to MenuCount - 1 do
begin
IVRType[i].Enabled := true;
end;
actFileClose.Enabled := True;
actFileSave.Enabled := True;
actFileSaveAs.Enabled := True;
actImport.Enabled := True;
ActiveBox.HorzScrollBar.Range := DefaultWidth;
ActiveBox.VertScrollBar.Range := DefaultHeight;
CreateDate := Now();
Writer := DefaultWrite;
AddIVRPoint(StartCaption, StartType, StartContent, 1,0);
NowID := 2;
end;
end;
//关闭一个项目
procedure Tmain.actFileCloseExecute(Sender: TObject);
var
i: Integer;
tmpMenuItem:TMenuItem;
begin
ActiveBox.Visible := False;
ActiveTree.Visible := False;
ForceIVR(nil);
DeSelectIVRPointEvent();
DelNode();
IsCopy := false ;
CopySource := nil ;
for i := 0 to MenuCount - 1 do
begin
IVRType[i].Enabled := False;
end;
actFileClose.Enabled := False;
actFileSave.Enabled := False;
actFileSaveAs.Enabled := False;
actImport.Enabled := False;
ProjectName := '';
Main.Caption := Application.Title + ' - v' + clGetAppVersion(Application.ExeName);
SetSomeMenuEnable();
NodeList.Clear();
NodeList.Add(nil);
fcNodeList.Clear();
fcNodeList.Add(nil);
for i:= 1 to BoxList.Count -1 do
begin
TCLScrollBox(BoxList.Items[i]).free();
end;
for i := 1 to ViewMenu.Count -1 do
begin
tmpMenuItem := ViewMenu.Items[ViewMenu.Count - 1];
tmpMenuItem.Free();
end;
while ViewMenu.Count >1 do
begin
ViewMenu.Delete(ViewMenu.Count - 1);
end;
ViewMenu.Tag := 0;
ActiveBox := MainBox;
ActiveBox.Tag := 0;
BoxList.Clear();
BoxList.Add(ActiveBox);
ActiveBox.BringToFront();
ActiveBox.Visible := True;
ActiveTree.Visible := True;
//2002.9.24
{
ComSrocllBox.Items.Clear();
ComSrocllBox.Items.Add(IntToStr(ActiveBox.Tag)+'[主流程]');
ComSrocllBox.ItemIndex := 0;
}
fcTreeCombo1.Items.Clear();
SetfcTreeCom(nil,'主流程');
{
fcNode := fcTreeCombo1.Items.AddChild(nil,IntToStr(ActiveBox.Tag)+'[主流程]');
fcTreeCombo1.SetSelectedNode(fcNode);
fcNode.StringData := IntToStr(ActiveBox.Tag);
fcTreeCombo1.Text := fcTreeCombo1.SelectedNode.Text;
}
StatusBar1.Panels.Items[3].Text := '';
StatusBar1.Panels.Items[4].Text := '';
ActiveTree.Tag := 1 ;
ActiveTree.Items.Clear();
ActiveTree.Tag := 0 ;
end;
//打开一个项目
procedure Tmain.actFileOpenExecute(Sender: TObject);
begin
OpenDialog.Title := '打开一个IVR Studio项目文件';
if OpenDialog.Execute() then
begin
NewOpenProject(OpenDialog.FileName);
end;
end;
//显示指定IVR节点的指定事件的下一节点资料(事件的Popup菜单)
procedure Tmain.N22Click(Sender: TObject);
var
s: String;
i: Integer;
begin
i := TIVRPoint(ActiveTree.Selected.Data).IVREvent[tmpEventIndex].NextPoint;
if i >= 0 then
begin
s := '下一IVR节点的ID号为:' + IntToStr(i) + #13 + #10 +
'名称为:' + IVRIdToPoint(i).Caption + #13 + #10 +
'是否直接定位到下一节点?';
if clSureBoxEx(s) then
CenterIVR(i);
end else begin
clMsgBox('没有下一节点', MB_ICONERROR);
end;
end;
//项目另存为的动作
procedure Tmain.actFileSaveAsExecute(Sender: TObject);
begin
SaveDialog.Title := '另存为……';
if SaveDialog.Execute() then
begin
ProjectName := SaveDialog.FileName;
Main.Caption := Application.Title + ' - v' + clGetAppVersion(Application.ExeName) +
' [' + ExtractFileName(ProjectName) + ']';
actFileSaveExecute(Sender);
end;
end;
//显示指定节点的座标,并允许手工修改的动作
procedure Tmain.actEditInputPointerExecute(Sender: TObject);
var
X, Y: Integer;
CaptionString, S: String;
tmpIVR: TIVRPoint;
begin
try
tmpIVR := TIVRPoint(ActiveTree.Selected.Data);
X := tmpIVR.TureLeft;
Y := tmpIVR.TureTop;
CaptionString := tmpIVR.Caption;
if not(clSureBoxEx('节点名称:' + CaptionString + #13 + #10 +
'坐 标 值:X = ' + IntToStr(X) + ', Y = ' + IntToStr(Y) +
#13 + #10 + '现在手工编辑座标值?')) then
begin
Exit;
end;
s := IntToStr(X);
if clInputQuery('', '输入新的X坐标', s) then
X := StrToInt(s)
else
Exit;
s := IntToStr(Y);
if clInputQuery('', '输入新的Y坐标', s) then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -