コンソールを使用

Windows システムでは,コンソール・ウィンドウは一般的に文字の入出力を許可します (グラフィックスは許可しません)。

コンソール・ウィンドウは,プログラマに対してコマンド行での対話の利用を許可しています。たとえば,「Compaq Visual Fortran」プログラム・フォルダの「Fortran Command Prompt」は,Visual Fortran 環境変数が定義されているコマンド行環境を提供しています。同様に,オペレーティング・システムが提供する「コマンド プロンプト」は,汎用コマンド行コンソール環境を提供しています。

アプリケーションがコンソール・ウィンドウを使用する主な目的は,文字を表示し,文字を受け付けるためです。たとえば,Fortran WRITE (または他の) 文を使って Fortran 論理装置 6 に書き出されたデータは,コンソール・ウィンドウに文字として表示されます。同様に,Fortran READ (または他の) 文を使って Fortran 論理装置 5 から読み込まれたデータは,キーボードからの文字入力として受け付けられます。

コンソールは,2 つの要素で構成されています。

コンソール・スクリーン・バッファがコンソール・ウィンドウよりも大きい場合,スクロールバーが自動的に提供されます。コンソール・スクリーン・バッファの大きさは,コンソール・ウィンドウの大きさよりも大きく (または等しく) なければなりません (そうでなければエラーが発生します)。

200 行以上のテキストを表示する必要のあるアプリケーションに対して,テキストを素早くスクロールできることは重要です。コンソール・スクリーン・バッファの最大値は,Windows オペレーティング・システムによって異なります。

Fortran Console アプリケーションは,自動的にコンソール・ウィンドウを提供します。Fortran QuickWin (および Fortran Standard Graphics) アプリケーションは,コンソール・ウィンドウを提供しませんが,プログラム・ウィンドウを使うことによって Fortran 文からの出力の表示と入力の受け付けを行うことができます。

個々の Visual Fortran プロジェクト・タイプ がコンソール・ウィンドウを提供するかしないかを以下の表に示します。

プロジェクト・タイプ コンソールを提供するかどうか
Fortran Console テキストのみを使用するキャラクタ・セル・アプリケーションの作成を目的にしているので,コンソール・ウィンドウが提供されます。

「Fortran Command Prompt」または「コマンド プロンプト」から Fortran Console アプリケーションを実行すると,既存のコンソール環境が使用されます (同じウィンドウに表示されます)。「Windows エクスプローラ」または「Developer Studio」(「Build」メニューの「Execute program-name」をクリック) からFortran Console アプリケーションを実行すると,新しいコンソール環境が作成されます (新しいウィンドウが表されます)。コンソールが既存の「コマンド プロンプト」か「Windows エクスプローラ」または「Developer Studio」で作成されたものかには,そんなに大きな違いはありませんが,Windows NT, Windows XP と Windows 2000 システムは Windows 98,Windows Me,および Windows 95 システムよりもかなり大きな容量を持っています。

コンソールの基本的な使用方法については,「コンソールの使用のためのプログラム例」を参照してください。

Fortran QuickWin または Fortran Standard Graphics コンソール・ウィンドウを提供しませんが,装置 6 への出力と装置 5 からの入力はアプリケーション・プログラム・ウィンドウに対して直接行われます。アプリケーション・プログラム・ウィンドウは,テキストとグラフィックスの両方を取り扱うことができます。しかしながら,アプリケーション・プログラム・ウィンドウがテキストとグラフィックスの両方を取り扱わなければならないため,テキストのみを使うものより大変効率がよくありません。Fortran QuickWin または Fortran Standard Graphics のプログラム・ウィンドウ (または子ウィンドウ) は,コンソールに似たウィンドウを提供します。

詳細は,「Fortran QuickWin および Fortran Standard Graphics アプリケーションでのコンソールの使用」を参照してください。

Fortran Windows コンソール・ウィンドウを提供しませんが,Win32 ルーチンを使ってコンソール・ウィンドウを作成することができます。詳細は,「Fortran Windows および Fortran DLL アプリケーションでのコンソールの使用」を参照してください。
Fortran DLL コンソール・ウィンドウを提供しませんが,Win32 ルーチンを使ってコンソール・ウィンドウを作成することができます。詳細は,「Fortran Windows および Fortran DLL アプリケーションでのコンソールの使用」を参照してください。
Fortran Static Library ライブラリー中のオブジェクト・コードを参照する主アプリケーションのプロジェクト・タイプに依存します (上記のプロジェクト・タイプを参照)。

以下で説明する Win32 ルーチンに加えて,コンソールの使用に関連した他の Win32 ルーチンがあります。詳細は,「Platform SDK」オンライン・ドキュメントの「Windows Base Services」の「File and I/O」の「Consoles and Character-Mode Support」を参照してください。

