Windows システムでは,コンソール・ウィンドウは一般的に文字の入出力を許可します (グラフィックスは許可しません)。
コンソール・ウィンドウは,プログラマに対してコマンド行での対話の利用を許可しています。たとえば,「Compaq Visual Fortran」プログラム・フォルダの「Fortran Command Prompt」は,Visual Fortran 環境変数が定義されているコマンド行環境を提供しています。同様に,オペレーティング・システムが提供する「コマンド プロンプト」は,汎用コマンド行コンソール環境を提供しています。
アプリケーションがコンソール・ウィンドウを使用する主な目的は,文字を表示し,文字を受け付けるためです。たとえば,Fortran WRITE (または他の) 文を使って Fortran 論理装置 6 に書き出されたデータは,コンソール・ウィンドウに文字として表示されます。同様に,Fortran READ (または他の) 文を使って Fortran 論理装置 5 から読み込まれたデータは,キーボードからの文字入力として受け付けられます。
コンソールは,2 つの要素で構成されています。
画面に文字を表示する実際のコンソール・ウィンドウ。
表示される文字を含むコンソール・バッファ。
コンソール・スクリーン・バッファがコンソール・ウィンドウよりも大きい場合,スクロールバーが自動的に提供されます。コンソール・スクリーン・バッファの大きさは,コンソール・ウィンドウの大きさよりも大きく (または等しく) なければなりません (そうでなければエラーが発生します)。
200 行以上のテキストを表示する必要のあるアプリケーションに対して,テキストを素早くスクロールできることは重要です。コンソール・スクリーン・バッファの最大値は,Windows オペレーティング・システムによって異なります。
Windows 98,Windows Me,または Windows 95 システムでは,文字行数は 132 文字行でおよそ 40 ~ 50 ページの出力に限定されます。
Windows NT, Windows XP,または Windows 2000 システムでは,文字行数は Windows 98,Windows Me,および Windows 95 システムよりも十分大きくなっています。
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 ウィンドウの使用は余り効率的ではありません。
QuickWin ウィンドウは,大量のメモリーを使用するため,ある大きさよりも大きくすることができません。
スクロールが遅くなります。
たとえ WRITE および READ (または他の) 文を使ってコンソール・ウィンドウにアクセスすることができるといっても,大量のテキスト行を表示する必要があるアプリケーションは,効率をよくするには,別のコンソール・ウィンドウを作成する DLL を作成すること検討してください。DLL アプリケーションは,コンソールを割り付け,テキストを表示し,キーボードからの入力を受け付け,コンソール・リソースを開放するための Win32 ルーチンを呼び出す必要があります。
コンソールを作成し,使用する DLL を使用する Fortran QuickWin プロジェクトに関しては,...\Df98\Samples\QuickWin の CONAPP 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 アプリケーションが作成した実際のコンソールを参照します。
コンソールの作成についての詳細は,「コンソールの割付けと割付け解除」を参照してください。
以下の節は,コンソールの使用のためのプログラム例を示しています。
Fortran Windows および DLL アプリケーションのためのコンソールの割付けと割付け解除
全てのプロジェクト・タイプに共通してコンソールを使用するためのコンソール・ウィンドウとコンソール・バッファの大きさの拡大
全てのプロジェクト・タイプに共通してコンソールを使用するためのカーソル位置での文字の書き込みと読み取り
コンソールを作成するには,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 ルーチンを使用してコンソール・バッファとコンソール・ウィンドウの大きさを拡大することができます。
まず,GetStdHandle ルーチンを使用して,コンソール・ウィンドウのハンドルを得る必要があります。以下に例を示します。
! USE 文を使って必要なインタフェースを読み込みます use dflib use dfwin ! データ宣言 integer fhandle logical lstat ! コンソール・ウィンドウのハンドルを得ます fhandle = GetStdHandle(STD_OUTPUT_HANDLE) ! ...
必要に応じて,以下の情報を入手します。
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 ! ...
コンソール・ウィンドウとコンソール・バッファの大きさを設定するには,前もって入手しておいた fhandle と一緒に SetConsoleWindowInfo と SetConsoleScreenBufferSize ルーチンを使用します。
! 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 に対して,WriteConsoleLine と ReadConsoleLine の Win32 ルーチンを Fortran WRITE と READ 文の代わりに使用することができます。