したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

■■■20レス以内で済むF-BASICの質問はこちらへ■■■

1F橋:2003/12/19(金) 20:48
20レス以内程度(20回程度の投稿)で終わりそうなF-BASICの質問はこちらでお願いします
短い質問のスレッドがいくつも立つより1つのスレッドで固まっていた方が長期に渡り見ることができ
かつ保存も簡単かと…

(いや…私だけでなく…皆さんも簡単のはずなんですが…(汗(笑)))

掲示板の内容の長期保存にご協力頂ける様よろしくお願いします

521ken:2010/11/01(月) 18:43:46
>nisii様
ありがとうございます!やってみます!

522yothan:2010/11/18(木) 22:09:16
現在でも 使用されている方がおられるのですね
val("abcdefg") 等の文字列を数値変換できないですかね

523nisii:2010/11/19(金) 20:08:24
そのままではエラーになりますが、どのような結果をお望みでしょうか?
val( "123" )
なら、結果は123の数値になります。

524keinin:2010/12/24(金) 09:40:12
はじめまして。
F-BasicでAPI関数の「GetLastError」の使い方をご存知の方がおられましたらご教授ください。

525nisii:2010/12/25(土) 01:28:37
資料から推察すると、VisualBasic同様、正しいエラーコードは得られない可能性があります。
以下、実際の動作は未確認です。

var shared RC as long
declare function API_GELASTERROR& lib "KERNEL32" alias "GetLastError" ()

RC = API_GELASTERROR

526keinin:2010/12/25(土) 08:13:59
早速のご教授有難うございます。
サンプルの方法でエラーコードを取得しているのですがリターン値が常にゼロになります。F-BasicではGetLastError関数は使えないのでしょうか?

527nisii:2010/12/25(土) 13:09:00
はい、そう考えています。
VisualBasicでも、別の組み込み関数(プロパティ)を使ってエラーコードを得るのが常套のようですし。
F-BASICにはその組み込み関数も無いため、実現は困難かと。

528keinin55:2011/05/21(土) 13:44:48
どなたかご存知の方教えて下さい。
F−BASICでタスクトレイアイコン上でマウス操作された時のイベント「NOTIFYICON」はありますが、F−BASICコマンドでウィンドウをアイコン化してタスクトレイに表示する方法はあるのでしょうか?

529keinin55:2011/05/22(日) 07:29:03
昨日お尋ね致しましたタスクトレイに表示する方法はリファレンスの索引にありました。お騒がせいたしました。

