⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_.pas

📁 以可视的方式画IVR语音导航的流程,并把流程做为源文件保存起来
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    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 + -