raosc 发表于 2024-12-7 10:15:56

请教,输入输出黑色视窗不出现的原因

请教:在给从前写的fortran加了一个对话框截面后,原来程序运行时闪出来的输入输出黑色视窗(就是我们常用来测试软件安装是否成功时写“hi world!”出现的视窗)不再出现了,程序也不往下走了,这是缺少什么语句?

楚香饭 发表于 2024-12-7 10:53:58

请给出以下信息:
1. 你使用什么操作系统,使用什么编译器?
2. 选择的什么类型的工程?(Console / QuickWin / Win32 APP )
3. 给出必要代码或截图

raosc 发表于 2024-12-7 12:31:56

win10系统,用的是vs fortran+winteracter
Console
代码贴进来不会

raosc 发表于 2024-12-7 12:33:50

       Module Global
         Use Winteracter      !// 使用 Winteracter
         Use Resid            !// 使用 Resid 资源ID
         Implicit None
       End Module Global
!
       PROGRAM dushu
       Use Global
       Implicit None
! 参数定义
       TYPE(WIN_MESSAGE):: MESSAGE
       LOGICAL :: QUIT=.FALSE.
       INTEGER :: ITYPE,I,J,ijk
! 需要通过界面对话框读入下面的数据
       INTEGER :: NVC,NPC,NJQ,NN            ! 竖曲线个数,平曲线个数,禁区个数
       REAL :: LSTART,LEND                  ! 起始里程,结束里程,最好涵盖所要的范围;
       REAL :: CHPL(105)                      ! 竖曲线的变坡点里程(NVC)
       REAL :: CHPR(105)                      ! 竖曲线的变坡点半径(NVC)
       REAL :: CHPI(106)                      ! 竖曲线的各段坡度 (NVC+1)
       REAL :: XYZ0(3)                        ! 平曲线第一导线点(起点)坐标(402.398,194.74622,230.000)
       REAL :: NALF                           ! 平曲线第一段导线方位角
       REAL :: JD(51)                         ! 导线长度累计,与曲线个数对应(NPC+1)
       REAL :: PR(50)                         ! 平曲线半径(NPC)
       REAL :: ALF(50)                        ! 导线相对前一导线的偏角,逆时针为正(NPC)
       REAL :: LS(50)                         ! 平曲线的缓和曲线长(NPC)
       REAL :: XXT(66),XDT(66)                ! 不可占用区域的起点里程和终点里程,必须前小后大成对出现
       REAL :: X(40000),Y(40000)            ! 不可占用区域的起点里程和终点里程,必须前小后大成对出现
!
      CALL WInitialise()                  ! 初始化窗口
      CALL WindowOpen(HideWindow)         ! 此演示不需要根窗口,因此要隐藏它
!开始窗口程序(用于替代原输入数据部分)               
      CALL WDialogLoad(IDD_DIALOG001)
      CALL WDialogShow(itype=Modeless)
!
      ijk=0
!****************************************************
         DO WHILE(.NOT.QUIT)   
         CALL WMessage(ITYPE,MESSAGE)         
            SELECT CASE (ITYPE)
            CASE (PushButton)
                  SELECT CASE (MESSAGE%VALUE1)
                  CASE (IDOK)                  
                   CALL WDialogGetInteger(IDF_INTEGER1,NVC)!获取输入的数据NVC
                   CALL WDialogGetInteger(IDF_INTEGER2,NPC)!获取输入的数据NPC
                   CALL WDialogGetInteger(IDF_INTEGER3,NJQ)!获取输入的数据NJQ
                   CALL WDialogGetInteger(IDF_INTEGER4,NN)   !获取输入的数据NJQ
                   CALL WDialogGetReal(IDF_REAL1,LSTART)   !获取输入的数据LSTART
                   CALL WDialogGetReal(IDF_REAL2,LEND)       !获取输入的数据LEND
                   CALL WDialogGetReal(IDF_REAL3,XYZ0(1))    !获取输入的数据XYZ0(1)
                   CALL WDialogGetReal(IDF_REAL4,XYZ0(2))    !获取输入的数据XYZ0(2)
                   CALL WDialogGetReal(IDF_REAL5,XYZ0(3))    !获取输入的数据XYZ0(3)
                   CALL WDialogGetReal(IDF_REAL6,NALF)       !获取输入的数据NALF
                   CALL WGridRows(IDF_GRID1,NVC+1)               !根据NVC确定表行数
                   CALL WGridRows(IDF_GRID2,NPC+1)               !根据NPC确定表行数
                   CALL WGridRows(IDF_GRID3,NJQ)                   !根据NJQ确定表行数
                   CALL WGridRows(IDF_GRID4,NN)                  !根据NJQ确定表行数
      if(ijk.eq.0)then
                  do i=1,NVC
                     CALL WGridGetCellReal(IDF_GRID1,2,i,CHPL(i))!获取输入的数据CHPL()
                     CALL WGridGetCellReal(IDF_GRID1,3,i,CHPR(i))!获取输入的数据CHPR()
                  end do
                  do i=1,NVC+1
                     CALL WGridGetCellReal(IDF_GRID1,4,i,CHPI(i))!获取输入的数据CHPI()
                  end do
                  do i=1,NPC
                     CALL WGridGetCellReal(IDF_GRID2,3,i,PR(i))    !获取输入的数据PR()
                     CALL WGridGetCellReal(IDF_GRID2,4,i,ALF(i))   !获取输入的数据ALF()
                     CALL WGridGetCellReal(IDF_GRID2,5,i,LS(i))    !获取输入的数据LS()
                  end do
                  do i=1,NPC+1
                     CALL WGridGetCellReal(IDF_GRID2,2,i,JD(i))    !获取输入的数据JD()
                  end do
      endif
      if(ijk.eq.1)then
                  do i=1,NJQ
                     CALL WGridGetCellReal(IDF_GRID3,2,i,XXT(i))   !获取输入的数据XXT()
                     CALL WGridGetCellReal(IDF_GRID3,3,i,XDT(i))   !获取输入的数据XDT()
                  end do
      endif
      if(ijk.eq.1)then
                  do i=1,NN
                     CALL WGridGetCellReal(IDF_GRID4,1,i,X(i))   !获取输入的数据X()
                     CALL WGridGetCellReal(IDF_GRID4,2,i,Y(i))   !获取输入的数据Y()
                  end do
      endif
                  QUIT=.FALSE.
                  CASE (IDCANCEL)
            QUIT=.TRUE.
            END SELECT
          END SELECT
          END DO