530F橋:2011/05/24(火) 22:31:35
お役にたてず申し訳ございませんでした(汗

531keinin55:2011/06/23(木) 07:10:32
F-Basicはウィンドウプログラムを作るのにRADツールを使用しないで、OriosのActiveBasic講座(2-1)の様に自力で全部書く事は可能でしょうか?

532F橋:2011/07/02(土) 01:01:39
>>531
私には分かりません(汗
どなたか分かる方よろしくお願いします

533Gatefield:2011/07/26(火) 18:47:47
GETASYNCKEYSTATE 関数を使ってますが キーバッファー
によると思われる誤動作を起こします。
(while 〜 wend ループ内です)
そこで いったん キーバッファーをクリアする方法は
無いものでしょうか?
(現在は フラグで対処してますが やはり面倒です)

534名無しさん:2011/07/27(水) 18:43:44
簡易なキーバッファクリアでよければ

while inkey$><"" : wend

でいいと思いますが、押しっぱなしに対応するのはできません。
ご存知の方、お願いします

535Gatefield:2011/07/28(木) 20:41:22
ありがとうございます。
試してみましたがダメでした。
リストコントロールの中で キーチェックでGETASYNCKEYSTATE関数を
使用、 ENTERキーで選択した項目のリンクを実行するように
してますが 例えば リスト項目をエディットボックスで編集、
ENTERキーで確定して そこで止まってくれればいいのですが
ENTER の記憶が残っているのか リンク実行へ進んでしまいます。
どうも リストコントロールは 特殊みたいで 1回の キーイベントでは
その内容(キーの記録)がクリアできないみたいです。

inkey$ なら そのようなことは起きないのですが Ctrl+C とか Ctrl+V を
有効にするため あえてGETASYNCKEYSTATE関数 を使っています。

何か よい方法があれば お教えください。

536nisii:2011/08/30(火) 06:36:55
今更ですが…。
いったんEnterを受け付けた直後は、Enterが押されている間先には進まないようにしてみては。

537Gatefield:2011/09/01(木) 21:01:34
ありがとうございます。
さっそく試してみました。
gosub *キーチェック で
while GETASYNCKEYSTATE(&HD):*****:wend
**** で shell で外部プログラムを走らせて
"exit" ENTER 復帰させるつもりが 再び同じコマンド
shellによる外部プログラムが立ち上がります。(とまらない!)
そこで **** に

while GETASYNCKEYSTATE(&HD)
wend

を入れ Enterが押されてる間 ループするように
離れたらもとのメインループに戻るようにしてみたんですが
やはり 改善されませんでした。
(プラットホーム環境のせいかもしれません)

どこか 勘違いや バグがあるのかも・・・・

とりあえず フラグで防止できるので
それで 擬似的に我慢してます。

(デフォルト0 shell実行でー1
他のキー操作で0に戻して・・・・
複雑になるし 他の障害も・・・・(;_;)

でも
どうも いろいろ ありがとうございます。
_(._.)_
このHP とても勉強になります。
これからも よろしくお願いします。

538nisii:2011/09/03(土) 19:13:00
そうですか。
フラグで解決するにしても、while wendでキー待ちループなどを作る場合は、
wait 5などを必ずはさむことをお勧めします。
でないと猛烈な負荷がかかることになり、誤検出の原因になったりもしますので。

539Gatefield:2011/09/05(月) 20:35:08
レス ありがとうございます。
さっそく試してみました。
いろいろ 試してみたのですが
XP(1GHちょっと) では OK window7(2GHZくらい) NG
と なりました。
ハードとの相性みたいです。

XPから 非対応なので あきらめるしかないのですが
いろいろ試行錯誤でまだまだ対応可能です。

F-BASIC 貴重な知的遺産として残していって欲しいです。
(window APIと一体みたいなので Linuxや Androidへの
拡張は無理かもしれないですが・・・・)

540teamTAKA:2011/12/14(水) 00:13:39
僕は、F−BASICが廃盤になる直前に購入しました。
その時にこの掲示板を知りましたが、
基本形のみを使い、世界中で使えるロトソフトを創りました。
windowsもMe、XP、Vista、7で問題なく動いています。

25年前N88で開発していましたが、手直しがほとんどなくF−BASICで表現ができました。
性能はF−BASICの方が比べ物にならないぐらい上です。
今も、25年前(PC98全盛のころ)のN88の知識のままです。


このBASICは本当にすばらしい!!!

541frost:2011/12/28(水) 22:24:13
はじめまして。

突然の質問で申し訳ありません。
昔の先輩が作成したプログラムがF-BASICで書かれていました。

このプログラムの修正を考えています。
内容としては、表示した画面を画像ファイルとして保存したいと思っています。
どのように書けばよろしいのでしょうか。

お手数ですが、よろしくお願いします。

542nisii:2011/12/29(木) 21:15:52
Print Screenキーを押したら画面イメージをBMPファイル化する、というサンプルは次の通りです。
http://www.geocities.jp/fbasic63/api16.txt

543frost:2012/01/03(火) 12:03:18
ありがとうございます!!
さっそく試してみます。

いかんせん初心者なもんですから、
経過報告には時間がかかるかもしれませんが・・・

544ひろ:2012/03/16(金) 13:24:57
FBASICでSQLサーバーへ接続して抽出してきたデータを格納する方法のサンプルPGを教えて
いだけないでしょうか。概念から解っていませんので宜しくお願いいたします。

545名無しさん:2012/03/17(土) 21:16:30
C:\FBASICV63\Sample_B\ODBC にSQLのサンプルらしきものがありますが
詳しいことは他の方にお任せします

546名無しさん:2012/03/17(土) 21:24:23
>>544
こちらもご参考にどうぞ

One Point Lesson 第七回「データベースと連携してみよう」
www.fmworld.net/product/soft/fbasic/lesson/lesson_7.pdf

547ひろ:2012/03/19(月) 19:00:05
名無しさん ありがとうござてました。
さっそく見てみます。
わかるかなー?

548名無しさん:2012/03/20(火) 21:53:20
SQLサーバーやODBC接続は詳しい方へ
私では説明不足なので他にも分かりやすい話やサンプルあったら
どなたかひろさんへご解説お願いします。

549としかず:2012/04/08(日) 22:48:48
Windows 8(Consumer Preview)でF-BASICは動きますか?

550名無しさん:2012/04/16(月) 22:41:15
Windows8 Consumer Preview でF-BASICが動きました
インストール、U003アップデート、簡単なソースのコンパイル、実行までOKでした。
もちろん不具合の出る命令とかはあると思いますが基本的には動きそうでした。

551F橋:2012/05/27(日) 18:52:09
>>545 >>546 >>548
解説ありがとうございました

>>550
ご報告ありがとうございました

552なりぞう:2012/06/12(火) 20:35:10
F-BASICは、linux mintやUbuntuなどのUNIX系で使えますか?
そのままでは多分、使えないと思うけど、wineなどのソフトを使っても駄目ですか?

553旧人類:2012/06/30(土) 11:16:59
F−Fasicを使用している方でご存知でしたら教えてください。 

「 knj$() で外字コード(jis &H7f21〜) を表示する方法をご存知ありませんか」

どこか設定がおかしいのでしよう、OS は XP です。
N88 の時代より Baic を愛用しております、簡単でそこそこの速度で
使いやすいコンパイラと思っておりまが、消えて行くのが寂しい気がします。

554名無しさん:2012/09/14(金) 08:07:19
>>553
原因はわからないのですが、参考まで。

Windowsの アクセサリ - 外字エディタ を起動して、外字のフォントが表示されるで
しょうか?
あと、外字のリンクが特定の「すべてのフォント」でなく特定のフォントにリンクされて
いるとダメなのかも。
外字エディタのファイル(F) - フォントのリンク で確認してみてください。

外字エディタで作成される既定の外字フォントのファイル名はEUDC.TTEとEUDC.EUFなので、
もしかするとF-BASICはこのファイル名で登録した外字フォントしか対応できないのかも・・。


もし、EUDC.TTEとECDC.EUFのファイルを他から直接コピーしてきたのでしたら、
Windowsが使用中のため、コピーに失敗(ECDC.EUFの方)する場合があります。
その場合、IMEの文字一覧など、外字が正常に表示されるが、外字エディタでは
表示されないという現象が発生します。

555ひろ:2012/09/26(水) 00:20:54
No544で投稿したひろです。
未だにODBCがよくわかりません
FBASICV63のサンプルでODBC.MAKを使ってMS-SQL-Serverに接続できません
'========================================================================
'= 接続/クエリ =
'========================================================================
' 入力:OBJ 結果を設定するコントロール(リストボックス)
' 入力:DATANAME$ データベース名
' 入力:SQL_COMMAND$ SQLコマンド
function EXEC_ODBC( OBJ as object, DATANAME$, SQL_COMMAND$ )
var HDBC as long ' DB HANDLE
var HSTMT as long ' SQL Statement HANDLE
var RCODE as integer ' 復帰コード

' 初期化
if SQL_SUCCESS<>SQLALLOCCONNECT( HENV, HDBC ) then goto *_ERR
if SQL_SUCCESS<>SQLCONNECT( HDBC, DATANAME$, SQL_NTS, "", SQL_NTS, "", SQLNTS ) then goto *_ERR   ->ここで落ちる
if SQL_SUCCESS<>SQLALLOCSTMT( HDBC, HSTMT ) then goto *_ERR
' SQLコマンドの実行
if SQL_SUCCESS<>SQLEXECDIRECT( HSTMT, SQL_COMMAND$, SQL_NTS ) then goto *_ERR

どなたか教えてください。
ODBCの設定はしているつもりです。

556名無しさん:2012/09/26(水) 08:50:52
>>555

SQLCONNECT に渡すパラメータの定義は次のようになっています。
HDBC& 接続ハンドル
SZDSN$ データソース名 <-- DATANAME$
CBDSN% データソース名の文字数 またはSQL_NTS指定
SZUID$ 接続するデータベースのユーザーIDの文字列
CBUID% ユーザーIDの文字数 またはSQL_NTS指定
SZAUTHSTR$ パスワード(認証用文字列)
CBAUTHSTR% パスワードの文字数 またはSQL_NTS指定


まず、DATANAME$ 文字列変数の内容がODBCの設定をされたデータソース名かどうか
確認してみてください。
(サンプルのフォームにデータソース名とODBCドライバ名が表示されているはず)

if SQL_SUCCESS<>SQLCONNECT( HDBC, DATANAME$, SQL_NTS, "", ・・・

サンプル(ODBC.MAK)での接続先データベースはMS-Access (*.MDB)なので、
ユーザーIDとパスワードの文字列はなし("")でよいのですが、
MS-SQL ServerではユーザーIDの指定が必要だと思いますのでサンプルを修正します。

<例> if SQL_SUCCESS<>SQLCONNECT( HDBC, DATANAME$, SQL_NTS, "UserID", ・・・

サンプルではSQLCONNECT に渡す値の最後が「SQLNTS」となっていますが、
これはサンプルの誤りで、SQL_NTSだと思います。
※SQL_NTSは、渡した文字列がNULL文字で終了する文字列であると意味するそうです。

SQLCONNECTが返す値がエラー(SQL_SUCCESS_WITH_INFOまたはSQL_ERROR)の場合
SQLERRORで(ODBC Ver3以降はSQLGetDiagRecを使います)エラーの詳細情報が
取得できます。
FBASICのサンプルはODBC Ver2.0のときのもので、
SQLGetDiagRecの関数宣言はサンプル中のODBC.BIにはありません。

557ひろ:2012/09/28(金) 20:44:29
名無しさん さっそくご教授いただきましてありがとうございます。
SQLNTSはSQL_NTSに変えてみましたがダメでした。
いろいろやってみましたが結局いまだよくわかりません。
DSNの設定での接続テストまではOKなのですが......

558556:2012/09/29(土) 03:33:03
サンプルのSQLNTSの誤りは、未定義変数として初期値ゼロとなり、
パスワードの文字数がゼロと指定したことになります。
パスワードが不要な場合は影響しないことになります。

559556:2012/09/29(土) 04:09:48
>>557
ODBCデータソースの設定のほうに「トレース」機能があります。
ODBCドライバに発行された命令の記録(ログ)をテキストファイルに出力する機能です。
この機能をONしてから実行し、出力されたテキストファイルの中を見ればODBCドライバが
返したエラーがわかると思います。


使用後は必ず「トレース」機能をOFFにして、出力されたテキストファイルを削除
してください。(実行速度が遅くなるなど、後でトラブルになるため。)

560旧人類:2012/10/03(水) 01:08:22
「名無しさん」有難う御座います。
フォントはフリーソフトの「外字コピー屋さん」を利用して駆動時に現フォントを保存して、
使用フォント(外字も含め)をコピーして立ち上がるようにしています、
無論該当ソフトの終了時には逆の動作で元のフォント状態に戻しています。
 (ただ停電の時の復元が少し手間取りますが)

「 knj$() で外字コード(jis &H7f21〜) を表示する」ことは諦めました、
Win95でのFB−Ver6.0 でも同様ですから、多分もともと機能がないのではと。

現在の私の解決策は エディタでIMEより使用する外字を配列文字変数にコピーして
その変数を表示する(symbol or ?)、配列の1番が jis &H7f21 に該当する。
data でソースプログラムに書き込むとか別ファイルで保存するとかしています。
APIを使用するより、こんな馬鹿げた方法が簡単な気がします。
何かいい方法があったら教えてください。

ところで TOKOさんのホームページ[ProgramTips]は閉鎖です移転ですか、
ご存知なら教えてください、APIを随分と参考にさせて頂きましたが。

561554:2012/10/04(木) 02:47:31
>>560 , 553

 「外字コピー屋さん」のWebページのほうを見させていただきました。
勉強になりました。

>
> Win95でのFB−Ver6.0 でも同様ですから、多分もともと機能がないのではと。
>
 Windows 95上でもだめだったとは..。
F-BASICのヘルプでは、knj$()関数で外字を印字できるような記述なのですが..。

 実験してみるとknj$()関数は空文字[""]を返してきました。
対になるjis()関数のほうは動作しました。
また、IMEで外字を文字列定数としてプログラムソースに直接記入すれば、
表示できました。フォント別の外字リンクをされている場合でも表示できました。

 なので、おっしゃるような方法をとるのがやはり簡単ということになります。

 プログラムソースに外字を直接記入してしまうのはあまりよくないので、
knj$()関数をお使いになられようとされたのでしょう。
 ここはknj$()関数を置き換えるように独自の関数を作り、その関数内で
直接記入した外字の文字列(配列)から取り出して返す処理をするのがよいと思います。
外字でない通常のjisコードのときは内部でF-BASIC本来のknj$()関数に
渡して処理させれば、knj$()関数を置き換えられるので可用性が高まります。

562554:2012/10/04(木) 06:04:07
 簡単な方法を忘れてました。
JISコードによるknj$()関数がだめなら、
Shift-JISコードで、上位・下位コードに分けて文字をつなげば
表示できます。

例: chr$(&HF0)+chr$(&H40)

563旧人類:2012/10/20(土) 00:39:48
554さん 
暫く不在していて、確認が遅れてすみません。
なるほど、こんな簡単な方法があるとは思いませんでした。
サブ画面(PICTURE)に自作外字を表示して選択する、方法に戻します。
参考になりもした、有難う御座いました、余分なファイルが減りました。

関連することですが、方法があれば教えてください。
「エデッタ画面でIMEを使用した時にIME側のフォント名を取得する方法」
IMEでは別のフォント名選択でき、そのフォントの文字・記号を選択画面に
表示はしますが、IMEで文字・記号をクリックした時に、そのフォント名を
取得できれば前記の問題もすべて解決するのですが。

564554:2012/10/20(土) 07:24:46
>>560

> ところで TOKOさんのホームページ[ProgramTips]は閉鎖です移転ですか、


こちらでしょうか。

「F-Basic Programming Tips」
[URL] tokovalue.jp

>>563
的を外しているかもしれませんが、ひとつ。
IMEのAPIで、
ImmGetContext()でコンテキストのハンドルを取得。

ImmGetCompositionFont()で取得したLOGFONT 構造体の中に
変換中に表示するフォント名があります。

変換中に表示するフォントの変更は ImmSetCompositionFont()

565554:2012/10/20(土) 07:34:39
>>563
役に立つかどうか、むりやりな方法をひとつ考えてみました。
「IMEの文字パッド(文字一覧)で表示されている(いた)フォント名の取得方法」。

FindWindowEx()で[ひとつめの]IMEの文字パッドのウィンドウを探します。

親ウィンドウのハンドル: NULL (0&)
子ウィンドウのハンドル: 初期値は NULL (0&)
クラス名:"msime98imepad" <--注:IMEのバージョンやOFFICE IMEでは違うかも。

見つかったウィンドウのプロセスIDをGetWindowThreadProcessId()で取得し、
自分のアプリのプロセスIDと比較して一致しなければ他のアプリ用なので、
FindWindowEx()で次を探します。見つかるか戻り値がNULLになるまで繰り返します。

子ウィンドウのハンドル: 先ほど見つかったウィンドウのハンドルに変更

自分のアプリのIMEの文字パッドのウィンドウが見つかったら、次の処理。

FindWindowEx()で子ウインドウを探します。

親ウィンドウのハンドル: 見つかったIMEの文字パッドのハンドル
子ウィンドウのハンドル: NULL (0&)
子ウインドウのクラス名:"ACPAD"

さらに、クラス"ACPAD"の子ウインドウ(コンボボックス)をFindWindowEx()で順次探します。

親ウィンドウのハンドル: 子ウィンドウのクラス"ACPAD"のハンドル
子ウィンドウのハンドル: NULL (0&) または 前回見つけたウィンドウのハンドル
子ウインドウのクラス名:"ComboBox"

(おそらく2つめの)コンボボックスにGetWindowText()でテキストを取得すれば、
IMEの文字パッドで表示されているフォント名が得られます。

566旧人類:2012/11/01(木) 00:47:04
554 さん
TOKOさんのホームページ[ProgramTips] ですが、
当方の「お気に入り」のURLがなぜか書き変わってました、ちゃんと存在してました。
すみませんでした、よく利用してたページなので助かりました。

567旧人類:2012/11/01(木) 01:02:28
554 さん 
追記 「フォント名の取得」の件ですが、成功したら書き込みます、結果は多忙で少し
   時間がかかるかも。

568ねじ:2013/08/25(日) 08:27:51
教えてください。F-BASIC V6.3のソフトを手に入れたいのですが、無理ですかね。

569はぜ:2013/10/23(水) 10:49:41
 はじめまして。PC8001からので移植して 行番号などそのまま
で使っています。
 仕事のデータ シーケンス 一件 12変数の 1万ぐらいを ワードパッド
で保存して やりとりしていますが、読み込むとEOFがききません。
 結局 データのひとつを指標にして 終わりを認識させているので
すが、どういった障害があるのでしょうか。
 同じ型のデータで 少量ならばEOFでおわるのですが。
 どなたか教えいていただければ幸いです。

570名無しさん:2013/10/24(木) 04:49:15
入力命令が INPUT# か LINE INPUT# かで違いますが、

EOF(関数)が効かないということは INPUT# でデータ中の項目の区切りが
途中でずれたということが考えられます。
区切り記号は半角のコンマ、コロンと空白。(空白は数値データで)

また、ファイルの終端であることを示すEOFコードとして
制御コード(16進数で1Ah)がありますが、

Windowsアプリ(メモ帳・ワードパッドやExcelなど)ではEOFコードは
字形がない文字として表示(半角の中点「・」)され、文字として扱わ
れるがゆえに、ワードパッドなどで編集するデータ中にEOFコードが
紛れ込んでいると、問題発生の原因となります。

571はぜ:2013/10/25(金) 09:34:12
さっそくのご返答ありがとうございます。

 LINE INPUT#はつかっていません。データも何度も確認しています。
 読み込むと同時に画面に表示させていますが、 
 最後まで正確に読んでくれますが、最後尾 どうしても 「変数の型
とファイル内のデータ形式があっていません。」がでてしまいます。

 一度 データ量を段階的に減らしたりして試してみたいと思います。
 何か 量的な制限があるような気もしますので。

 しばらく 時間をいただきます。

 目的としては 全体のファイルに 当日出たデータを 自動的にくっつ
けたく、今は、ワードパッドで手動で結合しているのですが、うまい方法が
ないか思考錯誤しています。

572570:2013/10/26(土) 03:13:43
エラー番号:58「変数の型とファイル内のデータの形式が合っていません 」
ですか...。
INPUT# 命令で「数値型」の変数を指定している場合に起きるので
普通にありがちな可能性としては、
ファイルの末尾に空行(改行のみ)や空白文字がある場合とか。

※F-BASICの障害修正パッチのダウンロード (念のため記述)
ttp://www.fmworld.net/product/soft/fbasic/download/


F-BASICのFILECOPY命令では、テキストファイルの結合によるデータ蓄積は
できないので、別の方法としてはバッチ(*.BAT/*.cmd)ファイルを作って
それをSHELL 命令で呼び出すかバッチコマンド一行を直接指定する。

バッチの例) FILE1の末尾にFILE2の内容を追加(FILE2はそのまま残る)
注:失敗するとFILE1などを消失するので事前のバックアップは必須。

COPY /A FILE1.TXT+FILE2.TXT
例2)ファイルの内容を結合した結果をFILE3で新たに作成
COPY /A FILE1.TXT+FILE2.TXT FILE3.TXT

/Aオプションはテキストモード、つまり指定した各ファイルのEOFコードを
認識して処理、末尾にEOFコードを付加します。

かわりに /Bオプションを指定したときにはEOFコードはなにも処理されない
ので実質、EOFコードが【必ず無い】ファイル同士を扱うときのみ指定可能。

573名無しさん:2013/10/26(土) 19:26:17
F-BASIC V6.3 (U003適用済)で単純なテストを実施。

○実施テスト内容
データ内容:12345678,abc, ・・・のくりかえし定型
データ形式:カンマ区切りで「数値,文字列」を12組の計24項目で改行
データ末尾にEOFコードはなし

データ量:3万件(行) 、ファイル総容量 4.49MiB(4,710,000バイト)

データ読み込み終了条件:EOF()関数による検出
データ読み込み内容:数値変数,文字列変数の項順で12組の計24変数に一回で読む
input #1,DTL#(1),DTA$(1), ・・・ DTL#(12),DTA$(12)


実施内容:データ量を2万件および3万件(行)のファイルに対して実施。
実施環境:実行中の空きメモリ(RAM):約80MiB

結果確認方法:
・読み込み回数のカウント値採取
・EOF()関数で検出で終了後、再度input#命令発行でエラー発生(err 54)を確認。

結果:異常検出なし (ランタイム使用型・独立型のコンパイル共に)

574はぜ:2013/10/28(月) 10:01:36
  丁寧な実験 と 提案 ありがとうございます。

 当方 Win 7 で F-basicは ver6.0 L10 とありました。
 プログラムは 下記 です
 eof が 効かないので 232行で 通し番号を拾って 読み込み終わりにしています。
念のため231行で 表示していますが データはきちんと最後までよんでいます。
 
小生 PC8001の名を出したように 高年ですので 基本的なBASIC言語以外は
わかりませんし 挑戦する気力もないのでご容赦ください。

 DOS-V から WIN へ移植するのに 7年もかかりました。
 
 また 解凍など要するアップデイトと 言うんでしょうか ちよっと怖くて
とてもできません。

 今は 少しでも 自動化しようと試みてはいますが。


226 open "tcz2013" for input as #2 'datdat10
227 ta!=0
228 while not eof(2)
229 ta!=ta!+1
230 input #2,DCO#(TA!),DHI(TA!),DNM!(TA!),DDA$(TA!),DNA$(TA!),DBL$(TA!),DNM$(TA!),DNO(TA!),DPR!(TA!),DPZ!(TA!),DCP(TA!),DPL(TA!)
231 'print DCO#(TA!),DHI(TA!),DNM!(TA!),DDA$(TA!),DNA$(TA!),DBL$(TA!),DNM$(TA!),DNO(TA!),DPR!(TA!),DPZ!(TA!),DCP(TA!),DPL(TA!)
232 'if DNM!(TA!)=81118 then 236 'テータの終わりを認識してくれるかどうか
235 wend
236 close #2

575570:2013/10/29(火) 02:22:57
バージョン情報の詳細はF-BASICを起動してメニューの[ヘルプ(H)]−[バージョン情報(A)]
大きく表示されたF-BASICのロゴの左下に 「V6.0L10」の後にあるU00xの有無で
アップデート適用有無が確認できます。V6.0ではV6.0L10 U002が最終版です。

とりあえずF-BASIC 6.0用のアップデートパックをダウンロードしてその中にある
UPDATE.TXT(障害修正一覧の項)を見てみました。
斜め読みですがEOFの件に該当しそうなものは見当たりませんでした。


Windows 7の上でF-BASIC V6.0L10ですか・・。
効果があるかはわかりませんが、Windows 7の機能の
「アプリケーション互換モード」を設定してみてはどうでょうか。

F-BASICで作成(翻訳/コンパイル)した実行ファイルに次の操作を行う。

1. 実行ファイルをマウスで右クリックしてプロパティを選択。
2. 表示されたウィンドウの中の「互換性」のタブを選択。
3. [互換モード]という囲みの中の
 3-1.「□互換モードでこのプログラムを実行する」にチェックを入れる。
 3-2.すぐ下のボックスをクリックして一覧の中から「Windows 98/Windows Me」を選ぶ。
4.[適用(A)]ボタンを左クリック。[OK]ボタンを左クリックして閉じる。

*設定を解除するときは3-1. でチェックを外す操作をしてください。(3-2.は不要)

576570:2013/10/29(火) 02:51:22
最後のデータまで正常に読めているのにかかわらず
EOF()が効かないという障害ということで、
お見せいただいたプログラムに障害回避の追加を試みます。

△var DTEST$

open "tcz2013" for input as #2 'datdat10
△open "tcz2013" for input as #3 'datdat10を二度開く(LINE INPUT用)
TA!=0
while not eof(2)
△line input #3, DTEST$
△if len(trim$(DTEST$))<12 then print "Over!",TA!:exit 'データの終わりをオーバー?
TA!=TA!+1
input #2,DCO#(TA!),DHI(TA!),DNM!(TA!),DDA$(TA!),DNA$(TA!),DBL$(TA!),DNM$(TA!),DNO(TA!),DPR!(TA!),DPZ!(TA!),DCP(TA!),DPL(TA!)
'print DCO#(TA!),DHI(TA!),DNM!(TA!),DDA$(TA!),DNA$(TA!),DBL$(TA!),DNM$(TA!),DNO(TA!),DPR!(TA!),DPZ!(TA!),DCP(TA!),DPL(TA!)
'if DNM!(TA!)=81118 then exit 'テータの終わりを認識してくれるかどうか
wend
close #2
△close #3

補足:
・△がある行を追加しました。
・追加したif文の、[DTEST$変数の長さ<12]とは、1行12項目のデータは、
区切りの文字だけでも11(桁)あるのだから・・・。
・「then 236」(236行へGO TO)は「while - wendループの外へ出る」と解釈し、
exit命令に置き換えました。

577はぜ:2013/10/30(水) 10:30:32
試みてみました。うまくいきました。
 ありがとうございます。感謝申し上げます。

 長年の停滞が解除されて、よりよいソフトにできそうです。
 
 自分で自由に作れるソフトはすばらしいものですね。しかし 今は
頭の奥が痛くなるだけではありますが。

 重ねて御礼申し上げます。

578名無しさん:2013/10/31(木) 03:28:51
>>571
参考プログラムです。機会があればどうぞ。

'**** FILE1の末尾にFILE2の内容(テキストデータ)を追加する。
var L1 as long '読み込んだ行数
var L2 as long '実際に追記した行数
var DTEST$

open "FILE1.TXT" for append as #2 'このファイルに追記する
open "FILE2.TXT" for input as #3 '読み込むデータ
L1=0
L2=0
while not eof(3)
L1=L1+1
if L1>=20000& then print "LoopBreak!":exit '***EOFが効かない?
line input #3, DTEST$
if not (len(trim$(DTEST$))<12) then '空行等でなければ出力
L2=L2+1
print #2,DTEST$
endif
wend
close #2
close #3
'**** F-BASICにより自動付加されたファイル末尾のEOFコードを削除する。
DTEST$=space$(1) '読み込むバイト数の桁の領域確保
open "FILE1.TXT" for binio as #2 '対象(※追記したファイル)
if lof(2)<>0 then 'ファイルの内容が空でないこと
seek #2,-1,2 '***mode 2:ファイルの末尾から -n移動
fread #2,DTEST$ '確認のため一度読み込む
if DTEST$=chr$(&H1A) then 'EOFコードかどうか確認する
seek #2,-1,2 '再度、移動する(※EOFコードの位置)
truncate #2 '現在の位置からファイルの内容を切り捨てる
endif
endif
close #2

579はぜ:2013/12/14(土) 09:48:25
 質問です

 これは 別に不都合を感じてはいないのですが、MX VISTA 7と
すすむほどに BASICの表示枠が だんだん 小さくなっていきます。
 
 そんなものでしょうか。

580570:2013/12/16(月) 06:27:48
>>BASICの表示枠が だんだん 小さくなっていきます。

1. F-BASICのプログラム編集画面の文字が小さいという場合
メニュー:表示(V) - オプション(O) で
表示されたダイアログの[エディタ]タブの中の
フォント(F)とサイズ(S)の、設定がおそらく

「FixedSys」になっていてサイズが選べないと思います。

 これを「MS ゴシック」や「MS 明朝」などに変更すれば
サイズを選べるようになります。
選択したサイズによっては、表示がくずれるなどの問題が起きることが
あるので、その場合は他のサイズに選びなおしてください。
 なお、「MS Pゴシック」や「MS P明朝」はプロポーショナルフォント
ですので、避けたほうがよいでしょう。


2. F-BASICで作成したプログラムの実行画面の場合

旧来の(DOSや8ビットパソコン上)のBASICと同等な「手続き型」で作成した
場合、画面の大きさや背景色などの定義情報がないので新たに
フォームの編集が必要です。
リソースファイル(.RC)を作成してその中の
フォーム − 「MAINFORM」を開き、MAINFORMのプロパティ画面を
表示させて、フォントの項目を変更します。

詳細については、富士通のサポートページの「活用ガイド」
http://www.fmworld.net/product/soft/fbasic/gpib/
にあるワンポイントレッスン集の、
  第一回「実行画面を大きくしよう」 (PDF形式)

この文書(lesson_1.pdf)を表示するかダウンロードして
ご覧ください。

581はぜ:2013/12/19(木) 10:04:41
途中経過報告です

 ありがとうございます。うまくいきました。実行枠です。すみません。

 ただ、

 ①表示速度が かすかに 遅くなる。
 ②実行枠ですが、繊細で、いろいろボタンを押したりすると戻ったりしてしまう。
 ③プログラムの実行するたびに、変更されたモジュールが・・・と出る
 ④何もしていない ほかのプログラムまで ③とおなじになる。

                 以上こんな現象がでます。

582570:2013/12/20(金) 09:32:13
>>581
実行枠が不安定ということには複数の問題がからんでいると思います。
一つづつ解決していきましょう。

まずは、リソースファイル(.RC)のフォームのブロパティ設定から。
F-BASICで、作成済みのリソースファイル(.RC)を開き、フォーム「MAINFORM」を
開いて画面に表示させます。

(a): フォームの「プロパティ」ダイアログを表示させてプロパティ各項目を
設定・確認していきます。

・ダイアログの中の表示内容(P):【クライアントエリア】に切り替え、
マッピングモードを確認・設定します。標準は「テキストモード」です。
テキスト行数とテキスト桁数を確認します。(標準値は80桁、24行)

・ダイアログの中の表示内容(P):【フォント】に切り替え、
フォントとフォントのサイズを任意に設定。

・ダイアログの中の表示内容(P):【フレーム】に切り替え、
ウィンドウの初期位置の項目を設定します。(初期値は「ユーザー設定」)
水平スクロールと垂直スクロールを「あり」に変更。(*F-BASICの初期動作に合わせた。)

・ダイアログの中の表示内容(P):【基本スタイル】に切り替え、
位置X座標および位置Y座標をゼロに設定。(これは任意です。F-BASICの初期動作に合わせた。)
※これをゼロにすると大抵、F-BASIC本体のメニュー部と重なって操作のじゃまになりますが・・。


(b): ここで、フォームの画面枠の大きさを再設定します。表示されているMAINFORMの
枠の右下隅をマウスでドラッグして枠のサイズを縦横とも動く最大まで伸ばします。
(一度左上にドラッグして少し小さくしてから伸ばすとよい)
 MAINFORMの枠にある垂直・水平スクロールバーが消えます。
*別の方法としてはプロパティ【基本スタイル】のサイズの各項に、
わざと大きな数字(3000とか)を入力して自動訂正により枠のサイズを最大にする方法があります。

(c): リソースファイル(.RC)を上書き保存します。

 任意のプログラムにリソースファイル(.RC)を登録して(再)翻訳・実行して
動作を確認します。

583570:2013/12/20(金) 09:40:52
>>581
「変更されたモジュールが・・・」のメッセージが《ほかのプログラムまで》出る件ですが、

リソースファイル(.RC)を登録したことで出るようになったものと思います。

 旧来のBASICの多くは「インタプリタ」方式でしたがF-BASICは
「コンパイラ」方式ですのでプログラムを実行する前に、
コンパイル(F-BASICでいう翻訳)によって実行可能形式( .EXE)のファイルを作ります。

 F-BASIC本体の中から、なんらかのプログラムを実行させると、
まず、コンパイル(翻訳)するべきかどうか個々のファイル(.BASや.RCなど)ごとに
F-BASICが判断して、必要なときは確認のメッセージを出すという内部動作になります。

リソースファイル(.RC)を登録したことで、作成した(一連の)プログラムに変更点が有る
という判断になるため、メッセージが出されています。

続けて過去に作成したほかのプログラムを開いて実行しようとしても同じ結果となります。
*実行可能形式ファイル(.EXE)よりリソースファイル(.RC/.RES)の方の最終更新日付が新しい

 リソースファイル(.RC)の登録内容はF-BASIC本体に記憶されるのではなく、
再度のコンパイル(翻訳)で再作成された個々の実行可能プログラム(.EXE)の
中に埋め込まれます。
 また、F-BASIC本体を再起動すると、リソースファイル(.RC)の登録は解除されてしまいます。
(メニュー:プロジェクト(P) - 環境(E) のダイアログ設定内容)

 このため、リソースファイル(.RC)による画面枠の変更内容が実行開始時に反映されたり
されなかったり、解除しても元に戻らないといった現象が発生します。
 この問題を軽減するためにはプロジェクトファイル(*.MAK)を新たに作成し、これを通じて
F-BASICに認識させる必要があります。(後述)

584570:2013/12/20(金) 09:55:03
>>581
 リソースファイル(.RC)を登録したことにより、
「変更されたモジュールが・・・」の翻訳を促すメッセージが、
BASICプログラムを変更していないのにもかかわらず、毎回出るといった問題についてですが、
これへの対処にはプロジェクトファイル(*.MAK)を一つの実行プログラム毎に作成する必要が
あります。

プロジェクトファイル(*.MAK)の役目はおおまかに、
 ・メニュー:プロジェクト(P) - 環境(E) のダイアログで設定する内容を記録する
 ・一つの実行可能形式ファイル(.EXE)を作るために必要なソースファイル等の一覧を記録
   a. (一つまたは複数の)BASICソースプログラム(.BAS、.SUB)
   b. リソースファイル(.RC)およびアイコンファイルやその他のファイル
   c. 必要な追加ライブラリやオブジェクトファイル
 ・個々のファイルを再コンパイル(翻訳)して実行可能形式ファイルを再作成する
  かどうかの判断材料にする

■プロジェクトファイルの手順説明
 プロジェクトファイル関係について、>>580 で紹介したワンポイントレッスン(第一回)
にはまったく説明されていないため説明不足となったことをお詫びいたします。

 では、既存のBASICプログラムにプロジェクトファイル(*.MAK)を追加作成する手順を
説明します。 ここでは仮に次の各ファイル名として説明します。
 ・既存のBASICプログラムのソース: UNTIL1.BAS
 ・作成済みのリソースファイル: MAINFORM.RC
 ・実行可能形式ファイル(.EXE): UNTIL1.EXE

1. F-BASIC起動後、メニューのプロジェクト(P) - 新規作成(N)を選択。ダイアログの
ファイル名欄を「UNTIL1.MAK」に書き換えてOKボタン。
(「UNTIL1.MAK」と同名でプロジェクトウィンドウが表示されます)
2. メニューのプロジェクト(P) - 環境(E)を選択。ダイアログのファイル(F)ボタンを押して
リソースファイル「MANFORM.RC」を選択。
2-2. ダイアログのプロジェクトと実行形式ファイル欄にあるファイル名を再確認します。
 (必要ならばここでファイル名の指定を変更することができます)
2-3. OKボタンでダイアログを閉じます。
4. メニューのプロジェクト(P) - モジュール(M)を選択。
4-2. ダイアログの「ソース」タブでファイル(I)ボタンを押してBASICプログラムのソースを
選択(登録ボタン)。
  もし、複数のファイルに分かれている場合は再度ファイル(I)ボタンを押す操作を繰り返す。
4-3. ダイアログの右側の「プロジェクトモジュール欄」の一覧にBASICプログラムのソースが
あることを確認してOKボタンでダイアログを閉じます。
5. メニューのプロジェクト(P) - 上書き保存(S)または名前を付けて保存(A)を選択し、
ブロジェクトファイル「UNTIL1.MAK」をファイルに保存します。

6. 後は、通常通りプログラムを翻訳メニューから翻訳するか実行メニューが実行します。

後でこのBASICプログラムを修正・実行する場合はBASICプログラムを直接開くのではなく、
メニューのプロジェクト(P) - 開く(O)を選択してプロジェクトファイルを開きます。
*メニューのファイル(F) - 開く(O)のダイアログで「ファイルの種類(T)」の欄を「プロジェク

ト(*.mak)」に変更してファイルを選択しても同じです。

585570:2013/12/20(金) 11:34:26
リソースファイル(.RC)でフォーム「MAINFORM」を作成してプログラム実行時のウィンドウ
を置き換えた場合、F-BASICの従来のウィンドウと異なるところがいくつかあるようです。

$$ここでは従来のウィンドウを仮に[FB画面]、リソースファイルで作成した
  「MAINFORM」を[RC画面]と表記します。

○実行時のウィンドウのタイトル名
[FB画面]:実行時のプログラムのファイル名が自動で設定される
[RC画面]:「MAINFORM」のプロパティに設定した【フレーム】の「テキスト」項の内容

問題点:複数のプログラムを実行中にウィンドウを最小化したときなどに
表示されている名称が同じ(MAINFORM)になって区別がつかなくなる。

解決方法-1 (F-BASICの標準機能でのみ実現、実用上ほぼ同じに):
 BASICプログラムの先頭に次の文を追加する(2行)。

#include "WINDOWS.BI"

SETWINDOWTEXT "(表示するタイトル名)" '<−プログラム名など任意の文字列を入れる


解決方法-2 (Windowsの機能を利用):
 ここでは例示しませんが、Windows APIの「GetModuleFileNameA」を呼び出して
プログラムのファイル名を取得して設定する方法になります。


○実行時/最小化時のアイコンのイメージ
[RC画面]:[FB画面]のときとアイコンが異なる。

解決方法:
もし、同じアイコンにしたい場合は、F-BASICをインストールしたフォルダ中のBINフォルダ
内にF1A0DFLT.ICOというアイコンファイルがあるのでこれをリソースファイル(.RC)、
「MAINFORM」にアイコンとして登録する。

1.リソースファイル(.RC)を開き、「MAINFORM」を画面に表示させる。
2.メニューの リソース(S) - インポート(R)を選択する。
 もし、グレー色になってメニューを選択できないときは「MAINFORM」のウィンドウを
マウスでクリックしてから、メニューを選択操作する。
3.インポートするファイルを選択するダイアログが表示されるので。
F-BASICをインストールしたフォルダの中のBINフォルダまでたどり、
F1A0DFLTというアイコンファイル(.ICO)を選択して開くボタンを押す。
4.「MAINFORM」のプロパティ ダイアログを表示させる。
ダイアログの中の表示内容(P):【フレーム】に切り替え、アイコンの項の内容から
f1a0dflt (F1A0DFLT)を選択する。
5.リソースファイル(.RC)を上書き保存します。

586570:2013/12/21(土) 03:47:49
>>581
>表示速度が かすかに 遅くなる。


Windows環境では速度が一定しないこともあり、
あくまでひとつの参考値としてですが、
 リソースファイル(.RC)で、おもに以下の状態に設定
 ・フォント:MS 明朝 (サイズの項は変更せず(FixedSysのときと同値))
 ・テキストは80桁,24行のまま
 ・フォームの画面枠を広げる(画面枠はおもに横方向に広がった)
 ・背景色は白色

(a)実行するプログラム:テキストを連続で何行も表示して画面のスクロール多い

このときの画面表示速度の低下は 7%から15%程度

(b)実行するプログラムは(a)と同じでフォント設定はFixedSysに。

この場合は(a)よりも若干速い。


(c)実行するプログラム:テキストを画面全行書き換えるが画面スクロール少ない

このときの画面表示速度は逆に若干速い傾向。


表示速度についてはさまざまな要因があるため推測でしかありませんが、

・テキスト画面のスクロールが多いような場合については、
実行画面全体の表示を書き換えることになるため、画面の面積に比例して
速度が低下する。
・テキスト画面のスクロールが多いような場合はF-BASICの元の画面が速い?
・テキスト画面のスクロールが無く、テキストの書き換えが少ない場合は
リソースファイルの画面の設定次第では若干速い可能性がある。


余談ですが、リソースファイルで画面のマッピングモードを
「テキストモード」からTWIPSなどに変更すると画面の描画速度は高速化します。
これはF-BASICによる画面の互換機能を捨ててWindows互換にするということを意味します。

587はぜ:2013/12/25(水) 08:10:23
ありがとうございます 
繁忙期に入りましたので、しばらく試行を保留させてください。

588名無しさん:2014/04/16(水) 08:27:11
F-basicのMAILSEND関数について教えてください。
WindowsLiveメール環境でMAILSEND関数実行時に添付ファイルを指定しないと2008エラーになります。
F-basicの「メール送信サンプルプログラム」で再現できます。
回避する方法がありましたら教えてください。

589名無しさん:2014/04/20(日) 03:54:52
>>588
現象再現できました。添付ファイル指定無しで、エラーになりました。
原因はなんともわかりませんが状況としては、
・Windows XPやOutlook 2000以降のメールセキュリティ強化
・Outlook 2007以降、Simple MAPI が非サポート対象へ
の要因か?。

いくつか回避案:
(a) (添付ファイルなしは) F-BsaicランタイムのSENDMAILを使わず、
MAPI32.DLLを直接呼ぶ。
 MAPILogon , MAPILogoff , MAPISendMailを直接呼んでプログラムを書く。

 ランタイムはMAPI32.DLLを動的リンクで呼び出し、面倒を引き受けて
くれているがその代わりSENDMAILで指定できるパラメータ以外は隠されて
指定できないため。

(b) メールクライアントに Mozilla Thunderbird をインストールして既定にする。

 Outlook Expressのように Simple MAPIをサポート(?)

(c) .emlファイルとしてテキスト出力で作成してから .emlファイルに関連付けした
メールクライアントに読ませる。(メール作成ダイアログが起動)

(作成例):Outlook Expressでの場合 (文字はANSI、JISコードで)
□From: "test name" <test@example.com>
□To: <sample@example.com>
□Subject: TestTitle
□MIME-Version: 1.0
□Content-Type: text/plain;
□ charset="iso-2022-jp"
□Content-Transfer-Encoding: 7bit
□X-Mailer: Microsoft Outlook Express 6.00.9999.9999
□X-MimeOLE: Produced By Microsoft MimeOLE V6.00.9999.9999

□TEST MAIL TEST MAIL

590名無しさん:2014/04/25(金) 10:40:08
>>588
F-BASICのMAILSEND で、Windows Live メール等に送信メールを発行した
とき、添付ファイルを指定しないとMAILSENDがエラー 2008となる現象について。

どうやらF-BASICのランタイムに少々難があるようです。
ランタイム内の処理では、添付ファイル名を指定しない場合であっても、
MapiFileDesc構造体の配列へのポインタを渡しているため、
MAPI32.DLL か Windows Live メール側の検査で拒否されていると推測します。

以上の推測により、この現象を回避するF-BASICへのパッチを試作してみました。

対象:F-BASIC V6.3 L10 U003 *このバージョン構成以外は不可。
パッチ対象ファイル名: F1A0RI63.DLL   (インターネット拡張ライブラリ)
 タイムスタンプ: 2000/12/18
 ファイルサイズ: 348,160

◆現象回避パッチ リスト *以下のリストに示す箇所をバイナリエディタ等で書換え。
  書換え後はWindowsの再起動が必要。
/アドレス:変更前、変更後/
3139: 89 55
313A: AC E8
313B: 24 85
313C: 8C 00
313D: 00 00
313E: 00 00
313F: 00 5D
:
:
31C4: 90 39
31C5: 90 5C
31C6: 90 24
31C7: 90 30
31C8: 90 75
31C9: 90 6C
31CA: 90 29
31CB: 90 ED
31CC: 90 EB
31CD: 90 68
:
:
3236: 90 89
3237: 90 AC
3238: 90 24
3239: 90 94
323A: 90 00
323B: 90 00
323C: 90 00
323D: 90 C3
--END--
◆注意 
 このパッチによる動作やその結果の影響については何ら保証できません。
 書換えを行ったファイルそのものを頒布・公開したりしないでください。
 また、メーカー等もこれには一切関わりがございません。

591名無しさん:2014/05/03(土) 08:31:33
F-BASICのMAILSENDのエラーに関してご教授ありがとうございます。
検討した結果お教え頂いたMAPI32.DLLを直接呼ぶかソケットを使おうと思っています。

592名無しさん:2014/05/23(金) 00:19:53
>>586
LINE命令などのグラフィックをまったく使わないプログラムであれば
「運用環境ファイル」を作成してプロジェクトに組み込み
「運用環境ファイル」を開いて[動作モード]タブの
[画面の使用]−[グラフィック]のチェックを外して
再翻訳すれば画面の表示速度アップするよ。

593名無しさん:2014/07/29(火) 23:17:16
F-BASIC97を持っているのですが、F-BASIC V6との違いを教えて下さい。

594名無しさん:2014/07/30(水) 03:23:50
■F-BASIC97(V5.0)からの変更点(V6.3/V6.0)
OS:Windows 98(以降)への対応
DOS-BASICソース移行支援機能の搭載
ツールバーのフラット表示
プロパティ項目の追加
翻訳開始前の起動タスク検査
マルチユーザ対応
TRUNCATE命令:ファイルをポインタから以後を削除する(ファイルサイズ縮小)
ファイル存在確認関数:ISEXISTFILE関数/ISEXISTDIR関数
シーケンシャルファイルのOPENモード追加:FOR CREATEモード
環境変数の獲得:ENVIRON$関数
座標原点の変更:AXIS命令 (左下を座標原点に変更)
WIDTH LPRINT命令:LPRINT命令で印字する場合の1行内の文字数を設定
電源管理機能:GETPOWERSTATUS関数/SETWAKEUPTIME/SUSPENDPOWER命令
構造体のサイズ獲得:LEN関数(2)
インテリマウスの対応:マウスのホイール(Windows 98以降)
多重起動の禁止:PREVINSTANCE関数(多重起動の検出支援)
フォームへのシェルドロップ機能:
タスクトレイアイコン制御:SETTASKTRAYICON/DELTASKTRAYICON/SETTASKTRAYICONTIP
UNICODEデータ相互変換:JCONV$関数(JIS、SJIS、EUC、UNICODEの相互変換)


■F-BASICV6.0からの変更点(V6.3)
●F-BASIC統合開発環境
選択範囲の印刷:編集ウィンドウ内の選択した範囲のみを印刷できるようになりました。

●基本命令・関数
FILEATTR関数:ファイルハンドルを獲得できるようになりました。
SHELLの同期サポート:起動したプロセスが終了した時点で命令が終了する同期モードをサポート。
シーケンシャルファイルの高速化:シーケンシャルファイルの読み込みを高速化しました。

●拡張ライブラリ・コントロール・イベント
インターネット対応機能:HTTP、FTP、MAILなどでファイルを扱えるようになりました。
LPRINT印刷属性設定:LPRINTで印刷する際のフォントや文字間隔を設定できるようになりました。
ショートカットメニュー:マウスの右ボタンで利用されるショートカットメニューを作成できるようになりました。
ホットキー:フォームに対してホットキーを設定できるようになりました。
ファイル名操作:ファイル名文字列からドライブ名・パス・ファイル名・拡張子などに分解する
関数などをサポート。

595ひろ:2015/03/31(火) 14:56:32
またしても、皆様のお知恵をお貸し下さい。
pdfファイルを印刷したいのですが、どうすれば良いのでしょうか?

596名無しさん:2015/04/02(木) 06:41:10
Adobe ReaderかAcrobatが導入済みとして、

シェル拡張の「ファイルの関連付け」まかせとして
もっとも簡単な方法は

#include "WINDOWS.BI"
var A$
A$= "C:\TEMP\test.pdf"
SHELLEXECUTE A$,,8,0,"print"

これでAdobe ReaderかAcrobatが起動して
「通常使うプリンタ」で印刷されると思います。

597k5:2015/06/05(金) 11:18:23
こんにちは、FBASIC6.3を使っています。

いつも実験でRS-232Cポートに接続されている計測機器から出力されるデータを読み出しているのですが、今回使う機器がバイナリデータしかサポートしていないそうで困っています。データは24バイト固定でx,y,zが8バイト倍精度浮動小数点で出力されます。このデータをテキストデータに変換して計算したいのですが、FBASICではどのように扱うのかよくわかりません。どなたかよろしくご教授ください。

598名無しさん:2015/06/06(土) 07:36:59
>>597
 バイナリデータの受信ではINPUT$関数を使用します。
1組のバイナリデータ24バイトを A$=INPUT$(24, #1)で文字変数に格納してから
データを個々に切り分け(MID$関数)、数値に変換します。
INPUT$関数を複数回実行して個々のデータ1個づつ変数に格納してもかまいません。

 もし、次の組のバイナリデータとの間に区切り用のデータがあるなら忘れずに
受信処理してください。


 ここで問題となるのが、数値データが8バイトの倍精度浮動小数点であること。
浮動小数点形式には過去にいくつかの規格とデータのバイト格納(受信)順序の違いが
あるため、適した変換を行う必要があります。
(おそらくは数値形式そのものはIEEE754だと思います。)

F-BASICでは変換関数が用意されているので対応するものを使います。

・倍精度浮動小数点用の変換関数(CVDxx)
CVD関数、
CVDV関数、CVD2関数、CVD98関数

注意:CVD関数以外は「#include "F1A0LWIC.BI"」の記述が必要です。
そして、数値変換拡張ライブラリ「F1A0LC63.LIB」を
プロジェクトファイルにBASICプログラムとともに登録して翻訳する必要があります。


ヘルプファイルの次の各ページあたりを参照してください。
・「MS-DOS BASIC プログラム資産の移植」の章の 「数値データの格納形式について」、
   「各種データ形式への対応方法」、「数値変換拡張ライブラリ(F1A0LC63.LIB)」
・「他言語プログラム」の章の 「倍精度実数の格納形式」


それから、
 RS-232Cの回線速度やフロー制御などの通信モードの設定を
よく確認して計測機器側と合わせてください。

 設定はOPEN命令中で記述するか、「運用環境ファイル」を作成して設定します。
 「運用環境ファイル」を使う場合はF-BASICのプロジェクトファイルを作成
してBASICプログラムといっしょに登録する必要があります。
・運用環境ファイルの「回線」タブ - 「回線パラメータの設定」ボタン から。

599598:2015/06/06(土) 07:41:31
>>597
サンプルプログラムを例示します。(「構造体」を使った例)
 倍精度浮動小数点が、x86系CPUのWindowsアプリでよく使われる形式であると
みなし、受信データを「構造体」を使って倍精度浮動小数点型の変数に、
メモリ上でバイナリそのままで転記して取り出しています。

※CALLEVENT と#include "WINDOWS.BI" は必要なければはずしてください。

[注]:字下げのために全角空白を使ってます。半角に置き換えてください
#include "WINDOWS.BI"
#include "F1A0LWIC.BI" '<--ライブラリが必要な場合

'24Byte長レコード(8Bytex3)
type T_RCVDT
  X as double
  Y as double
  Z as double
end type

'データ受入用(バイナリ24Byte)
type T_RCVDT_WK
  DT as string * 24
end type

var RCVDT as T_RCVDT
var BUFWK as T_RCVDT_WK

baud 0,9600
open "COM0:" for input as #1

do while eof(1) '受信開始待ち
  CALLEVENT
loop

'1件分データ入力(24Byte)までループ
do
  if lof(1) >= 24 then
    ' 1件の受信データ読み込み(バイナリ)
    BUFWK.DT = INPUT$(24, #1)
    ' 構造体を通してバイナリを各変数に格納
    LSET RCVDT = BUFWK

    exit do 'ループ脱出
  end if
  CALLEVENT
loop

close #1
'データを画面に表示
print "X="; RCVDT.X
print "Y="; RCVDT.Y
print "Z="; RCVDT.Z


 浮動小数点の形式が異なるため、エラーや数値がでたらめになる場合はとりあえず、
「X as double」などを「X as string * 8」などに書き換え、
変換関数のどれか適切なものを使って「CVD(RCVDT.X)」、倍精度の実数に変換
してみてください。
注意:CVD関数以外は数値変換拡張ライブラリ「F1A0LC63.LIB」が必要。

600k5:2015/06/08(月) 16:25:02
こんにちは

レスが遅れて、申し訳ありません。
そして、丁寧な解説をありがとうございます。
とても感謝しております。

多分、倍精度浮動小数点はIEEE754だと思います。
ただ、ビックエンディアンかリトルエンディアンかは不明です。
取り合えず、サンプルプログラムを参考にして、
データを読み出すプログラムを書いてみます。
結果は必ずここに報告します。

こういった処理を書くのにはBasicは最強ですね。
もう15年ほど使っておりますが、Windows7(64bit)でも快適に使っています。

601k5:2015/06/11(木) 22:09:42
こんにちは

なんとかお世話になってデータを読み出せそうです。
ところで、基本的な質問があります。

A$=INPUT$(24, #1)
このA$をファイル(#2)に書く時に、

open "xyz.bin" for binout as #2

Print #2,A$ または、
write #2,A$

とかやると、A$にCR/LF(0d0a)が追加で書き込まれますよね。
これを24バイトだけバイナリーモードでで書き込むようにしたいのですが、
なにかいい方法はないでしょうか。

602598:2015/06/12(金) 04:05:25
>>597
PC側のRS-232CのI/FはUSB変換タイプだったりするのでしようか。
もしそうならば、差しつかえなければ品番などを開示いただけると。
F-BASICで実際に動作するI/Fの情報は貴重なので。

>>601
> open "xyz.bin" for binout as #2

 バイナリモードでの出力では FWRITE# 命令があります。

fwrite #2,A$

出力には変数を指定します。この変数には構造体全体を指定することもできます。
数値型変数も指定できます。ただし文字列定数・数値定数は指定できません。
構造体を使えばランダムファイルのレコードのような扱い方ができるわけです。

 ただ、FWRITE# では PRINT#のような多様性はありません。PRINT#の場合は、

print #2,A$;

のように末尾にセミコロンを付けると、復帰改行(CR/LF)コードの出力を抑止できます。


#openモードがバイナリモードでもPRINT# WRITE# 使えるとは・・。F-BASICの柔軟性ゆえか。
#バイナリ出力モードもシーケンシャルの一種、ということはEOFコードの問題が解決する?

603名無しさん:2015/06/12(金) 09:41:20
>PC側のRS-232CのI/FはUSB変換タイプだったりするのでしようか。
>もしそうならば、差しつかえなければ品番などを開示いただけると。
>F-BASICで実際に動作するI/Fの情報は貴重なので。

そうなんですか、それで動かなかったんですね。
今はシリアルポート付のPCでログをとっています。

ダメだったのは、RATOCのREX-USB60(ProlificのPL2303)とArvel SRC06-USB(FTDIのFT232BM)です。
もう1本、ELECOMのUC-SGT(ProlificのPL2303)があるのですが、これも無理かもしれませんね。

ここにいろいろなケーブルがあります。
http://smart.diipedia.net/usb-cable.html#usb-serial


Alcor MicroのAU9720とWinChipHeadのCH340Tを使った、
USBシリアル変換ケーブルはまだ試せていません。

F-BASICで動作可能なUSBシリアル変換ケーブルってあるのでしょうか?

604名無しさん:2015/06/12(金) 11:14:20
>>602

いつもありがとうございます。

そういうと、fwriteというのがありました。
これを使ったらうまくゆきました。
ついでに、freadを使ったら、全体にすっきりしました。


F-BASICのバイナリモードは強力ですね。
EOFも出力されないので、Linuxなどに持って行くときも便利です。

605598:2015/06/13(土) 03:14:57
>>603
変換I/Fのレポートありがとうございます。

>>604
UNIX系とのやりとりに限らず、Windows上でもEOFコードは問題なので
バイナリ出力モードでprint# やwrite# が使えるとなれば、
for OUTPUTをfor BINOUTにソースを変更するだけで済むので大きな収穫です。

seek命令・seek関数とも使えるようなので、活用の幅がありそうです。

こうなると改行コードが0AHの場合、テキスト入力系命令が使えないのが残念です。

606k5:2015/10/19(月) 12:18:58
こんにちは

またお世話になります。


MXD-4660AというデジタルマルチメータのデータをF-BASICで読み込もうと思っています。マニュアルにあるサンプルプログラムはこのようなものです。

レート:9600bps
データ長:7ビット
パリティ:なし
ストップビット:2

10 open "com1:9600,n,7,2,rs,cs,ds,cd" as #2
20 print #2,"D"
30 in$=input(4*14,#2)
40 print in$
50 close #2

多分QBASICで書かれていると思います。

これをF-BASICに書き直そうと思っているのですが、うまく動きません。「システムに異常があります」とエラーが出ます。

baud 0,9600

CM$="COM0:(S7N2N7NNN)

open CM$ for output as #2
open CM$ for input as #2

print #2,"D"

line input#1,R$

print R$

close

stop

多分、comポートをオープンするこの部分が間違っているのだと思うのですが、

"com1:9600,n,7,2,rs,cs,ds,cd"

なにかヒントになるようなことをお気づきでしたら、アドバイスいただけると助かります。

607598:2015/10/20(火) 11:17:30

--- for input as #2 → ... as #1
line input#1,R$ → は受信データしだい(改行コード必要)

オプションはたぶん合っているような。
ハードウェアフロー制御なしかな?。どちらでもOPEN自体はできるはず。


「[27]システムに異常があります」だとAPIから想定外のエラーが返されて
いるのかも?

普通ありがちなエラーメッセージは---
[60]指定の入出力装置は使用できません ← 指定番号のポートが無い
[53]入出力装置に異常が発生しました ← 通信(条件設定)異常でエラー
[78]入出力装置でタイムアウトが発生しました ← RS-232Cの通信タイムアウト設定有


とりあえずどこまで動くのか状態切り分けが必要かと---

・Windowsのハイパーターミナル(があれば)で通信できるか確認する。
(注:既定で「ローカルエコー」はOFFなのでキー入力した送信文字列は表示されない)

・デバイスマネージャの方でシリアルポートの通信条件を設定しておき、
 F-BASICでは通信条件を指定しない。「運用環境設定ファイル」も無し。

・USB―シリアル変換の構成の場合はデバイスマネージャか機器付属ツールで
 ポート番号を変更してみる。(ポート3 から 5: F-BASIC="COM2:"から"COM4")

608k5:2015/10/20(火) 14:48:57
ありがとうございます。

すいません、環境をお知らせしていませんでした。
通信はPCのシリアルポートで行っており、OSはWindows2000です。

ご指摘のとおりソースが間違っていますね。
正しくはこうです。

baud 0,9600
CM$="COM0:(S7N2N7NNN)
open CM$ for output as #2
open CM$ for input as #1
print #2,"D"
line input#1,R$
print R$
close
stop

その後、ハードウェアフロー制御をON、CM$="COM0:(S7N2N7EN)としたら、「[27]システムに異常があります」は出なくなりました。今は、
print #2,"D"の後のline input#1,R$で反応しなくなります。つまり、"D"を計測機に送った後の応答待ち状態です。

整理すると、

CM$="COM0:(S7N2N7NN)の場合
line input#1,R$で「[27]システムに異常があります」が出る。input$やinput#でも同じ症状

CM$="COM0:(S7N2N7EN)の場合
print #2,"D"の後に無反応

ハイパーターミナルやteratermでもやってみたのですが、"D"を送っても無反応です。デバイスマネージャでシリアルポートの通信条件設定もしてみました。

ちなみに元のソースをGW-BASICで走らせてみると、これがちゃんと動くんですね。うーん。

609598:2015/10/21(水) 05:44:32
>>608
 詳しいご報告ありがとうございます。
Windows 2000でPCオンボードのシリアルポート …普通ですね。

 環境としては、F-BASICのUpdateバージョンはU003でよろしいでしょうか?。
U003の場合のランタイムは、F1A0RN63.DLL 2000/12/07

それと、Windowsのカーネルは、
KERNEL32.DLL 2007/04/16 : 5.00.2195.7135
 C Runtime Libraryは、
MSVCRT.DLL 2003/06/19 : 6.1.9844.0
 シリアルドライバは、
%SystemRoot%system32\drivers\serial.sys 2003/06/19 : 5.0.2195.6655
%SystemRoot%system32\drivers\serenum.sys 2003/06/19 : 5.0.2195.6655


今回の判明点は、
・エラー「[27]システムに異常があります」はデータ入力段階で発生している。
 入力命令の種類によらず、かつ、フロー制御なしの場合。
・ハードウェアフロー制御(RTS/CTS)有効ではPRINT#で送信待ちになる。


次のテストプログラムでどの段階まで進むか確認していただけませんか。
通信条件設定は次の各パターンで・・・
* CM$="COM0:(S7N2N7NNN)" '制御なし
* CM$="COM0:(S7N2N7ENN)" 'フロー制御(RTS/CTS)有効
* CM$="COM0:(S7N2N7NEN)" 'フロー制御(DTR/DSR)有効

※応答待ち状態に陥った場合はCTRL+CキーでBASICプログラムを強制中断してください。
※もし、while eof(1)... の行でエラー「システムに異常があります」が発生した場合は
直前にWAIT命令を追加してみてください。


var CM$, R$
baud 0,9600
CM$="COM0:(S7N2N7NNN)"
open CM$ for output as #2 : open CM$ for input as #1
WAIT 100
print"!!送信始!!" : print#2,"D" ' コマンド送信
while eof(1) :print"*"; :wend ' 受信開始までループ
R$=input$(1,#1) :print:print"!!受信あり!!"
WAIT 100
if LOF(1)>0 then R$=R$ + input$(LOF(1),#1)
close
stop : end

610k5:2015/10/21(水) 17:45:07
丁寧にありがとうございます。

こちらの環境は下記のとおりです.

F-BASICのランタイム
c:\winnt\system32\F1A0RN63.DLL
F1A0RN63.DLL 2000/12/07 6.3.10.10131

Windowsのカーネル
c:\winnt\system32\KERNEL32.DLL
KERNEL32.DLL 2011/07/05 : 5.00.2195.7144

C Runtime Libraryは、
c:\winnt\system32\MSVCRT.DLL
MSVCRT.DLL 2003/06/19 : 6.1.9844.0

シリアルドライバ
c:\winnt\system32\drivers\serial.sys
serial.sys 2003/06/19 : 5.0.2195.6655
シリアルドライバ
c:\winnt\system32\drivers\serenum.sys
serenum.sys 2003/06/19 : 5.0.2195.6655


下記のコードで実行してみました.
(行番号を付けています)

1 var CM$, R$
2 baud 0,9600
3 CM$="COM0:(S7N2N7NNN)"
4 open CM$ for output as #2 : open CM$ for input as #1
5 WAIT 100
6 print"!!送信始!!" : print#2,"D" ' コマンド送信
7 while eof(1) :print"*"; :wend ' 受信開始までループ
8 R$=input$(1,#1) :print:print"!!受信あり!!"
9 wait 100
10 if LOF(1)>0 then R$=R$ + input$(LOF(1),#1)
11 close
12 stop : end


フロー制御をした場合、

CM$="COM0:(S7N2N7ENN)" 'フロー制御(RTS/CTS)有効
CM$="COM0:(S7N2N7NEN)" 'フロー制御(DTR/DSR)有効
!!送信始!!は表示されるが、そのまま送信待ちの状態、



CM$="COM0:(S7N2N7NNN)"の場合

!!送信始!!
!!受信あり!!

中断しました test2.bas[12行]
任意のキーを押して下さい.

となります。

「!!受信あり!!」の後に何か文字が返ってきているので調べたら(asc(R$))、NULL(00)でした。
その後に「中断しました」となるようです。このNULLがシステム異常の原因なのかもしれません。
明日、時間を作って、チャレンジしてみます。

611k5:2015/10/21(水) 21:32:39
ちなみにこれが、MXD-4660Aというデジタルマルチメータのプロトコルについて書かれたものです。

http://www2.produktinfo.conrad.com/datenblaetter/100000-124999/123730-an-01-en-Schnittstellenbeschreibung_M_4660A.pdf

612598:2015/10/22(木) 05:00:26
>>610,611
> KERNEL32.DLL 2011/07/05 : 5.00.2195.7144
カーネルが新しい・・?。


 資料拝見しました。ハードウェアフロー制御はなしで正解ですね。
機器側の端子を見ると。

資料から読み解くと、
・データはASCIIの文字列(7bit)で行端コードはCRのみとなります。
・機器へのコマンド送信は1秒間に1回程度。
・受信データは、1フレーム(行)が14文字(CRコード含む)長さ固定。
・受信データは1回に4フレーム固定(?)で送られる。


テストサンプルを作り直しました。
・F-BASICでは行端コードの種別の設定がないので、print# を変更します。
・入力の方は行端コードがCRのみでも可能だと思いますので、LINE INPUT#を選択します。

※ヌルキャラクタの問題がまだわからないので、サンプルでは後段で空白に置き換える
処理を加えています。
※受信応答待ち状態に陥った場合はCTRL+CキーでBASICプログラムを強制中断してください。


var CM$, R$(4-1), I%, J%
baud 0,9600
CM$="COM0:(S7N2N7NNN)"
open CM$ for output as #2
open CM$ for input as #1
WAIT 100

if not eof(1) then print "Error:受信バッファが空でない!":close:stop:end

print"!!送信始!!"
print#2,"D";chr$(13);
wait 50

while eof(1) :print"*"; :wait 5 :wend ' 受信開始までループ
print:print"!!受信始!!"
wait 5
while lof(1) < 14*4 :print"."; :wait 5 :wend ' 全フレーム受信までループ
print:print"!!受信終!!"

line input#1,R$(0) :print "!!Frame-1入力終"
line input#1,R$(1) :print "!!Frame-2入力終"
line input#1,R$(2) :print "!!Frame-3入力終"
line input#1,R$(3) :print "!!Frame-4入力終"
close

for I%=0 to 4 - 1
if len(R$(I%))=0 then R$(I%)=space$(14 - 1)
for J%=1 to len(R$(I%))
' もし、ヌルキャラクタがあれば空白に置き換え
if asc(mid$(R$(I%),J%,1))=&H0 then mid$(R$(I%),J%,1)=" "
next J%,I%
print "1):";R$(0) ;"<"
print "2):";R$(1) ;"<"
print "3):";R$(2) ;"<"
print "4):";R$(3) ;"<"

stop : end

 ちなみに特殊な書き方として「open CM$ as #1」と書くとopen命令を1本にできます。

613k5:2015/10/22(木) 09:00:47
丁寧にありがとうございます。

この機器は"D"を送ると、4行(1行がバイト)のデータが送られてくる単純なものだと理解しています。GW-BASICでも確認しています。

さっそくテストサンプルを実行してみました。

「受信バッファが空でない!」

の表示で終了してしまいます。

この行をコメントアウトして実行すると、!!受信始!!のループに入りますが、データの送信が始まらないので、ここから先には進みません。

これは、デジタルマルチメータのバッファに何か残っているということなのですね。ケーブルの結線を調べてみます。

614598:2015/10/23(金) 05:13:57
>>613
 その通り単純なもので、"D"文字列を受けて計測データを文字列で送信する
仕組みで、PC側の状態はおかまいなしで送信するものと思われます。

※GW-BASICの",rs"オプションが気になりますが。
(RS suppresses detection of RTS(Request To Send))


 「受信バッファが空でない!」の行は念のため入れたもので、動作テストを連続で
行った場合とか、まあ無くは無いかと・・。それにNUL charを受信したとのご報告の
件もあるので。 引っかかるとは思いませんでしたが。
本当に入っているのかは「?」ですけど。OPEN時にバッファをフラッシュしないのか?

 とりあえずその行は次のように変更して、画面にそのデータを表示させてみましょう。

if not eof(1) then R$(0)=input$(LOF(1),#1):print "受信??";R$(0):R$(0)=""

 次にコマンド送信ですが、送信バッファに溜まったままで測定器へは送信されていない
可能性も考えられなくはありません。これはprint# を前の形に戻すと変わるかもしれません。

print#2,"D" '←←←print#2,"D";chr$(13);

 そして、print#を変更しても戻しても「!!受信始!!」後のループで進まない
場合は一度、受信チェックのループ行を外してみます。

'while lof(1) < 14*4 :print ... ←コメントアウト


 そして、ここまで変更して、print#を変更しても戻してもうまく受信できない場合は、
さらに変更します。

※表示される受信データはうまく改行されないためおそらく表示がおかしくなると思います。
※もし「wait 100」を外すと「データバイト数」の値が増えるようなら・・考えます..。

print:print"!!受信始!!"
wait 100
R$(0)=input$(LOF(1),#1)
print "データバイト数=";len(R$(0))
print R$(0)
close
stop :end

615名無しさん:2015/10/23(金) 23:44:35
本当にいろいろとありがとうございます。

ケーブルを調べてみたのですが、普通のストレートでした。


今日は別の計測機で、F-BASICでデータが取る出せるか見てみました。

その計測器に送るコマンドはこのようなものでした。

asc(22)asc(02)[命令]asc(03)asc(13)asc(10)
<SYN><STX>[命令]<ETX><CR><LF>

これを文字列(TEST$)で作って

print#2,TEST$

としたのですが、残念ながら何も表示されません。

ただ、これをファイルに保存して、teratermでファイル転送(バイナリ)とすると計測器からのデータが表示されます。仰るように、「送信バッファに溜まったままで測定器へは送信されていない」のかも知れません。次は"D"だけのバイナリファイルを作って、teratermのファイル転送(バイナリ)をしてみます。

616598:2015/10/24(土) 06:34:13
>>615
Win32 APIを使ってCOM1シリアルポートに“残っている”通信条件設定を
取得するプログラムです。(ただし一部表示していない情報があります)
※なお、送受信バッファサイズなどは取得できません(別のAPI関数が必要なので)。

このプログラムを次の各段階毎に実行して、設定状態に違いがあれば、
なにか手がかりになるかもしれません。
1.Windows 起動直後
2.GW-BASICの受信サンプル実行で正常受信した後
3.F-BASICで一回オープン"COM0:(S7N2N7NNN)"クローズした後

注意:declare文は長いため途中で改行してますので、つないで
一行にして翻訳してください。


#define NULL BYVAL 0

'// fBitFields as long のビット定義
#define FBinary &H1 '//0 BINARY MODE, WINDOWSでは常に1
#define fParity &H2 '//1 パリティチェック
#define fOutxCtsFlow &H4 '//2 CTS output フロー制御
#define fOutxDsrFlow &H8 '//3 DSR output フロー制御
#define fDtrControl &H30 '//4:2 DTR フロー制御タイプ
'-DTR_CONTROL_DISABLE 0
'-DTR_CONTROL_ENABLE 1
'-DTR_CONTROL_HANDSHAKE 2
#define fDsrSensitivity &H40 '//6 DSR sensitivity
#define fTXContinueOnXoff &H80 '//7 XOFF continues Tx
#define fOutX &H100 '//8 XON/XOFF output フロー制御
#define fInX &H200 '//9 XON/XOFF input フロー制御
#define fErrorChar &H400 '//10 enable error replacement
#define fNull &H800 '//11 NULL BYTES 受信を破棄する
#define FRTSCONTROL &H3000 '//12:2 RTS フロー制御タイプ
'-RTS_CONTROL_DISABLE 0
'-RTS_CONTROL_ENABLE 1
'-RTS_CONTROL_HANDSHAKE 2
'-RTS_CONTROL_TOGGLE 3
#define fAbortOnError &H4000 '//14 abort reads/writes on error
'fDummy2 '//15:17 reserved

Type T_DCB
DCBlength As Long
BaudRate As Long
fBitFields As Long ' Bits
wReserved As Integer
XonLim As Integer
XoffLim As Integer
ByteSize As Byte
Parity As Byte
StopBits As Byte
XonChar As Byte
XoffChar As Byte
ErrorChar As Byte
EofChar As Byte
EvtChar As Byte
wReserved1 As Integer
end type

declare function CREATEFILE lib "kernel32" alias "CreateFileA" (byval LPFILENAME as string,
byval DESACC as long, byval SHAREMODE as long,
byref LPSECUATTR as any, byval CREDISPOS as long,
byval FLAGSATTR as long, byval HTEMPLFILE as long) as long

declare function CLOSEHANDLE lib "kernel32" alias "CloseHandle" (byval HOBJECT as long) as long
declare function GETCOMMSTATE lib "kernel32" alias "GetCommState" (byval NCID as long,
LPDCB as T_DCB) as long
declare function SETCOMMSTATE lib "kernel32" alias "SetCommState" (byval HCOMMDEV as long,
LPDCB as T_DCB) as long

#define GENERIC_READ (-CLNG(&HFFFFFFFF - &H80000000)-1)
#define GENERIC_WRITE &H40000000
#define OPEN_EXISTING 3
#define FILE_SHARE_READ &H1
#define FILE_SHARE_WRITE &H2
#define INVALID_HANDLE_VALUE -1

617598:2015/10/24(土) 06:36:18
>>616 の続きです。

declare function TEST1_CBIT(V as long,B as long) as long
function TEST1_CBIT(V as long,B as long) as long
var I as long,J as long
TEST1_CBIT=V
if B=0 then error 5:exit function
if B<0 then error 11:exit function '未実装
I=B :J=1
do while (I mod 2 = 0)
J=J * 2 : I=I \ 2
loop
TEST1_CBIT=(V and B) \ J
if ((V and B) mod J) <> 0 then error 21
end function

declare sub TEST1_GetState()
sub TEST1_GETSTATE()

var RES as long
var hfile as long
var DCB as T_DCB
var F as long

HFILE=INVALID_HANDLE_VALUE
HFILE = CREATEFILE("COM1", (GENERIC_READ or GENERIC_WRITE), 0, NULL, OPEN_EXISTING, 0, NULL)
if HFILE= INVALID_HANDLE_VALUE then print "Error:open失敗":exit sub

RES=GetCommState(hfile, DCB)
if RES=0 then
print "Error:GetCommState"
RES=CLOSEHANDLE(HFILE)
else
RES=CLOSEHANDLE(HFILE)

if DCB.DCBLENGTH<>len(T_DCB) then print "!!DCBlength(hex)=";DCB.DCBLENGTH
'**取得結果の表示**
F=DCB.FBITFIELDS '*bit分解必要
print "fBitFields(16進数)=";hex$(DCB.FBITFIELDS)
print "fOutxCtsFlow=";TEST1_CBIT(F, FOUTXCTSFLOW)
print "fOutxDsrFlow=";TEST1_CBIT(F, FOUTXDSRFLOW)
print "fDtrControl=";TEST1_CBIT(F, FDTRCONTROL);"(DTR フロー制御タイプ:0..2)"
print "fDsrSensitivity=";TEST1_CBIT(F, FDSRSENSITIVITY)
print "fErrorChar=";TEST1_CBIT(F, FERRORCHAR) ;"(エラー時文字置き換える)"
print "fNull=";TEST1_CBIT(F, fnULL) ;" (NULL BYTES 受信を破棄する=1)"
print "fRtsControl=";TEST1_CBIT(F, FRTSCONTROL) ;" (RTS フロー制御:0..3)"
print "fAbortOnError=";TEST1_CBIT(F, FABORTONERROR)
print
print "ByteSize=";DCB.BYTESIZE
print "StopBits=";DCB.STOPBITS ;" (stopビット:0=1,1=1.5,2)"
print "ErrorChar(16進)=";hex$(DCB.ERRORCHAR)
print "EofChar(16進)=";hex$(DCB.EOFCHAR)
print "EvtChar(16進)=";hex$(DCB.EVTCHAR)
endif
end sub

'-----
TEST1_GETSTATE '←取得処理の実行
print "終了します。なにかキーを押してください。"
while inkey$="":wend
end

618598:2015/10/24(土) 06:51:23
追伸、実行結果の画面のテキストをクリップボードにコピーできます。
操作方法はALT+SPACEキー入力でコントロールメニューが表示
されるので、一番下の「コピー(Y)」-「テキスト(T)」を選択。

619598:2015/10/24(土) 08:17:56
>>615

>>616 の手順を一部訂正します。
>このプログラムを次の各段階毎に実行して、設定状態に違いがあれば、
>なにか手がかりになるかもしれません。
--
1.Windows 起動直後
2.(1回目)F-BASICで一回オープン"COM0:(S7N2N7NNN)"クローズした後
3.GW-BASICの受信サンプル実行で正常受信した後
4.(2回目)F-BASICで一回オープン"COM0:(S7N2N7NNN)"クローズした後
--以上、訂正です。

620名無しさん:2015/10/24(土) 16:54:52
ありがとうございます
(なんとお礼をしたらいいか)

早速、月曜日に研究室に行ったらやってみます。

これまで違う計測機器やモデムの簡単な制御をF-BASICでやったことはあるのですが、

PRINT #2,"D"

を実行すると

D(CR)(LF)
44 0d 0a

の3バイトのコードがCOMに送らると思っていました。処理系によって違うのか不思議に思っています。それ以外にタイミングなどの問題があるのかもしれません。シリアル制御は奥が深そうです


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板