Fortran QuickWin および Fortran Standard Graphics アプリケーションでのコンソールの使用

Fortran QuickWin または Fortran Standard Graphics アプリケーションでは,基本プログラム・ウィンドウがグラフィックスとテキストの両方を取り扱うため,QuickWin ウィンドウの使用は余り効率的ではありません。

たとえ WRITE および READ (または他の) 文を使ってコンソール・ウィンドウにアクセスすることができるといっても,大量のテキスト行を表示する必要があるアプリケーションは,効率をよくするには,別のコンソール・ウィンドウを作成する DLL を作成すること検討してください。DLL アプリケーションは,コンソールを割り付け,テキストを表示し,キーボードからの入力を受け付け,コンソール・リソースを開放するための Win32 ルーチンを呼び出す必要があります。

コンソールを作成し,使用する DLL を使用する Fortran QuickWin プロジェクトに関しては,...\Df98\Samples\QuickWinCONAPP Visual Fortran サンプルを参照してください。

コンソールの基本的な使用方法については,「コンソールの使用のためのプログラム例」を参照してください。

Fortran Windows および Fortran DLL アプリケーションでのコンソールの使用

Fortran Windows または Fortran DLL アプリケーションでは,コンソールが作成される前に WRITE および READ (または他の) 文を使ってコンソールに入出力を行おうとすると,実行時エラーが発生します。

Fortran DLL が作成したコンソールは,主アプリケーションに関連したアプリケーション・コンソール・ウィンドウとは性質が異なっています。Fortran DLL アプリケーションは,自分用に作成したコンソールもアプリケーション・ウィンドウも持っていないので,Win32 ルーチンを使って自分用のコンソールを作成 (割り付け) しなければなりません。Fortran QuickWin または Fortran Standard Graphics アプリケーションの主プログラムを一緒に使用する場合,Fortran DLL はテキストのみを使用するために大変効率のよりコンソール・ウィンドウを主アプリケーションに提供します。

Fortran DLL アプリケーションと同様に,Fortran Windows アプリケーションは,自分用に作成したコンソールもアプリケーション・ウィンドウも持っていないので,Win32 ルーチンを使って自分用のコンソールを作成しなければなりません。Fortran DLL でコンソールを割り付けた後,GetStdHandle Win32 ルーチンが返すハンドル識別子は DLL が作成した実際のコンソールを参照します。

Fortran Windows アプリケーションがコンソール・ウィンドウを作成すると,それはテキストのみを使用するために大変効率がよいものです。GetStdHandle Win32 ルーチンが返すハンドル識別子は,Fortran Windows アプリケーションが作成した実際のコンソールを参照します。

コンソールの作成についての詳細は,「コンソールの割付けと割付け解除」を参照してください。

コンソールの使用のためのプログラム例

以下の節は,コンソールの使用のためのプログラム例を示しています。

コンソールの割付けと割付け解除

コンソールを作成するには,AllocConsole ルーチンを使用します。コンソールでの作業が終了すると,FreeConsole ルーチンでリソースを開放します。たとえば,以下のプログラムは,コンソールを割り付け,バッファの大きさを大きくし,画面に書き出し,何らかのキーが押されるまで停止し,そしてコンソールを開放します。

	! 以下の USE 文は Win32 ルーチンのための Fortran インタフェースを読み込んでいます
	USE DFWIN
	! データ宣言
	integer lines,length
	logical status
	integer handle
	Type(T_COORD) wpos

	! バッファの大きさを設定します
	length = 80
	lines  = 90
	! コンソールを割り付けます
	status = AllocConsole() ! 現在設定されている大きさでコンソール・ウィンドウを得ます
	handle = GetStdHandle(STD_OUTPUT_HANDLE)
	wpos.x = length   ! 現在設定されている行の長さより大きくなければなりません
	wpos.y = lines    ! 現在設定されている行数より大きくなければなりません
	! コンソール・バッファをコンソール・ウィンドウよりも大きく設定します
	! これは,コンソール・バッファをスクロールするためのスクロールバーを提供します
	status = SetConsoleScreenBufferSize(handle, wpos)

	! 必要に応じて画面に書き出します。割付け解除前に READ 文で停止させます
	write (*,*) "This is the console output! It might display instructions or data "
	write (*,*) " "
	write (*,*) "Press any key when done viewing "
	read (*,*)
	! リソースを開放するためのコンソールの割付けを解除します
	status = FreeConsole()

Win32 ルーチンの呼び出しについては,「WIN32 ルーチンの呼び出し」で説明しています。

DLL を使用する場合,DLL プログラムは,副プログラムを作成し,それらのシンボルを主プログラムにエクスポートする必要があります (「Fortran DLL の作成」を参照)。