!****************************************************
      CALL WindowClose()
!
! 打开输出文件以验证读入数据的正确性
!      OPEN(3,FILE='FXX.SCR',STATUS='UNKNOWN')
!
         WRITE(*,555)"AAA"
         WRITE(*,774) NVC,NPC,NJQ,NN                ! 竖曲线个数,平曲线个数
         WRITE(*,772) LSTART,LEND                   ! 起始里程,结束里程,最好涵盖所要的范围;
         WRITE(*,773) XYZ0(1),XYZ0(2),XYZ0(3)       ! 平曲线第一导线点(起点)坐标(402.398,194.74622,230.000)
         WRITE(*,666) NALF                        ! 平曲线第一段导线方位角
         WRITE(*,555)"BBB"
       DO I=1,NVC,1
         WRITE(*,772) CHPL(I),CHPR(I)               ! 竖曲线的变坡点里程(NVC)
       end do
         WRITE(*,555)"CCC"
       DO I=1,NVC+1,1
         WRITE(*,666) CHPI(I)                     ! 竖曲线的各段坡度 (NVC+1)
       end do
         WRITE(*,555)"DDD"
       DO J=1,NPC,1
         WRITE(*,773) PR(J),ALF(J),LS(J)         ! 平曲线半径(NPC)
       end do
         WRITE(*,555)"EEE"
       DO J=1,NPC+1,1
         WRITE(*,666) JD(J)                        ! 导线长度累计,与曲线个数对应(NPC)
       end do
         WRITE(*,555)"FFF"
       DO J=1,NJQ,1
         WRITE(*,772) XXT(J),XDT(J)                ! 禁区小里程(NJQ)
       end do
         WRITE(*,555)"GGG"
       DO I=1,NN
         WRITE(*,772) X(I),Y(I)                  ! 地面线点X()
       end do
!
!      CLOSE(3)   ! 关闭文件
!
555    FORMAT(10A)
666    FORMAT(SP,F13.4)
772    FORMAT(SP,2F13.4)
773    FORMAT(SP,3F13.4)
774    FORMAT(SP,4I4)
      STOP
!
      END PROGRAM dushu

楚香饭 发表于 2024-12-7 17:45:33

本帖最后由 楚香饭 于 2024-12-7 17:52 编辑

37行有一个 Do While(.NOT.QUIT)
无限循环,只有当 QUIT 为 真,退出这个无限循环(消息循环)之后,后面的代码才会被执行。

如果你用了 winteracter 做了图形用户界面,通常需要把命令行的代码修改后,放在某个消息(例如点击某按钮)的处理过程中。

而不是放在退出消息循环之后,因为退出主消息循环,往往意味着图形用户界面就结束了。

如果你是看的本站的教程,那么会建议你新建工程时选择 Windows Application。但这会导致 Console 命令行界面不再出现。
这适合于代码完全采用图形用户界面,没有任何Console输入输出的程序。

但你的程序中,使用了部分图形用户界面,也同时使用了Console的输入输出交互。如果你希望保留Console命令行界面,请创建工程时选择Console工程类型。

页: [1]
查看完整版本: 请教,输入输出黑色视窗不出现的原因