コンソールの基本的な使用方法については,「コンソール・ウィンドウとコンソール・バッファの大きさの拡大」と「カーソル位置での文字の書き込みと読み取り」で説明しています。

コンソール・ウィンドウとコンソール・バッファの大きさの拡大

Fortran Console アプリケーションを実行した場合,コンソールは既に割り付けられています。コンソール・ウィンドウの大きさ,コンソール・バッファの大きさ,カーソルの位置を指定することができます。

必要に応じて,以下の Win32 ルーチンを使用してコンソール・バッファとコンソール・ウィンドウの大きさを拡大することができます。

  1. まず,GetStdHandle ルーチンを使用して,コンソール・ウィンドウのハンドルを得る必要があります。以下に例を示します。

    	! USE 文を使って必要なインタフェースを読み込みます
    	use dflib
    	use dfwin
    	! データ宣言
    	integer fhandle
    	logical lstat
    
    	! コンソール・ウィンドウのハンドルを得ます
    	fhandle = GetStdHandle(STD_OUTPUT_HANDLE)
    	! ...
    
  2. 必要に応じて,以下の情報を入手します。

    • GetConsoleWindowInfo ルーチンを使ってコンソール・ウィンドウの情報を得ます。

    • GetConsoleScreenBufferInfo ルーチンを使ってコンソール・バッファの情報を得ます。

    以下に例を示します。

    	! USE 文を使って必要なインタフェースを読み込みます
    	use dflib
    	use dfwin
    	! データ宣言
    	integer fhandle
    	logical lstat
    	type(T_CONSOLE_SCREEN_BUFFER_INFO) conbuf
    	type (T_COORD)      dwSize
    	type (T_SMALL_RECT) srWindow
    
    	! コンソール・ウィンドウのハンドルを得ます
    	fhandle = GetStdHandle(STD_OUTPUT_HANDLE)
    
    	! コンソール・バッファの大きさを得ます
    	lstat = GetConsoleScreenBufferInfo(fhandle, conbuf)
    	write (*,*) " "
    	write (*,*) "Window coordinates= ", conbuf.srWindow
    	write (*,*) "Buffer size= ", conbuf.dwSize
    
    	! ...
    
  3. コンソール・ウィンドウとコンソール・バッファの大きさを設定するには,前もって入手しておいた fhandle と一緒に SetConsoleWindowInfoSetConsoleScreenBufferSize ルーチンを使用します。

    	! USE 文を使って必要なインタフェースを読み込みます
    	use dflib
    	use dfwin
    	! データ宣言
    	integer nlines, ncols
    	logical lstat
    	type(T_COORD) wpos
    	type(T_SMALL_RECT) sr
    	type(T_CONSOLE_SCREEN_BUFFER_INFO) cinfo
    
    	! コンソール・ウィンドウの大きさを設定します
    	sr.top    =   0
    	sr.left   =   0
    	sr.bottom =   40 ! コンソール・バッファの高さ -1 以下
    	sr.right  =   60 ! コンソール・バッファの幅 -1 以下
    	lstat = SetConsoleWindowInfo(fhandle, .TRUE., sr)
    
    	! コンソール・バッファの大きさを設定します
    	nlines = 100
    	ncols  =  80
    	wpos.x = ncols  ! 列はコンソール・ウィンドウの幅以上
    	wpos.y = nlines ! 行はコンソール・ウィンドウの高さ以上
    	lstat = SetConsoleScreenBufferSize(fhandle, wpos)
    	! ...
    

カーソル位置での文字の書き込みと読み取り

画面に文字を書き出す前に,SetConsoleCursorPosition ルーチンを使用して,カーソル位置を設定することができます。

	! 前述のデータ宣言を使用します
	! 位置を設定します
	wpos.x = 5 ! 左から 6 文字目
	wpos.y = 5 ! 6 行下
	lstat = SetConsoleCursorPosition(fhandle, wpos)
	write(*,*) 'Six across Six down'
	! ...

画面の適切な場所から読み取ることができますが,通常,開始画面位置からの相対位置にカーソルを設定すべきです。

	! 前述のデータ宣言を使用します
	CHARACTER(Len=50) charin
	! 画面の最初の場所に戻ります
	wpos.x = 0 ! 左から 0 文字目
	wpos.y = 0 ! 0 行下
	lstat = SetConsoleCursorPosition(fhandle, wpos)
	! 11 行目の先頭から文字入力を行います
	wpos.x = 0 ! 左から 0 文字目
	wpos.y = 10 ! 11 行下
	lstat = SetConsoleCursorPosition(fhandle, wpos)
	read(*,*) charin
	! ...

コンソール I/O に対して,WriteConsoleLineReadConsoleLine の Win32 ルーチンを Fortran WRITEREAD 文の代わりに使用することができます。