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

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

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

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

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

2F橋:2003/12/19(金) 20:50
「エディットコントロールに最初からカーソルを置きたい 」のスレッドの話題が
ほぼ終わった様なのでこちらのスレッドに移動させて頂きました
(もちろん。こちらで続きを行って頂いて構いませんし…話題が盛り上がりそうな場合は別スレ立てます)

>エディットコントロールに最初からカーソルを置きたい
>1 名前: たか 投稿日: 2003/09/30(火) 18:34
>
>フォームにエディットコントロールが1つあるのですが
>マウスなどでクックしないとカーソルが置かれません。
>どのように書けばよいのでしょうか?
>「エディットボックスでエンター移動」もみたのですが、私には????
>
>あと、スレッド型へ・・・とはココの事だったのですね、解らないですみませんでした。
>
>
>2 名前: TOKO 投稿日: 2003/10/01(水) 08:44
>
>たかさん>
>
>最初からEDIT1にカーソルをセットするは下記のようでいいのでは・・
>
>#include "Windows.bi"
>
>var EDIT1 as object
>EDIT1.ATTACH GETDLGITEM("EDIT1")
>EDIT1.SETFOCUS
>
>while 1
>WAITEVENT
>wend
>
>
>2点目についてはホームページの
>サンプルソース
>★エディットボックスでのエンター移動★(提供gobou氏)
>が参考になりますヨ。
>
>
>3 名前: たか 投稿日: 2003/10/01(水) 10:41
>
>あ!動いた。 ありがとうございました。
>
>
>4 名前: F橋 投稿日: 2003/10/14(火) 19:53
>
>え〜と…今更のレスすいません…
>
>たかさん>
>ご質問ありがとうございました
>
>TOKOさん>
>ご回答ありがとうございました

3F橋:2003/12/19(金) 20:53
「思い出したようにBASIC??」スレもこちらに移動させて頂きました

>思い出したようにBASIC??
>1 名前: 山さん 投稿日: 2003/09/19(金) 16:59
>
>5年程前にN88-BASICからF-BASICへ移植したプログラムをCで復活させようとあれこれいじっている途中で
>まさかいまさらF-BASICなど無いだろうとGoogleで検索してたどりついたのが貴掲示板でした。
>
>びっくりしています。また反省もしています。未だに(失礼ながら!)現役でF-BASICが活躍しているとは!!
>
>古いCOBOL、FORTRAN、アセンブラからスタートして、PC98のモニタアセンブラ、マクロアセンブラ、N88-BASIC、F-BASIC
>C、C++、JAVA、PERL,PHP・・・とあれこれプログラムを組んできて、’BASIC'はとっくに廃れたのだと思い込んでいました。
>
>PC-9801,PC9821が全盛の頃はN88-BASIC+MASMの組み合わせが最強だと思い、Windowsが出現した時N88ーBASICを生かそうと、
>F-BASICを探し出して、「これは使える」と悦に入っておりましたが、いつの間にか、C からJAVA、PERL、PHPの方向へどっぷり、
>BASIC は完全に忘れておりました。
>
>F-BASIC(N88-BASIC)を現役で使っておられる方、どれくらいいらっしゃるのかな。
>
>
>2 名前: F橋 投稿日: 2003/09/19(金) 18:07
>
>山さんさん
>
>>5年程前にN88-BASICからF-BASICへ移植したプログラムをCで復活させようとあれこれいじっている途中で…
>5年前…私の会社ではN88BASICが全盛だった気が…(笑
>Windowsで使える言語を模索中だったはずです(かなり乗り遅れましたです)
>
>>まさかいまさらF-BASICなど無いだろうとGoogleで検索してたどりついたのが貴掲示板でした。
>F-BASIC Ver6.3が発売されて…既に4年…
>富士通がXPに「対応しない」と宣言してからは残念ながら使う人は一気に減っていると思います
>
>>びっくりしています。
>はい。びっくりする方が多い気が私もします(笑
>
>>また反省もしています。未だに(失礼ながら!)現役でF-BASICが活躍しているとは!!
>なんとか現役なんですよ〜(笑
>というか他に私が扱える言語がありません(笑
>N88BASICからやっとF-BASICに移行出来つつあるのですが…
>ホントに復活して欲しいです
>
>>’BASIC'はとっくに廃れたのだと思い込んでいました。
>流れから見れば…BASICは残念ながら過去のものに思われてもしょうがないですよね…
>確かにVBもありますが今から覚えるのなら JAVAや PERLの方がいいと思いますし…
>ただ非常に分かりやすいんですよね…
>
>VBの様なイベント主体のBASICでは無く…
>F-BASICの様な過去のBASICで簡単にプログラムが作れる言語が無くなるのは辛いです
>
>>PC-9801,PC9821が全盛の頃はN88-BASIC+MASMの組み合わせが最強だと思い、
>私もこの組み合わせが最強だと思います
>同様にWindowsになってからはF-BASIC + Borland C++ が最強と思ってました
>F-BASICが復活さえすれば…私のプログラマー生命ももう少し延びるのですが…
>
>>いつの間にか、C からJAVA、PERL、PHPの方向へどっぷり、
>>BASIC は完全に忘れておりました。
>時代に取り残されず…新しい技術を次々と覚えれる方とお見受けしました
>私は頭が悪く(笑)なかなか新しい技術についていけませんです(笑
>Windowsの次期OSが出て…F-BASICが完全に動かなくなったら…
>私はプログラマとしては食べれない可能性が…(笑
>
>>F-BASIC(N88-BASIC)を現役で使っておられる方、どれくらいいらっしゃるのかな。
>私の所はF-BASICとN88BASICがほとんどです
>開発はF-BASICのが少し多いかもですが…N88BASICも未だに多いです(笑
>
>PC9821の生産も終わっちゃったからなぁ…辛いなぁ…(涙(笑
>
>ご投稿及び足跡ありがとうございました

4超初心者:2004/01/15(木) 14:04
初めて投稿します。
OPTION BASE って、F-BASIC では使用できないのですか?
使用できなければ変わりになる関数ってあるのですか?

5nisii:2004/01/15(木) 19:33
option baseって、配列の添え値が1からスタートする機能でしたっけ?
ヘルプにも書いてある通り、書き換えが必要でしょう。
といっても、配列の大きさを+1余分に確保するだけで対応できるのでは?

6超初心者:2004/01/16(金) 08:58
そうなんですか。ありがとうございます。
試してみます。

7F橋:2004/01/17(土) 14:15
nisiiさんのレス以上の事を思い浮かばず…(笑
超初心者さんも多分問題なく解決してると思うです
ありがとうございました

そういえば構造体の中の配列で…ファイルのfield定義するときというか…
必ず0から始まるってのを忘れてかなりハマっていたのを思い出したです

…うまく説明出来ません(笑)すいませんです

8F橋:2004/01/17(土) 14:21
「教えてください。 」のスレッドの話題がほぼ終わった様なのでこちらのスレッドに移動させて頂きました
(もちろん。こちらで続きを行って頂いて構いませんし…話題が盛り上がりそうな場合は別スレ立てます)

1 名前: ARAKI 投稿日: 2003/12/18(木) 12:17

始めましてARAKIと申します。

お世話になります。

突然とは思い投稿をさせて頂きました。

VBでCLSIDを指定する記述がありました。

Object = "{1F8E7F86-A47F-11D2-B9D7-08005A4B5E6E}#1.0#0"; "PTSVR.OCX"

F-BASICに置き換えたいのですが良く解りませんでした。
ご存じの方がおられましたら宜しくお願い致します。


2 名前: ニャン子 投稿日: 2003/12/19(金) 07:29

お世話になります。ニャン子です。

VBでのCLSIDをF−Basicで利用したいとの事ですが、結論から言うと
無理です。というのもOCXはOLEオートメーションの一種でDLLの様にプロ
シージャをコールするのとは技術的に全く違います。

OLEオートメーション(OCX含む)の詳しい説明は下記を参照してください。
http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/6/oleabs/oleabs.html

で、本題の「PTSVR.OCX」ですが、これはIBMのProTALKERの事でしょ
うか?であれば、素直にVBでOCXをコールするプログラムを作り、F-Basicは
そのVBをコールする方法が一番だと思います。その他の手段としてはF-Basicか
らProTALKERを呼び出すHTML(Javaスクリプトを経由)を作成し
それを経由する方法もありますが、こちらはあまり現実的では無いと思います。

OCXをどうしてもF−Basicで対応出来ない理由の一つにイベントがありま
す。VBの場合はF−Basicの様に全てのイベントをランタイムが管理してい
る訳では無く、OCXなどからもイベントを発生させる事が出来る為OCXが簡単
に利用できますがF−Basicの場合はそう簡単には行きません。
(その代わりVBのFormモジュールはネイティブコンパイルされずランタイム
も静的リンク出来ない)

仮にC言語で直接OCXをコールするDLLを作成しF−BasicからCALL
したとしてもこのイベントが解決出来ない限り現実的では無いと思います。


3 名前: F橋 投稿日: 2003/12/19(金) 10:28

arakiさん>
ご質問投稿ありがとうございました

ニャン子さん>
ご回答ありがとうございました

-----

ひとりごと…質問も回答も分からない…申し訳ないです


4 名前: ARAKI 投稿日: 2003/12/19(金) 18:45

ニャン子 様
少し遅くなりましたが、詳細な、ご説明をして頂いたことで、結論がハッキリ致しました。
大変助かりました。ニャン子 様の言われた通りIBMのProTALKERの件です。
また。リンク先まで、記述して頂きまして、ありがとうございました。

9gobou:2004/01/18(日) 10:18
windows拡張プログラミング(プリンタをオブジェクトとして)の方で、文字をカラー印字したいのですが
どうしたらよいのでしょうか?
(lprint type "DC"なら lprintsetcolorのようですが)
choosefont関数で戻ってきた色を指定して印字したいのです。
よろしくお願いします。

10TOKO:2004/01/18(日) 16:48
gobouさん>
目的をはずしていたらゴメンナサイ・・
CHOOSEFONT関数で選択した色はLONG型変数に入るそうなので私の場合は
変数 var shared RGBCOLOR as longと指定しておき
if CHOOSEFONT(FFONT,RGBCOLOR,-1,0) then
  ・・
後、印刷時フォント選択ダイアログで色を選択し、PRT1.SETFORECOLOR RGBCOLOR で
選択した色で印刷しています。
結果的に不都合なく使っていますが、使い方が違っていたらご指摘ください。

11gobou:2004/01/18(日) 19:34
TOKOさん ありがとうございます。
それです、それが知りたかったんです!
助かりました これからもよろしくお願いします。

12F橋:2004/02/20(金) 20:49
セキュリティの都合上スレッドの制限が50になっております
極力こちらのスレッド。もしくは関連のスレッドにご投稿頂けますようよろしくお願い申し上げます

(古いスレッドは少しずつどこかに合体し、その後に消去予定です。よろしくお願いします)

13nisii:2004/03/01(月) 19:34
●Windows付属のMP3 Codecについて。●

ビットレート他を、F-BASICから設定できる方法ってないでしょうか?
レジストリから「MPEG Layer-3」を検索しましたが、それらしい値が見当たりませんでした。

なぜ欲しいかというと…。

DivXの転送レートやファイルサイズ、クリッピングやリサイズ値を、自動補正するツールを作っています。
で、計算するだけじゃもの足りず、エンコーダとDivX、MP3の設定としてすぐに反映させたいんです。

エンコーダのAviUtlと、DivXの設定はできそうなので、あと一歩。

ご存知の方、よろしくお願いします。

14荒木:2004/03/06(土) 11:05
荒木と申します。
お世話になります。
F-BASICにIBMの音声合成ソフトProTALKER 97 の合成エンジンを利用した開発者向け情報音声合成ソフトを無料でダウンロードして使用しています。
富士通(株)にもIBMの様な音声合成ソフトは有りますでしょうか。もし、ご存知で有りましたら、リンク先URLアドレスを教えて頂けませんでしょうか。
よろしくお願い致します。

15名無しさん:2004/03/31(水) 22:27
すいません。音声合成は私が分からないので的はずれになってたらすいませんです

http://www.animo.co.jp/product/fs/
>FineSpeech は富士通株式会社の登録商標です。

富士通の関連会社?よく分からないのですが関係あります?

Fujitsu Voice Series
http://pr.fujitsu.com/jp/news/1998/Nov/9-5.html
関係ありそうですがXPに対応していない予感がする(w

Googleで「富士通 音声合成」で適当に探しただけなんですがお役に立てば幸いです

16荒木:2004/04/02(金) 17:15
ご返答下さいましてありがとうございました。
わざわざ名無しさん より富士通 音声合成の関連リンク先を調べて頂きまして、お礼を申し上げます。
現在は富士通株式会社の登録商標でなく別会社に変わっていました。
IBMの音声合成ソフトProTALKER 97 は無料でダウンロードしまして
F-BASICのエディタを読み上げています。
動作OSではWindows 2000、Windows XPは適応になっていませんでした。
もしWindows 2000、Windows XPも適応できる可能性方法がありましたら
教えて頂けませんでしょうか。よろしくお願い致します。
参考としまして下記にIBMのホームページとしました。
_____________________________

IBMのホームページ
★ 動作OS:Windows95, Windows 98, WindowsNT 4.0

ProTALKER 97 エンジンのダウンロード
http://www-6.ibm.com/jp/voiceland/download/engdown.html
最小音声辞書のダウンロード        Pt97vd07.exe
エンジン モジュールのダウンロード     Pt97eng.exe

ProTALKER ActiveX コントロールのダウンロード
http://www-6.ibm.com/jp/voiceland/pt20/ocxdown.html

PTOCXのダウンロード  PTOCX.EXE

ProTALKER ActiveX コントロールのサンプル プログラム
http://www-6.ibm.com/jp/voiceland/pt20/ocxsamp.html
サンプルのダウンロード          Ptxsamps.exe

17名無し:2004/06/10(木) 00:57
F-BASIC6.0以降では、透過BMPファイルって使えないんですか?

18ねずみ男:2004/06/12(土) 13:41
私も試してみようと思ったのですが透過BMPが用意出来ずにテスト出来ませんでした(笑

Windows98SEとWindows2000のペイントで透過BMPを用意しようとして出来ずに…
ネットで調べるにどうも透過の出来るBMP形式はBMPの新しい形式(?)の様に見えるのですが…

XPだと透過BMPがあるのかな…

予想で申し訳ないのですが…透過BMPをXPで用意したのならば出来ないのかもです
(あと最近の何かのソフトで作った場合とか…)

あと…↓こちらでも別の言語でうまく行かない方が見えるみたいなんですが…
http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200206_02060009.html

透過型BMPの説明が少しあるのでこれで出来るのかも知れませんです

あと。BMPでは無いのですが…

JPEG画像の単色透過を実現する
http://hp.vector.co.jp/authors/VA016917/tips/v3/

F-BASICではJPEGも扱えたはずなので可能ならばJPEGに変換してみるのも一つの手かも…

…私は動画、絵、音などの最新の技術(笑)はあんまり分かりませんので
この程度しかレスが出来ません。

ご存じの方。あとよろしくお願いします(笑

19F橋:2004/06/15(火) 13:44
下記をメールで頂きました。

> 初めて投稿させて頂きます。
> F−BASICを愛用しているのですが、原因不明のトラブルで困り果てたところ、
> このサイトにたどり着きました。
> 諸先輩方々のお知恵をお願いします。
>
> 関数プロシージャをいくつも作って処理しています。
> 例えば開始時刻(09:36)と終了時刻(11:52)を与えると、その所要時間を返すようなものです。
> 1000件程の開始時刻と終了時刻がありまして、繰り返し関数プロシージャを使用して(1000回程)処理しています。
>
> このプログラムが完走する時と、しない時があり困り果てています。
> まずデータは同じままで、1回目、2回目と何度かプログラムを実行してみます。
> すると途中でエラーが発生する時があります。
> 全くランダムで規則性はなさそうです。
> エラーは関数プロシージャを呼出す部分で発生し、エラーコードは『5』です。
>
> ただエラーが発生する瞬間は、メールの送受信を開始したときや、他のプログラムを起動したときなど、
> PCになんらかの負荷がかかったときがほとんどです。
> 本来F−BASICプログラムにはなんら関係なさそうですが、因果関係があるような気がします。
>
> この件、私に問題があるのか、F−BASICなのか、OSなのか、とんと見当がつきません。
> 新参者ではございますが、よろしくご教授お願い致します。
>
> 使用環境1
> Windows XP SP1 CPU:Pentium4 2.6GHz パイパースレッディング版
>
> 使用環境2
> Windows 2000 SP4 CPU:Pentium3 1.0GHz
>
> どちらも同じ現象がでます・・・・・

以下を私から返信させて頂きました

尚、私からの経験談からなのですが…
> 全くランダムで規則性はなさそうです。

WAIT関数は使っておりますでしょうか?

例えば。毎回 ":00" にのみ何らかの処理をする場合…

*LOOP
if right$(time$,2)="00" then gosub *nanikanosyori
GOTO *LOOP

では無く…

*LOOP
wait(10)
if right$(time$,2)="00" then gosub *nanikanosyori
GOTO *LOOP

の様にWAIT関数を入れると改善される(エラーが出ない)場合があります
WAITを入れないとCPU使用率100%にすぐになりやすく色々な症状が出る様です
間にWAITを少しでも入れるとCPUが休む時間が多くなり改善される場合があります

-----------

私の回答に何か間違い等あれば遠慮なくご指摘頂けると助かります
またこの件で何か解決案をご存じの方、よろしくお願いします

20F橋:2004/06/15(火) 13:45
>>17
私も透過型は申し訳ないのですがあまり分からず…
BMPファイルはOSによって違うと聞いた事がありますので
別のOSでBMPファイルを作ってみたりすると出来るかも知れないのですが…


…すいません。その程度しか分かりません

21nisii:2004/06/15(火) 15:17
メモリ管理上の問題かもしれません。
F-BASIC側の問題と考えていますが、とりあえず軽減する策を。

(1)適宜メモリを整理する。
RC& = fre( 2 )

(2)APIコールや拡張関数を呼ぶ回数を減らす。

(3)配列やオブジェクトを使用したら、プロシージャから戻る前に、明示的に開放する。
省略すると開放されないときがある。

(4)declare functionでDLL呼び出し宣言をする場合は、"xxx.DLL"と書いたほうが良い。


また、タイマイベントを使わない方が無難かもしれません。
タイマ値を記憶しておいて比較する方法なら、CPU負荷が大きくても時間に狂いがでませんし。

22nisii:2004/06/15(火) 15:19
>>21>>19 へのレスです。

23nisii:2004/06/15(火) 15:20
>>20

(1)どれか1色を透明にする、と決めて動作するソフトがあるみたい。
GIFのように規格化してれば利用しやすいんだけどね。

(2)また、BMPには32bitフォーマット(RGBA)もありますが、
通常は利用されないAプレーンを、切り抜きの型に使うソフトもあるようです。

いずれにしても、WindowsのBMP標準規格には無いので、
アプリケーション側で対応する必要があります。

しょせんは「写真」+「切り抜き型」なのですから、
別々に作成・管理しておき、最後に受け取りソフトに合わせて(1)(2)いずれかの
合成をすれば目的が達成できるのでは?

24F橋:2004/06/15(火) 20:48
nisiiさん>
ご教授ありがとうございます

>(1)適宜メモリを整理する。
>RC& = fre( 2 )
忘れていたのですが何か調子が悪いって時にこれを入れて直る症状もありましたよね
補足して頂きありがとうございました

25F橋:2004/06/15(火) 20:50
下記をメールで頂きました。

>  そのプログラムはCANONのLIPSコマンドで作画するものです。 御存知のよ
> うにLIPSのベクタモードはプロッター代わりになり重宝しています。 プリン
> ターをLIPSモード、プログラムは LPRINT TYPE "RAW" にしているのですが
> ところどころにゴミが入って悪さをしてるようです。 F-BASICのマニュアル
> にはポート直接操作にLIPSが入っていませんがそのために動かないのでしょう
> か(富士通サポ-トではそう言われてます)。
>
>  こうすればLIPSも動きますというような技が有るのでしたら是非とも教えて
> いただきたいと思いメールをいたしました。 よろしくお願いします。

私はF-BASICのマニュアルで一切書かれていないレシートプリンタ(スター製)を
動かした事があるのですが特に問題は無かったと思います
(レシートの切断。とか特殊なコマンドもありますので…)
先ほどソースを確認した所印刷ルーチンが

OPEN "LPT:" FOR OUTPUT AS #1

を使っておりました。これで印刷して不具合が無かったと思います
一度試してみて下さい

あと…通常使うプリンタにチェックが入っていなかったり
ネット上のプリンタだとトラブルがあった様な気がします
すいません。この辺りはうろ覚えです

また、ゴミがある程度ならばレーザープリンタのプロパティの設定で
回避出来る手段があるかも知れません

尚、予測でしか無いのですがそのレーザープリンタがUSB対応ならば
USBで接続して(F-BASICではRS232Cをオープンして扱う)行うと
出来るかも知れません(自信はありませんので保証は出来ません)

勝手に思っている部分なのですが。
ハードのプリンターの部分はWindowsが横取りして何かしそうな気がしてます
例えばデータを送るのを(Windowsが)ちょっと遅らせたり。
しそうな気がするのですがRS232Cの場合はタイミングがずれると
使えない機器があり得るのでWindowsが手出しせずそのまま送ると思います

ゴミが出る程度なのでデータをそのままプリンタに渡していないだけの気がします
その辺りをもう一度ご確認下さいです

違うかも知れませんが私が考えている今回の状況…
MS-DOSでは「123456」の印字データをそのままプリンタへ流す
Windowsでは「123」で保留…Windowsが別の事をしそのあとに続き「456…」
プリンタ側で「123456」と連続したデータは正常に印字出来るが
「123」(データが一瞬途絶えて)「456」の場合は失敗する…

・OPEN"LPT:" なら連続してデータを流すかもしれない
・OPEN"COM..." (RS232Cを使う場合)はハードの都合上連続して流れる「はず」
・プリンタの設定でデータが途切れても印刷できる設定があるかも知れない
(データが揃うまでプリンタが待つ→印刷が若干遅れる可能性はあります)

全て予想でしか無いのでよろしくお願いしますです

----------------

私の回答に何か間違い等あれば遠慮なくご指摘頂けると助かります
またこの件で何か解決案をご存じの方、よろしくお願いします

26たけし:2004/06/16(水) 09:44
(19)でF橋様に質問をアップしてもらった「たけし」と申します。
新参者ですが宜しくお願いします。
早速アドバイス頂いた(21)の「nishi」様、ありがとうございます。

相変わらず問題のプログラム達(何本かあります)は、普段は順調なのですが
PCに負荷がかかっているとエラーを発生します。
もう少し実験を繰り返してみて、またご報告差し上げます。

(同様の経験ありの方がいらっしゃいましたら、ぜひ教えて下さい)

27たけし:2004/06/16(水) 10:27
★解決しました!★ ご報告

(19)の質問の「たけし」と申します。
問題が解決しましたのでご報告します。

例えば次のような関数プロシージャを定義したとします。

declare function X_KANSU%( PM$ )

function X_KANSU%( PM$ )
X_KANSU% = val( PM$ ) * 16
end function

文字型の数字をパラメータに入れて呼び出すと、16倍にした数値を返します。
私は次のようにプログラム中で使用しています。

SUM%=321
A$="123"

SUM%=SUM% + X_KANSU%( A$ )

とくに難しくもなく、平凡な使い方だと思います。
この中で「 SUM%=SUM% + X_KANSU%( A$ ) 」の部分をループでまわしたり
すると、「エラー『5』」が発生する場合がありました。

※実際には上記のプログラムを書いて実行しても、エラーは起こらないようです。
 私の場合、500行位のプログラムの中で上記のような使い方をする部分で、
 不規則なエラーが発生します。

そこで次のようにしてみました。

X%= X_KANSU%( A$ ) : SUM%=SUM% + X%

関数プロシージャの戻り値を一旦変数に取り込んでから、演算に使うようにしました。
たったこれだけで、エラーの発生がなくなりました。

皆様のご参考になるかどうか判りませんが、ご報告します。
質問に目を通して頂いた方々に、お礼申し上げます。

28仙人池:2004/06/16(水) 14:10
25にて質問をアップしていただいた者です。
アドバイスしていただいたOPEN文を使ったらという事で書き換えてみました。
OPEN "LPT0:" FOR OUTPUT AS #1 を入れて LTYPE文をすべてPRINT #1に変更して実行
してみましたが結果は変わりませんでした。 プリンタに送り出したコマンドの中に時々ゴミが
混入しています。 今使っているプリンタはLBP-1310なのですがどういう訳かUSB接続が出来
ません。 まずはここから直していきたいと思います。

29仙人池:2004/06/16(水) 17:05
やっとUSB接続が出来ました。 ところでF-BASICからUSB経由でコマンドを送るには
RSを使うということですが具体的にはどうしたらいいのでしょうか。
まぬけな質問で申し訳ありません。

30F橋:2004/06/16(水) 21:19
>>27
>たけしさん
>SUM%=SUM% + X_KANSU%( A$ )
>そこで次のようにしてみました。
>X%= X_KANSU%( A$ ) : SUM%=SUM% + X%
>たったこれだけで、エラーの発生がなくなりました。

少々気になるのですが…
新規にプログラムを用意してみて sum%+sum%+x_kansu%(a$) を含めた
小さいプログラムでも症状出ますか?

というのも。他に不具合があるのでは?と考えてしまっており…

エラーの症状が出ていた↓このプログラムで…
>SUM%=SUM% + X_KANSU%( A$ )

ここはそのままにしておきプログラムの先頭の方に
DEF LEN 8192 AS dummy$
と定義するだけでもしかして不具合出ない。もしくは激減しませんか?

ちなみに。これで症状が出なくなった場合は私の場合はプログラムミスでした
(プログラムのどこかでメモリの確保ミスなどがある場合ばかりでした)

「SUM%=SUM% + X_KANSU%( A$ )」から「X%= X_KANSU%( A$ ) : SUM%=SUM% + X%」へ
変更しただけで不具合が回避されたのがどうも気になってしまっておりまして…

-----

「たまに」だったんですよね…

文字化けなどの理由で…
「SUM%=SUM% + X_KANSU%( A$ )」から「X%= X_KANSU%( A$ ) : SUM%=SUM% + X%」へ
変更して治る場合はあるのですが、この場合変更前は間違いなくエラーになるはずなので…

31F橋:2004/06/16(水) 21:58
>>28
>仙人池さん
OPEN文を使っても症状変わらずなんですね…う〜ん…
ちなみに症状は全く変わらないのでしょうか?多少の変化はありましたか?
あと「ゴミが混入」…ですよね〜…

http://cweb.canon.jp/e-support/qasearch/answer/lasershotprinters/q001000004410.html
ここを見ると文字が欠ける。等の不具合はドライバ側であったみたいなんですが…

F-BASICのアップデート情報も探してみたのですがその様なトラブルは見つかりません…
(余白などがおかしい。の様な不具合の修正はありました)

私はLIPSコマンドを知らないのですが…おそらく。ですが…
特定のLIPSコマンドを使った時のみゴミが出る症状では無いでしょうか?
新しく小さいプログラムを作って見て頂き…例えば線を引くのみ。もしくは円を描くのみ…
この場合でもゴミが出る症状は発生しますか?

ゴミが出る。ってのが私からは不思議で…
一切印字が出来ない。印字が無茶苦茶。ならともかく「ゴミが出る」程度の場合…
プリンタドライバが違う(もしくは壊れている)場合の症状に非常に似ているなぁ。と思うのですが…

>>29
>やっとUSB接続が出来ました。 ところでF-BASICからUSB経由でコマンドを送るには
>RSを使うということですが具体的にはどうしたらいいのでしょうか。
すいません。それ以上は私は分かりません
え〜と。F-BASICのHELPでRS-232Cで見て頂くと分かると思いますが…
RS-232Cでつなぐ機械の場合に前準備というか…多くのパラメータが必要になるです
(例えばモデムなどを使う場合)マニュアルに事細かく書いてあるので
それを見ながら作ればいいのですがプリンタをつなぐ場合はそれ以上分かりません
RS-232Cを使った事がある方ならば試しながらテストしてみる事は出来ると思うのですが
全く初めて使う方には…私ではちょっと説明仕切れませんです。…すいません

ただOPEN文でも症状が全く変わらないのならばUSBでも症状変わらないと思った方がいいかもです

-----

そのゴミが印字されてしまうプログラムなのですが…
その症状が出る所のみにして…100行以内にして頂きここに投稿できますか?
それが出来れば私の環境でも試してみますが…

32仙人池:2004/06/17(木) 10:04
F橋様アドバイスありがとうございます。 結果は全く同じでした。 ゴミが入ってしまう
小さいプログラムを作ってみます。 なおゴミと結果の写真をメールにて送らせていただき
ました。

33F橋:2004/06/17(木) 14:13
>>32
メール頂きました。印字結果の写真を拝見させて頂きました
01.JPGがDUMPモードでの印字で02.JPGが実際の印字結果でいいんですよね?
01.JPGのDUMPモードでは確かに異常なデータが送られているみたいですね…
で。その結果の02.JPGの実際の印字ではでは「画像が欠ける」という症状になるみたいですよね…

>>31でも少し話しましたが…
プリンタドライバの不具合でこういう症状はあるみたいなのですが
最新のプリンタドライバをダウンロードして使ってみても同じ症状なんでしょうか?

それと異常なデータには必ず 0D 0A が含まれており正常なデータに 0D 0A が見受けられません
0D 0A は改行コードですね…この辺りに何か解決のヒントがある気がします

F-BASICのバージョンはアップデートをしてU003になってますよね?
(アップデートをしていない場合はどこかで文字化けになる症状があった気が…)

↓印刷すると一部文字化けしてしまう…より
http://www.mster.co.jp/visiosquare/cgi-bin/visbbs/mibbs.cgi?fo=all&mo=p&tn=0190
>02: 名前:oki投稿日:2001/11/21(水) 12:43
>私も2002で文字化けや文字が欠けるという現象がでます。
>Canonのレーザーショットですが、ドライバのグラフィックモード
>(LIPSモード/イメージモード)を切り替えることで正常に印刷
>される場合もあります。

↑これって関係あるのかな…

なんとなくですが…F-BASIC側の問題では無い気がするのですが…

------------

掲載してよければこちらで01.JPG, 02,JPGを公開してもいいでしょうか?
他の方からも意見が聞けるかと思いますので…

34F橋:2004/06/18(金) 01:39
メールにてソース確認しました
(手元にLBP-1310が無いので)キャノンのプリンタドライバにプレビュー機能があるので
それを使ってテストしようと思っていたのですが…

…すいません。ドライバ介さず印字するのだからプレビュー出来ないっすよね(汗

(ともかく。プリンタのドライバは関係無いはずです
 何度もその話をしてしまい申し訳ございませんでした)

F-BASICで不具合があるのか(Windowsの機能も含む)それ以外なのかを
解決したいので以下の順番で試してみてください

(1)
以前OPEN "LPT0:" FOR OUTPUT AS #1の話をしたと思いますが
OPEN "AAA" FOR OUTPUT AS #1に変更してください
(プリンタに流すデータをそのままファイルにしてください)

(2)
MS-DOSプロンプトを起動し該当のディレクトリ(フォルダ)に移動し
DUMP AAA > AAA.DMP (enter)
として下さい
この段階で 0D 0A が含まれていないのを確認してください

(3)
OSはWindows98でしたよね?
MS-DOSで再起動し
TYPE AAA > PRN (enter)
とし印字してください
(CONFIG.SYSにprint.sysを組み込んである必要があります)

以上の方法でMS-DOSでの印字になりますのでどこが原因か判明すると思います

35F橋:2004/06/18(金) 01:48
上記の(1)〜(3)が何をしているかの説明と
異常だった時に何が原因かが分かるはずです

(1)〜(2)はプリンタに流すデータをファイルにしてます
ファイルに変換した場合に 0D 0A が含まれて「いない」事を確認してください

0D 0Aが含まれていないのが正常です
0D 0Aが含まれている場合…
私の環境(Windows98SE+F-BASIC Ver6.3+U003)では含まれません
何らかの環境の異常だと思われます
F-BASICのUPDATEをしていない。何らかの常駐ソフトが邪魔をしている
ネットワーク越しの印字やプリンタドライバの設定が標準では無い場合。
もしくはプログラムミス等々…

(3)はMS-DOSで印字します
これで異常(印字が欠ける等の症状)があるのならば…って考えられないんすけど(笑

印字が欠ける症状が出る場合…
プリンタケーブルやプリンタ、パソコン本体のプリンタコネクタの異常など…ハード的な異常

印字は正常…
MS-DOSでは正常に印字されWindowsでは不具合が出る。って事なので
F-BASICもしくはWindowsの不具合が考えられます

----------------

DUMPコマンドやPRINT.SYSデバイスが組み込んであるか。等は説明が長くなるので省略します
MS-DOSの知識がある方ならば分かる事ですので…
もし分からなければそのときに説明します。って事で…

36仙人池:2004/06/18(金) 09:53
F橋様、アドバイスありがとうございます。 時間が出来たらそくやってみます。 なお写真の公開は問題有りません。 あとF-BASICのバージョンですがU003、プリンタドライバも最新のを入れています。

37仙人池:2004/06/18(金) 13:37
まずお送りしたテストプログラムの結果をファイルしてみました。でダンプしたのですが
うまくいかないのでえいやとそのままプリンターに出すと見事にゴミ無しで書いてました。
そこで元プログラムの結果を同じように出力すると\(^O^)/うまくいきました。直にだ
すことはかないませんでしたがWinのF-BASICでLIPSを使える事が判明しうれしい限りで
す。F橋様、アドバイスどうもありがとうございました。大変感謝しています。

また何かありましたらその時はよろしくお願いします。

38F橋:2004/06/18(金) 20:52
>>37
>そこで元プログラムの結果を同じように出力すると\(^O^)/うまくいきました。
え〜と…一旦テキストファイルにして…それをshellか何かで…

TYPE PRFILE.TXT > PRN

の様にしてみたら出来た。って事でいいんでしょうか?

う〜ん…F-BASIC側に何かの問題がまだあるんですね…

話はずれますが…通常の文字列の場合を大量に操作すると一部エラーになる事があるらしいのですが…
F-BASICの内部ではLPRINT の命令を文字列として保管しているのでそれで今回の様にゴミがまざる場合がある…

…そんな事あるのかな(笑
(分かる方お願いしまーす)

F-BASICのみでは成功しなかったのに私的には残念なのですが
印刷するって目的は達成できたので良かったです

>F橋様、アドバイスどうもありがとうございました
非常にへたくそな…回り道の多いアドバイスで申し訳ございませんでした
初めからこの方法を提案できたはずなのに…とちょっと後悔してたです
教える方の責任も重大なんだなぁ。と思いました
私も勉強になりました。ありがとうございました

3917:2004/06/23(水) 06:10
うーんダメっぽいですねぇ…
HSPに行けば小数点が使いにくいわ、
こっちはこっちで画像関係が弱いわ、
ロートルがまともに使える言語って本当にないですねぇ…

40もじゃ:2004/07/27(火) 12:38
みなさまこんにちは。
F−BASICの達人の方々に、お知恵を拝借したく投稿させて頂きます。

WindowsXPで使用しています。(非対応との前提はご容赦下さい)
FB6.3で作成したプログラムを、常に前面に出しておく必要に迫られ、
苦戦しております。

具体的には、キーボードインターフェイスに接続したバーコードスキャナ
からの信号を、EDITボックスで受け止めたあと処理をするプログラムです。
バーコードスキャナからの信号は、実際のところキーボードを打鍵したのと
同じもので、カーソルのある位置に文字として出力されます。
デスクトップ上に「メモ帳」と「EXCEL」と「WORD」が立ち上がって
いる場合、フォーカスのあたっているアプリのカーソルのある位置に文字入力
されたのと同じ動作になります。

そこでFBのプログラムを最前面に持ってきて、フォーカスのあたった状態
にするための方法を探しています。
プログラムを立ち上げた直後は当然最前面にあるのですが、誰かが触ったり
するとマウスカーソルがデスクトップのアイコンに移動してしまったりします。
こうなるとバーコードスキャナからの信号はFBプログラムのEDITボックス
には落ちてくれません。
1分おきぐらいに自ら最前面に移動し、フォーカスを持ってくるようにしたいです。

「SETTOPMOSTWINDOW」や「SETFOREGROUNDWINDOW」という命令を試してみまし
たが、WindowsXPでは最前面にくることはなく、タスクバー内の
自タスクのボタンが点滅しクリックを促すのみとなります。
なんとか強引に、「最前面化」と「フォーカスのたぐり寄せ」を行う方法が
ないものでしょうか?

お知恵がございましたら宜しくお願い申し上げます。

41F橋:2004/07/27(火) 19:28
>>40
XPやオブジェクト関連はまだまだ勉強中なので私も分かりません

>「SETTOPMOSTWINDOW」や「SETFOREGROUNDWINDOW」という命令を試してみまし…
既にこの2つは試してあるんですね

フォームの最小化が出来たと思うのですが
フォームの最小化−元に戻すをすると前面に…来ませんよね(汗

-----

何をしてもいいのならば。ですが…
フリーソフトでキー入力やマウスのマクロを作成出来るものがあったと思います
何分かに1回、フォーム上でマウスが押された様なマクロ(の様なもの)を用意すれば
回避は出来なくはないですが…

…だめですよね(汗(笑

…お役に立たずに申し訳ございませんです

42もじゃ:2004/07/27(火) 20:09
F橋さま、さっそくのご意見ありがとうございます。

なにかいい手はないかと、今もゴニョゴニョやっています・・・・

43アラキ:2004/07/28(水) 18:33
お世話になります。
最近、インターネット接続をダイアルアップからブロードバンドLANにしました。
下記について、ご質問したく、もしご存じの方がおられましたらよろしくお願い
致します。
Webページからデータ受信速度のスピードテストを測定しています。また、
スピードを向上するためのソフトもインストールしました。それによりまして
スピードも3倍になりました。

ご質問
Win98、Win2000で使用していますが、パソコンをWinXPにしても
思ったほどスピードは期待できないと聞いた事がありまが?。
通信にはあまり関係なく、見かけ上はパソコンの内部処理が早くなっている為、
早くなったような気がすると言っていました。もしそうでありますと
ダウンロードの時間に差がないと思って良いのでしょうか。
実際はどの様になりますか。ご存じの方がおりましたらよろしくお願い致します。

44F橋:2004/07/28(水) 23:39
>>42
あまりお役に立たないレスですいません

>なにかいい手はないかと、今もゴニョゴニョやっています・・・・
あると思うんですが…私ではここまででした。すいませんです

45F橋:2004/07/28(水) 23:50
>>43
>Win98、Win2000で使用していますが、パソコンをWinXPにしても
>思ったほどスピードは期待できないと聞いた事がありまが?。
私が知っている範囲です

Windows95, 98SEは電話回線を想定した設定になっており
WindowsME, 2000, XPはブロードバンド回線を想定している様です

Windows95, 98, 98SEでブロードバンド用に(フリーソフトなどを使って)速度を速くした場合は
ME,2000,XPとそれほど変わらないはずです

ブロードバンドでのネットの早さ
←遅い                      速い→
95,98,98SE(標準)<<<<<<ME,2000,XP<全Windows+ダウンロードパラメータの調整

私の中ではこんな形だと思います(一部実体験有り)

-----


パラメータの調整の話はなんとなくしか分からないのですが…
電話回線用の設定は少しずつデータをもらっていると思ってます
(データが壊れやすいから少しずつもらっている?)
ブロードバンド用の設定はたくさんのデータを一気に読み込んでいると思ってます

1.データの受信
2.読み込んだデータのチェック
3.2のチェックでデータが正常なら次の読み込み。異常なら1から繰り返す

電話回線の場合はデータが異常で再読み込みをする時が多いから
一度に読み込むデータが少ない方が効率がいいはずで
ブロードバンドの場合は異常な場合が少ないから一括で読み込んでいる。と考えてます

ネットの速度を速くするソフトはパラメータの変更が主だと思っております
またそういうソフトは実際にパラメータを色々と変えたのを試して今の回線に一番速い
設定に変えてくれるようです
この辺りの設定が同じならばOSのみでの差は(私は)少なく感じます

46アラキ:2004/07/29(木) 10:17
ご返答くださいましてありがとうございました。
ご説明してくださいました、Windows95, 98SEは電話回線をWindowsME, 2000, XPはブロードバンド回線の想定につきましては大変参考になりました。
Windows95, 98, 98SEは速度を速くした場合はME,2000,XPとそれほど変わらない件につきましては体験の中で納得させられました。
また、電話回線用、ブロードバンド用のデータの流れ方について、とても解りやすく、ご説明されていましたので理解する事ができました。お礼を申し上げます。

47TOKO:2004/07/30(金) 01:53
42>>
もじゃさん>こんばんは
意味を取り違えていたらゴメンナサイ・・
フォームを常時前面に出すということでしたら、下記の方法はどうでしょうか?

#include "Windows.bi"

declare function SETWINDOWPOS lib "user32" alias "SetWindowPos" (byval HWND as long, byval HWNDINSERTAFTER as long, byval X as long, byval Y as long, byval CX as long, byval CY as long, byval UFLAGS as long) as long

’手前に表示するかしないかのフラグ
var shared FLG as integer

’hWndInsertAfter の設定
#define HWND_TOP 0'手前にセット
#define HWND_BOTTOM 1'後ろにセット
#define HWND_TOPMOST -1 '常に手前にセット
#define HWND_NOTTOPMOST -2'解除
’wFlags の設定
#define SWP_SHOWWINDOW &H40'表示する
#define SWP_NOSIZE &H1'サイズを設定しない
#define SWP_NOMOVE &H2'位置を設定しない

var shared MAINFORM as object
var shared BUTTON1 as object
MAINFORM.ATTACH GETHWND
BUTTON1.ATTACH GETDLGITEM("BUTTON1")

declare sub MAINFORM_START edecl ()
sub MAINFORM_START()
'初期設定(フラグ)
FLG = 1
end sub

'コマンドボタンの処理
declare sub BUTTON1_ON edecl ()
sub BUTTON1_ON()
var RST as long

if FLG = 0 then
'「常に手前に表示」を解除
RST = SETWINDOWPOS(MAINFORM.GETHWND, HWND_NOTTOPMOST, 0, 0, 0,0, SWP_SHOWWINDOW or SWP_NOMOVE or SWP_NOSIZE)
FLG = 1
BUTTON1.SETWINDOWTEXT "「常に手前に表示」する"
MAINFORM.SETWINDOWTEXT "現在は「ノーマル」状態です"
else if FLG = 1 then
'「常に手前に表示」をセット
RST = SETWINDOWPOS(MAINFORM.GETHWND, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW or SWP_NOMOVE or SWP_NOSIZE)
FLG = 0
BUTTON1.SETWINDOWTEXT "「常に手前に表示を解除」する"
MAINFORM.SETWINDOWTEXT "現在は「常に手前に表示」状態です"
end if
end sub

while 1
WAITEVENT
wend
stop
end

48もじゃ:2004/07/30(金) 10:20
>47
TOKOさま、ありがとうございました。
さっそく試させていただき、見事!にうまくいきました。

が、とても残念なことが・・・・・・
もう少し、お付き合い頂けませんでしょうか?

FBで作成したアプリを最前面(Z順の先頭)に持ってくることには成功しますが、
アクティブ(フォーカスのある状態)にはなりません。
(「SETWINDOWPOS」で調べましたら、そういう仕様だそうですねぇ)

他のスレッドがアクティブの時に、強引にこちら側をアクティブにするにはどうすれば
良いでしょうか?
かなり高度な技が必要だと思いますが、この投稿をご覧の方でご存知の方がおられましたら、
ぜひご教授お願い致します。

(聞いてばかりで、ほんとにすいません)

49TOKO:2004/07/30(金) 11:27
>>48
TIMERを使う方法ではダメですか?

var shared TIMER1 as object
TIMER1.ATTACH GETDLGITEM( "TIMER1" )

TIMER1.SETINTERVAL nnnn ←(間隔:秒数)
TIMER1.ENABLE -1

declaresub timer1_timer edecl ()
MAINFORM.SETFOREGROUNDWINDOW
end sub
トカ(^^;)

50もじゃ:2004/07/30(金) 14:24
>49
TOKOさま、アドバイスありがとうございます。

残念ながらWin2000やXPでは、「SETFOREGROUNDWINDOW」が働いてくれません。
タイマーを使用して定期的に「フォーカスひっこ抜き」をするのはいいのですが、
肝心のフォーカスは来てくれないようです。

OSの仕様で、他のスレッドからフォーカスを奪うのはなかなか大変だそうです。

しくしく・・・・・・

51TOKO:2004/07/30(金) 19:24
>>50 【SetForeGroundWindow の件】
>Win2000やXPでは、「SETFOREGROUNDWINDOW」が働いてくれません。
Windows98およびWindows2000ProはOK、WindowsXPはNGのようです。試してみました。
>1分おきぐらいに自ら最前面に移動し、フォーカスを持ってくるようにしたいです。
>タイマーを使用して定期的に「フォーカスひっこ抜き」をするのはいいのですが、
>肝心のフォーカスは来てくれないようです。
私の環境はWindowsXPですが、常時最前面表示させ、他のアプリに移動していても1分ごとに強制アクティブにする。

sub MAINFORM_START()
TIMER1.SETINTERVAL 6000
TIMER1.ENABLE -1
FLG = 0
FORM_STATE
end sub

declare sub BUTTON1_ON edecl ()
sub BUTTON1_ON()
FLG = not(FLG)
FORM_STATE
end sub

sub FORM_STATE()
var RST as long
if FLG = 0 then
RST = SETWINDOWPOS(MAINFORM.GETHWND, HWND_NOTTOPMOST, 0, 0, 0,0, SWP_SHOWWINDOW or SWP_NOMOVE or SWP_NOSIZE)
BUTTON1.SETWINDOWTEXT "「常に手前に表示」する"
MAINFORM.SETWINDOWTEXT "現在は「ノーマル」状態です"
else
RST = SETWINDOWPOS(MAINFORM.GETHWND, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW or SWP_NOMOVE or SWP_NOSIZE)
BUTTON1.SETWINDOWTEXT "「常に手前に表示を解除」する"
MAINFORM.SETWINDOWTEXT "現在は「常に手前に表示」状態です"
end if
end sub

declare sub TIMER1_TIMER edecl ()
sub TIMER1_TIMER()
MAINFORM.SETFOREGROUNDWINDOW
end sub
(一部省略)で1分ごとにアクティブになりました。自己流のためひょっとしてとんでもないことをしているかも・・

52chigaya:2004/07/31(土) 02:46
XP は使った事が無いので勝手な妄想ですが・・・
F−BASICの「SETFOREGROUNDWINDOW」が出来ないって事は、

#include "windows.bi"
declare function WinApi_SetForegroundWindow& lib "user32" alias "SetForegroundWindow"( byval hWnd& )
ApiReturn& = WinApi_SetForegroundWindow( GETHWND )

直接APIに動いて貰う事も、XPは出来ないんでしょうか?

久々のプログラミングなので、ちょっと自信が無いですが・・・。
ますます、OSのバージョンアップがし辛いなぁ・・・。

53TOKO:2004/07/31(土) 08:39
>>52
chigayaさん>
お久しぶりです。
あれ以降、chigayaさんやnisiiさんのAPI関連記事で勉強させていただいています。
APIのSetForegroundWindowを試してみましたが、windowsXPではできないようです。

54nisii:2004/07/31(土) 09:58
SDKによると SetForegroundWindow を使って欲しくないそうですね。

特にWindowsXPは、タスクバーなどの順位が上げられたみたいで、
SetForegroundWindow を発行するソフトが
アプリケーションエラーを起こしやすいなど、いっそう厄介です。

消極的ですが、ユーザーにボタン操作してもらって切り替える案ではダメですか?


#include "windows.bi"

common shared MAINFORM as object
MAINFORM.ATTACH GETHWND

var shared EDIT1 as object
EDIT1.ATTACH MAINFORM.GETDLGITEM( "EDIT1" )
EDIT1.SETFOCUS

do
WAITEVENT
loop
end

'-------------------------------------
' EDIT1がフォーカスを失ったときのイベント
declare sub EDIT1_KILLFOCUS edecl ()
sub EDIT1_KILLFOCUS()

var COUNT as long
var RC as long

' EDIT1のフォーカスを失ったら、1秒待つ
for COUNT = 1 to 100 : wait 1 : next

' トップモストのダイアログを使ってユーザーにボタン操作してもらい、
' フォーカスを強制的に戻す
MAINFORM.SETTOPMOSTWINDOW -1
RC = MAINFORM.MESSAGEBOX( "確認" , "EDIT1以外をクリックしないでください。" , 0 , 3 )
EDIT1.SETFOCUS
MAINFORM.SETTOPMOSTWINDOW 0

end sub

55F橋@役立たず管理人:2004/08/01(日) 13:47
もじゃさん>
私は分かりませんのでよろしくです

TOKOさん>
サンプルありがとうございます

chigayaさん>
お久しぶりです!ご参加ありがとうございます!

nisiiさん>
いつもいつもありがとうございます


-----
凄い。F-BASICのプロが3人もレスしている…解決できないとは思えない

56上村:2004/08/02(月) 00:14
XPで動作するかわかりませんが

フォームを最前面表示にしておいて

sub TIMER1_TIMER()
  SHOWWINDOW 0
  SETFOCUS
  SHOWWINDOW -1
end sub

こんな感じに記述してみたらどうでしょうか
Windows2000 Server では動作しました。
スマートなやり方ではないのでもっとスマートな方法も探してみます

57TOKO:2004/08/02(月) 01:10
>>56
XPでも動作します。
ただ、一旦アクティブになると他のアプリに制御を移した場合でも、キャプションバーが
アクティブのままの状態になるようです。
あぁ〜 暑くて眠れない・・・ エアコン買うまでもないし

58もじゃ:2004/08/02(月) 14:40
>51 >53 >57 TOKOさま
>52 chigayaさま
>54 nisiiさま
>56 上村さま
そして管理人のF橋さま

貴重なアドバイスを頂きまして、ほんとうにありがとうございました。
一人ではきっと解決できなかったであろう問題を、皆様の助言によりおおむねやっつける
ことが出来ましたので、お礼申し上げると共にご報告致します。

【私の環境はWinXP/Proです】

#include "WINDOWS.BI"

var shared MAINFORM as object :MAINFORM.ATTACH GETDLGITEM("MAINFORM")
var shared TIMER1 as object :TIMER1.ATTACH GETDLGITEM("TIMER1")
var shared EDIT1 as object :EDIT1.ATTACH GETDLGITEM("EDIT1")

declare function SETWINDOWPOS lib "user32" alias "SetWindowPos" (byval HWND as long, byval HWNDINSERTAFTER as long, byval X as long, byval Y as long, byval CX as long, byval CY as long, byval UFLAGS as long) as long

declare sub MAINFORM_START edecl ()
sub MAINFORM_START()
TIMER1.SETINTERVAL 1000
TIMER1.ENABLE -1
end sub

declare sub TIMER1_TIMER edecl ()
sub TIMER1_TIMER()
beep
A= SETWINDOWPOS(MAINFORM.GETHWND, -1, 0, 0, 0, 0, &H43)
MAINFORM.SHOWWINDOW 0
MAINFORM.SETFOCUS
MAINFORM.SHOWWINDOW -1
EDIT1.SETFOCUS
A= SETWINDOWPOS(MAINFORM.GETHWND, -2, 0, 0, 0, 0, &H43)
end sub

while -1 :WAITEVENT :wend


↑こんな感じでやってみました。(教えて頂いたソースを組替えてみただけですけど・・・)

メインフォーム上に、エディットボックス1個とタイマーコントロール1個を用意しました。
10秒おきにタイマーイベントが発生するようにしています。
タイマーイベントの発生時にBEEP音を鳴らしてみました。
そしてまず強制的に「最前面化(トップモースト)」を行っています。
次にメインフォームを非表示に、その状態でメインフォームにフォーカス移動、
更にメインフォームを表示に。
そしてエディットボックスにフォーカス設定。
最後に「最前面化」を解除しています。

これで私のやりたかったことが「一応」できるようになりました!

サンプルプログラムを起動したあと、1回目のタイマーイベントまで待ちます。
それ以降は、メモ帳やEXCELなどを自由に立ち上げます。
例えばメモ帳を立ち上げた場合、カーソルはそちらに移りキーボードからの入力は
メモ帳内に反映されます。
しかし、タイマーイベントが発生すると「お見事!!」、カーソルがサンプルプログラムに
戻ってきます。
これで24時間待機させているプログラムを作成し、常にカーソル(フォーカス)を獲得
し続けることができそうです。
ただ、まだ完璧ではないようで条件によっては「カーソルのたぐり寄せ」が行われない
場合もあります。

最初はまったく思い通りにいかず、あきらめようと思いましたが、皆様からいろいろなお知恵を
拝借しましてようやくここまでこれました。
これからもぜひ宜しくお願いします、ありがとうございました。

59FBASIC利用者:2004/08/29(日) 20:28
お世話になります。

IEの有無について、お尋ね致します。

F-BASIC6で作成しました本ソフトを起動しますとデスクトップ上に本ソフトのフォームが表示されます。
そのフォームで作成メニューをクリックしてデスクトップ上にInternet Explorerの有無を知り、有る事が確認できましたら
Internet Explorerのハンドルを取得したいと考えていますが、有無を調べる事は可能でしょうか。
ご存知の方がおりましたら、お教え願えれば幸いです。宜しくお願い致します。

60上村:2004/08/30(月) 00:13
ハンドルというのがWindowHandleならば

declare function APIFINDWINDOW lib "user32" alias "FindWindowA" (byval LPCLASSNAME as string, byval LPWINDOWNAME as string) as long
var IE_HWND as long
IE_HWND = APIFINDWINDOW("IEFrame",byval 0)

こんな感じのコードで取得できると思われます。

61FBASIC利用者:2004/08/30(月) 00:54
上村 様

ご返答を下さいましてありがとうございました。
ご指導頂ました IEのハンドルを取得するコードで確認しましたら
IEのハンドルが取得できました。
以前は始めダミーでタイトル名をつけてから行っていましたので
長いコードとなりました。
上村様からのご指導をして頂くまではできないものとあきらめていました。
お陰様で今後においては、大変助かりました。
貴重なご投稿をして頂きまして、本当にありがとう御座いました。
心より深くお礼を申し上げます。

FBASIC利用者

62佐藤:2004/08/30(月) 06:15
佐藤と申します。よろしくお願い致します。

テキスト部分を『メニュー』→『編集』→『すべて選択』で選択する事は出来まし
た。その後テキストの選択された全てをAPI関数で消す方法で
何かご存知の方がいましたら、教えて下さい。
宜しくお願いします。

63上村:2004/08/30(月) 16:53
APIではありませんが
F-BASICで選択部分を変更するには
REPLACESEL関数が使用できます。

選択部分を消去するには
EDIT.REPLACESEL ""
このように記述すれば消えます

もしテキスト全体を消去するのであれば
EDIT.SETWINDOWTEXT ""
で消去したほうが高速だと思います

64F橋@役立たず管理人:2004/08/30(月) 18:46
(上村さん。ご回答ありがとうございました)

65佐藤:2004/08/30(月) 19:37
上村さんより、ご回答頂きました佐藤です。
遅くなりましたが、お礼を申し上げます。
選択部分を消去するREPLACESEL関数の
EDIT.REPLACESEL ""については用いた事はありましたが、
今回により勉強になりました。ありがとうございました。
今後も、何かありましたら宜しくお願いいたします。

66佐藤:2004/09/03(金) 10:16
お世話になっています佐藤と申します。
本当に申し訳ありませんが再度下記のすべて選択を戻すにつきまして
2点の質問につきまして宜しくお願い致します。

自作ソフトでIEの画面(ホームページ)をすべて選択→コピーして
クリップボードに文字をコピーしています。

RET = POSTMESSAGE(IE_HWND,&H111,&HA044,0) 'すべて選択
RET = POSTMESSAGE(IE_HWND,&H111,&HA042,0) 'コピー

すべて選択されますと画面全体が青色になります。
すべて選択を戻す(取り消す)ためソフトでマウスをクリックしています。
メニューに戻すが有れば問題ないのですが(メモ帳には有りました)
質問1
マウスを使用しない方法ですべて選択を戻す(取り消す)方法は有りますでしょうか。

タスクバーに最小化されましたIEもすべて選択→コピーでクリップボードに
文字をコピーできます。最大化に戻した場合、すべて選択のままになっています。
マウスを移動する事が出来ないため取り消しが出来ないものと考えています。
質問2
タスクバーに最小化された状態ですべて選択を戻す(取り消す)方法は有ります
でしょうか。

以上の2点について、ご指導して頂ければと願います。

67佐藤:2004/09/04(土) 10:43
お世話になっています佐藤と申します。
2点の質問についてはウィンドウハンドルを頼りに制御する方法では
限界があることが確認できました。
大変お世話になりました。ありごとうございました。

68TOKO:2004/09/04(土) 14:05
佐藤さん>
>マウスを使用しない方法ですべて選択を戻す(取り消す)方法は有りますでしょうか。
IE画面がアクティブあるいはアイコン化されている場合でも自作ソフトではマウスを使うんです
よネ^^;
選択画面の「取り消し」のみでしたら、アクティブ画面およびアイコン化されていても
RET = POSTMESSAGE(IE_HWND,&H111,&HA043,0)で取り消されるようですが・・・
画面に現れない他の動作をしているかどうかは不明です。

それとも、マウスを使用しないで「CTRL+Z」などで「戻る」動作をさせたいのでしょうか?

69佐藤:2004/09/04(土) 15:07
TOKOさん
ご回答下さいましてありがとうございました。
ご指導して下さいましたRET = POSTMESSAGE(IE_HWND,&H111,&HA043,0)の記述を
追加してみましたら目的が達成する事ができました。それによりマウスの移動、
マウスの設定、Wait命令などの必要がなくなり、大変助かりました。
他でも今回の件で質問の問い合わせを致しました。その結果限界と判断しました。
TOKO様のご回答をして下さいましたお陰で解決する事ができました。
本当にありがとうございました。心よりお礼を申しあげます。

70佐藤:2004/09/04(土) 16:36
TOKOさん
佐藤と申します。先ほどはありがとうございました。
何度に渡り本当にすいみません。
ご回答していただきました
RET = POSTMESSAGE(IE_HWND,&H111,&HA043,0)の中で
WM_COMAND(&HA043)は何の意味なのかSPY++で
IEのメニュー項目から探しては見ましたが、探すことができませんでした。
どのようにすれば探すことが出来るのか、ご都合が良ければ、
ご指導願えればと思います。宜しくお願い致します。

71佐藤:2004/09/04(土) 17:28
マウスを使用しないで「CTRL+Z」などで「戻る」動作
のご指導でしたが、うっかりして・・・
本当に申し訳ありませんでした。

72TOKO:2004/09/04(土) 19:29
佐藤さん>
それを聞かないで!! *^^;)
フリーソフトでパラメータを指定してSendMessage(PostMessage)するデバッグ補助ツール
SendMessage V1.0というのがありますが。
それを使ってwParamを変えたらタマタマ目的(らしい)動作をしたのでお知らせしたまでです。
はじめは、マウスクリックで選択解除なのでWM_LBUTTONDOWNを試したり、UNDOなどを試し
てみたのですがダメで、最後に上記を試してみたというわけです。
動作としては、ペーストのような感じがするのですが・・・
というのは、
RES = POSTMESSAGE&(IE_HWND,WM_COMMAND,&HA044,0) 'すべて選択
'RES = POSTMESSAGE&(IE_HWND,WM_COMMAND,&HA042,0) 'コピー
として
RES = POSTMESSAGE&(IE_HWND,WM_COMMAND,&HA043,0)
を実行すると前もってコピーされていた内容がペーストされますので・・
そういうわけですので、あくまでも自己責任でお願いいたします。

73佐藤:2004/09/04(土) 21:51
TOKOさん
ご返答して頂きましてありがとうございました。
色々と試していただき、時間も割いてくださまして、この場をお借りして
厚くお礼を申し上げます。他でも問い合わせしましたが・・・
お陰様でTOKOさんのご指導により解決する事ができました。
また、タスクバーに最小化状態から最大化に戻しても、
問題なくすべて選択が消えていました。本当にありがとうございました。
私の方でお願いして、TOKOさんのご好意で教えて頂きましたので
自己責任は当然だと思います。本当にお世話になりました。

74tanaka:2004/09/05(日) 17:44
初歩的な質問で申し訳ありません。宜しくお願い致します。
F−BasicからMicrosoftメモ帳 のフォームを
アクティブ後、REC = SetForegroundWindow(MENO_HWND )
今度はF−Basic自身のMAINFORMをアクティブしてもアクティブになりません。
REC = SetForegroundWindow( FBASIC_HWND ) のFBASIC_HWNDのハンドルは
問題ありません。MAINFORM.SETTOPMOSTWINDOW (-1)、MAINFORM.SETFOCUSなど
試しはしましたがダメでした。一度、F−Basicを抜けて外部のフォーム
(Microsoftメモ帳)をアクティブしますとF−Basicで作成した
フォームはアクティブできなくなるのでしょうか。その場合は、
手動でクリックしない限りダメなのでしょうか。ご教授頂ければ幸いです。

75TOKO:2004/09/05(日) 18:39
tanakaさん>
RES = API_SETFOREGROUNDWINDOW(MENO_HWND)でアクティブ後
F-Basic自身のメインフォームをアクティブにするんですね?
RES = API_SETFOREGROUNDWINDOW(MAINFORM.GETHWND)でアクティブになりませんか?

WindowsXP、F-Basic 6.3 U003

76TOKO:2004/09/05(日) 18:53
IEのパッチをインストールするとスクロールしすぎる不具合が発生
http://support.microsoft.com/default.aspx?scid=kb;ja;832270
http://internet.watch.impress.co.jp/cda/news/2003/11/12/1095.html

9/2 WindowsXP SP2 インストール
どういう訳か本日午後から、表記の件で悩まされております。
IEに限らず、F-Basicのプログラム編集画面でもスクロールバーがひとりでに最下段まで
移動してしまうというものです。

ただ、F-Basicで作成したリストボックスは、今のところ大丈夫のようです。

77tanaka:2004/09/05(日) 19:19
TOKOさん

早々、ご教授願えましてお礼を申します。
考え方で特に問題がない事が知れました。
そこで、整理して最短で作成しましたら問題なく動作しました。
もう一度F−Basic自身を見直せば何とかなると
思えましたのでうまくいきそうです。ご教授のお陰です。
ありがとうございました。

78TOKO:2004/09/06(月) 09:30
佐藤さん>
RES = POSTMESSAGE&(IE_HWND,WM_COMMAND,&HA043,0)
一度コピーしたものをペーストしているようです。文字数の多いところで試すと時間が
かかりますし、
RES = POSTMESSAGE&(IE_HWND,WM_COMMAND,&HA042,0)の1行を抜くと選択解除にはなりま
せん。

RES = POSTMESSAGE&(IE_HWND,WM_LBUTTONDOWN,0,0)
RES = POSTMESSAGE&(IE_HWND,WM_LBUTTONUP,0,0)
のように、マウスをDOWNおよびUPの両方を送るといいようです。

79佐藤:2004/09/06(月) 12:58
TOKOさん
ご投稿下さいまして本当にありがとうございました。
あの後、TOKO さんの言われていましたペースト
(貼り付け)につきましてテキスト入力フィールド(input type="text")
で確認しましたら貼り付け、切り取りのComandを調べる事が出来ました。
貼り付けを実行しますとテキスト入力フィールドに同じ内容のものが
貼り付けされましたので安全を見て中止致しました。
せっかくご指導していただきましたが申し訳ありませんでした。
今回のTOKOさんのご指導で色々な事を学びました。
また、マウスを画面上でクリックする事も中止しました。
理由はクリックの所がボタン等でしたら飛んで行く事もありますので
(更新等でも消えますが更新中に管理者がホームページを変更することもありまので)
ご指導下さいました下記の記述で行わせてもらいます。
RES = POSTMESSAGE&(IE_HWND,WM_LBUTTONDOWN,0,0)
RES = POSTMESSAGE&(IE_HWND,WM_LBUTTONUP,0,0)
結果は、ご報告させて頂きますので宜しくお願い致します。

80佐藤:2004/09/06(月) 16:01

TOKOさん
ご報告いたします。
色々と試しましたので遅くなりました。宜しくお願い致します。
お陰様で目的が達成する事ができました。
TOKOさんの、ご指導して頂きましたお陰です。
ホームページ内でクリックする必要が無くなりました。その為に
コマンドボタンのクリックされ無いので
他のホームページに移動する心配がなくなりました。
ソフトではペースト・マウスの移動部分を外すだけで
問題ないソフトになりました。
TOKOさんのご指導を受けない限りこの方法は、
思い付かなかったと思っています。
重ねて厚くお礼を申し上げます。
幾度にも渡り、質問して申し訳ありませんが、
下記の2点●時間を入れないと読めないみたいです?
●先頭カーソル?につきまして、同じ動作現象になりますか
ご確認して頂ければ幸いであります。宜しくお願い致します。


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
var IE_HWND as long
IE_HWND = WINAPI_APIFINDWINDOW("IEFrame",byval 0)

if hex$(IE_HWND)<>"0" then

RET = WINAPI_POSTMESSAGE(IE_HWND,&H111,&HA044,0) 'すべて選択
RET = WINAPI_POSTMESSAGE(IE_HWND,&H111,&HA042,0) 'コピー

wait 350 '●時間を入れないと読めないみたいです。コピーの終了で効率良い
        wait時間を考えましたが'スタート同時にRET = 1になる為この方法としました。

R$ = GETCBTEXT

EDIT1.SETWINDOWTEXT R$

VAR CurPos As POINTAPI  ' マウス関連のAPI宣言
  var USRRECT as RECT_API

 ' ウインドウをアクティブにする
  ApiReturn& = WinApi_SetForegroundWindow( IE_HWND )
  'マウスの左ボタンを押す
MOUSE_EVENT &H2, 0, 0, 0, 0  'このようにすればNGになるRET = MOUSE_EVENT (&H2, 0, 0, 0, 0)又カッコも外す
'マウスの左ボタンを離す
MOUSE_EVENT &H4, 0, 0, 0, 0 'このようにすればNGになるRET = MOUSE_EVENT (&H4, 0, 0, 0, 0)又カッコも外す
EDIT1.SETSELTEXT 0,0,1:EDIT1.SETFOCUS '●こちらでは先頭にカーソルが正常に移る事もあります。

end if
exit sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

81佐藤:2004/09/06(月) 20:19
TOKOさん
ご報告いたします。
先頭のカーソルにつきましては
EDIT1.SETSELTEXT 0,0,1:EDIT1.SETFOCUSの前にフォアグラウンドウィンドウ
SETFOREGROUNDWINDOW(FBASIC)を追加しました。今の所は安定しています。
お陰様で落ち着きましたので少し様子を見てみます。
何度もに渡りまして、ご回答をして頂きまして誠に感謝しています。
ありがとうございました。

82佐藤:2004/09/06(月) 21:06
TOKOさん
81の追記です。
フォアグラウンドウィンドウ前に下記の3行を忘れていました。
RET = GetWindowRect( FBASIC, usrRECT ) 'FBASICウインドウ全体の座標を取得
  幅=usrRECT.left: 高=usrRECT.top
RET = SETCURSORPOS(幅,高)
を追記しました。

83TOKO:2004/09/07(火) 06:59
佐藤さん>
詳細にわたりありがとうございます。解決しているようですが、#78で転写ミスがありました。
RES = POSTMESSAGE&(IE_HWND,WM_LBUTTONDOWN,0,0)
RES = POSTMESSAGE&(IE_HWND,WM_LBUTTONUP,0,0)の部分ですが、「IEFrame」のハンドル
ではなく、「選択されている」フレームのハンドルでした。
同じプログラムで検証するのが一番だろうと思うのですが、再現のしようもなく私は下記
の方法でテストしていました。HP上でマウスは使用しないということから、
EDIT1→ペースト用
TEXT1→取得したハンドルの確認表示用
BUTTON1→全て選択・コピー
BUTTON2→「選択フレーム」のハンドル取得、マウスのDown・Upで選択解除
BUTTON3→EDIT1クリアし、EDIT1にペースト、カーソルは開始位置に

BUTTON1→BUTTON2にはタイムラグがあるので、wait のことは考えていませんでした。
MOUSE_EVENTは使っていませんので、複数フレームの場合の指定はどうしているのかと思
っていました。
これまで画像・インターネット関連の必要性を感じたことがなくやってきたものですから、
勉強になります。
また、男サザエさんのごとくオッチョコチョイですので、#76の症状が出たので検索したら
検索したら、URLが出てきました。よくよく読んでみると古い話でしたね^^;)
で、どういう訳か今は症状が治まっています。

84佐藤:2004/09/07(火) 07:38
TOKOさん
ご返答下さいましてありがとうございました。
複数フレームの場合ですがこの場合に限り直接マウスで選択画面をクリック
してます。また、BUTTON1→BUTTON2のタイムラグにつきましては
パソコンのスピード、OS、その他により違ってくると思っていますので
それぞれにあった一番良い方法(クリックボードでコピーが終了した例えばGet関数
)をいま探しています。もし良い方法が有りましたらご報告させていただきます。
色々と、ありがとうございました。

85TOKO:2004/09/07(火) 12:48
佐藤さん>
一つ気になったことがありましたので・・・
SetForegorundWindowですが#49〜#54を見ておいてください。

86佐藤:2004/09/07(火) 14:03
TOKOさん
貴重な情報を提供下さいましてありがとうございました。
言われて思い出しましたが、一度同じ事を何処かでみた覚えがあります。
#49〜#54には詳細な情報でとても参考になりました。
今のところWindows2000でも動作していますが、XPではまだ確認していません。
タイムラグに関しまして現状(Wait)で使用していきます。一応、完成と致しました。
以前から思っていた事ですが、ボタン一つでホームページ及びその他の画面の
文字を簡単にテキスト画面に表示出来れば便利かと考えていました。(実際探せば有ると思うのですが)
手動と自動で選択出来るようにもしてみました。
長期に渡りまして、ご投稿して頂けるとは思ってもみませんでした。
色々と勉強させて頂きました。心より厚くお礼を申しあげます。

87佐藤:2004/09/17(金) 17:27
前回は大変お世話になりました佐藤と申します。
ありがとうございました。

再三に渡りまして本当に申し訳ありませんが
質問させてもらいました。宜しくお願い致します。
説明に不十分な所がありましたら、お許し下さい。

Windows98のNotepad.exe(ノート)のフォームの境界部分をポイントして
この状態でドラック(左クリックで離す)するまでフォームは透明です。
Windows2000では透明でなくドラックするまでもエディタ画面(白色)
として大きくなっていました。F-Basicで作りましたソフトをWindows2000で
行いますとドラックするまでフォーム(灰色)の拡大となります。
境界部分をドラックするまでエディタ画面として大きくする事は可能なのでしょうか。
ご存知の方がいましたら、ご指導願えればと思います。

88TOKO:2004/09/17(金) 18:22
Windows2000の画面のプロパティ→効果→視覚効果で『ドラッグ中にウィンドウの内容を
表示する』にチェックが入っていませんか?

89佐藤:2004/09/17(金) 18:39
TOKOさん
ご回答して頂きましてお礼を申し上げます。
前回は何度ものご指導をして頂きましてありがとうございました。
今回の質問の件に於きましてはチェックが入っていました。
チェックを外して見ましたらWin98と同じ動作になり解決する事ができました。
重ねてお礼を申し上げます。

90Fbasic使用者:2004/09/19(日) 12:15
お世話になります。
Fbasicにつきましてお尋ねします。
Fbasicの実行ファイルを起動してメインフォームがディスクトップに
表示された場合にFbasicで作成された物かそれ以外(VB等)で作成したか
実行ファイルから見分ける事はできますか。それにつきましてご伝授ください。
よろしくお願いします。

91Fbasic使用者:2004/09/19(日) 13:03
一部記述の訂正をします。
実行ファイルから見分ける事はできますか。を
メインフォームから見分ける事はできますか。に
訂正します。

92Fbasic使用者:2004/09/20(月) 01:26
開発環境を見分けるのは難しい事がわかりました。

93Fbasic使用者:2004/09/25(土) 14:45
お世話になります。
コマンドボタン表示のサイズ変更につきまして

BUTTON1のテキスト内容を登録で表示しています。
そのテキスト内容(登録)表示のサイズ変更は可能でしょうか。
ご存知の方がおりましたら宜しくお願い致します。

94TOKO:2004/09/25(土) 15:40
Fbasic使用者さん>プログラム上で変更したいのですね?

var shared MainForm as object
var shared Button1 as object

MainForm.attach gethwnd
Button1.attach getdlgitem("Button1")

declare sub MainForm_Start edecl ()
sub MainForm_Start()
Button1.MoveWindow 100,50
Button1.SetWindowSize 80,25
Button1.SetFontName "MS 明朝"
Button1.SetFontSize 14
Button1.SetWindowText "abcde"
end sub

95Fbasic使用者:2004/09/25(土) 16:04
TOKOさん
ご回答して頂きましてお礼を申し上げます。
そうですプログラム上で変更したいのです。
説明不足がありまして申し訳ありませんでした。
リファレンス、サンプルプログラムで探しては見ましたが
探せませんでした。
ご回答して頂きました記述に従いましてプログラムの
編集に入りました。本当にありがとうございました。

96Fbasic使用者:2004/09/26(日) 20:22
お世話になります。
Windows98とWindows2000の文字サイズにつきまして
OSの文字サイズの調整は下記の方法で行っています。
フォームのコマンドボタン、テキスト、・・・
の文字サイズはWindows98と比べWindows2000は−1小さくなるために
プラットフォームのID = LPVERSIONINFORMATION.DWPLATFORMIDで
プラットフォームのIDからSETFONTSIZE 12+1 として1を加えて調整しています。
コマンドボタン等が特に数多いソフトでは、行っていません。そこで
最初にプラットフォームのIDでWindows98又はWindows2000を判断
しましたらSETFONTSIZEの調整をしなくとも簡単に出来る方法の有無
についてご指導して頂ければと思います。
宜しくお願い致します。

97TOKO:2004/09/26(日) 21:42
このHPのF-BASIC小ネタ集-Windows9xとNTのフォントサイズを揃える-で
nisiiさんが投稿されていますが明示的に指定するのが簡単な方法かと思います。

var shared text(30) as object
var shared edit(10) as object

for i = 1 to 30
text(i).attach getdlgitem("text"+trim$(str$(i)))
select case i
case 1 to 5
text(i).setfontsize 12
case 6 to 20
text(i).setfontsize 14
case else
text(i).setfontsize 20
end select
next i

for i = 1 to 10
edit(i).attach getdlgitem("edit"+trim$(str$(i)))
edit(i).setfontsize 14
next i

98Fbasic使用者:2004/09/26(日) 22:45
TOKOさん
早々と、ご返答下さいましてありがとうございました。
もしコマンドボタン等の数多いソフトでも可能になりますと、
自分にとっては大変貴重な情報となります。
今から記述の意味を調べて使用してみていきます。
前回に渡り大変お世話になりました。
本当にありがとうございました。

99Fbasic使用者:2004/09/27(月) 06:53
TOKOさん
以前から下記のeditを変数で扱えないかと思い続けていました。
今回その関数を知る事ができました。
プログラムを下へスクロールしますと32700当たりで停止状態になります。
別のパソコンでも同じでしたのでプログラムの長さの限界を感じました。
しかし、翻訳は問題無くできてます。
ご指導して頂きました関数を使えばかなり短くする事ができると思いますので
貴重な情報を提供して頂き、心よりお礼を申し上げます。

100りゅう:2004/09/27(月) 17:26
USBのモデムを使用したいのですが
232Cの制御で上手くいかないようです。
私は持っていませんが、使ってる人が、232C用のソフトでは動作しない
と言ってきたものですから。

プロトコル制御は、何か違うのでしょうか?
ボーレート指定
comfn=freefile
baud 9600,1
open "COM2:(S8N1N8)" as #comfn
出力
print #
入力
line input #
で行っています

よろしくお願い申し上げます。

101iwakifarm:2004/10/11(月) 19:22
USBを制御することはF-BASICでは無理です。
また、COM2とするとCOMポートに行ってしまいますので
基本的にUSBを通して通信出来ないことになります。
LPT0: というようにUSB0というな書式があれば使えたかもしれません。
実際にUSB経由のプリンタにF-BASICでLPT0:としても、
印刷できません。

102りゅう:2004/10/12(火) 14:51
ありがとうございました。
VBで作成したものを起動させました・・・

103Fbasic使用者:2004/10/15(金) 19:32
ユーザーID:登録の方法につきまして
お世話になります。下記の件につきまして宜しくお願い致します。
概要
C:\Winows\SYSTEM・・内にF-BASIC(TOUROKU.PRN)でファイルを作成して
登録者、ユーザーIDを登録しています。Windows98、WindowsXPをC:でありますと
C:\Winows\SYSTEMに登録されますが、Windows2000ではWinowsは
無くWINNT\SYSTEMでしたのでC:\Winows\SYSTEM・・内に(TOUROKU.PRN)の
ファイル作成を考えています。SYSTEM内のファイル作成につきましては、以前
F-BASICのサーポートセンターに問い合わせましたが特に規制は無いと言っていました
ので使用しました。その後、別の所からSYSTEM内には個人的なファイル作成の読み書きは
適当でないとも聞きました。今回Windows2000用にWINNT\SYSTEMに(TOUROKU.PRN)を
使用出来るようにするか、またレジストリを使用しない別の方法がありましたらとも
考えています。別の方法がありましたら、ご指導をお願い出来ればと思います。

104TOKO:2004/10/15(金) 20:55
WindowsおよびSystemフォルダは下記で取得できます。

#include "Windows.bi"

Declare Function Api_GetWindowsDirectory& Lib "Kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer$, ByVal nSize&)
Declare Function Api_GetSystemDirectory& Lib "Kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer$, ByVal nSize&)

var WinPath as string * 255
var SysPath as string * 255
var WinPathLen as long
var SysPathLen as long

WinPathLen = Api_GetWindowsDirectory&(WinPath, len(WinPath))
SysPathLen = Api_GetSystemDirectory&(SysPath, len(SysPath))
print "Windows フォルダ:" & left$(WinPath,instr(WinPath,chr$(0))-1)
print "System フォルダ:" & left$(SysPath,instr(SysPath,chr$(0))-1)

A$ = input$(1)
stop
end

105Fbasic使用者:2004/10/15(金) 22:07
TOKOさん
ご返答下さいましてありがとうございました。
お送り下さいました詳細なプログラム
を使用することで各OSのWindowsおよびSystemフォルダが取得できました。
お陰様でWindows2000ではWINNT\SYSTEMSフォルダにユーザーIDファイルを
作成する事ができました。
日頃から何度もに渡りまして、詳細な、ご指導をして頂きまして
厚く心よりお礼を申し上げます。

106MASUKO:2004/10/21(木) 12:31
初めまして、6.3ユーザのMASUKOと申します。
プログラム初心者のくせにゲーム作ろうという野望抱いてる野郎です。
大変恐縮ですが、質問させていただいてよろしいでしょうか?

AlphablendAPIを使って透過転送を試みたのですが、ピクチャボックスに反映されてないみたいなんです。
GetDCでピクチャボックスのデバイスコンテキスト指定して、リフレッシュをかけるだけじゃダメなんでしょうか…?
ちょっと、全体的な流れからはずれてしまう書き込みかもしれませんが、よろしければ皆様の叡智をお貸し下さい。(ぺこり)

107シマヅ:2004/10/22(金) 23:52
◆管理人・F橋様◆
 訳あって、ハンドル(シマチャン)を「シマヅ」(F-BASIC購入予定者欄も)に変更をお願いします。お手数をお掛けして申し訳ありません。
最近は質問などの書込みをしておりませんが、月に何回かは必ず本ホームページを見て勉強&情報収集させて頂き、プログラミング・レベルの向上に役立ております。また何かありましたら、書込みさせて頂きますので今後とも宜しくお願いします。

108シマヅ:2004/10/23(土) 00:03
◆管理人・F橋様 【追伸】◆
 度々、申し訳ありませんが、ハンドルの「シマヅ」への変更はF-BASIC購入予定者欄だけで結構です。舌足らずの記述で申し訳ありませんでした。

109TOKO:2004/10/23(土) 09:39
MASUKOさん>
AlphaBlendはあまり使ったことはないのですが、PICTURE1からPICTURE2へ画像を転送する
だけでしたらサンプルを載せてあります。
それ以上のことは試しておりません。^^;)
http://tokovalue.hp.infoseek.co.jp/index.htm

110MASUKO:2004/10/23(土) 11:26
TOKOさん、ありがとうございます。
おかげさまで、ようやく転送に成功することができました。(涙)

そちらのソースを見ながらイロイロいじっていて、気がついたことがありました。
…もしかして、AlphaBlendで転送すると、転送元が表示されてない場合
(フォームの外にピクチャボックスがはみでてたりすると)
その部分は他のウィンドゥ等を転送してしまうみたいで。
(デバイスコンテキストってそういうものなんでしょうか?(凹))

F-Basic標準のBitbltのような使い方をする方法って無いものなんでしょうか…?

111上村:2004/10/23(土) 11:38
MASUKO さん>
F-BASICでAPIを用いて画像を描画する際には
リフレッシュを行うと画像が消えてしまいます
ですからリフレッシュさえかけなければ画像が表示されると思います

これはF-BASIC側の仕様でリフレッシュする際に
内部にある画像を用いて再描画するため、APIを用いて書き込んだ画像が反映されていないデータで
再描画されるためです

この問題は回避しようと考えたことがありますが
F-BASICが内部で保持しているDCを取得しなければならないと思うので
内部仕様がわからないことには回避できません

無理やり回避するにはタイトルバーのないフォームを作成し
APIのSetLayeredWindowAttributes関数で作成したフォームを半透明にすれば
一応半透明なオブジェクトが作成できます
これは重いのと思うであまりお勧めできませんが

112上村:2004/10/23(土) 11:42
MASUKO さん>
デバイスコンテキストの仕様でそうなっています
BitBltのように使用したければ
開きたい画像をAPI関数で読み込んでデバイスコンテキストを保持しておく必要があります

113MASUKO:2004/10/23(土) 12:01
上村さん、ありがとうございます。
リフレッシュは使わない方が良いのですか、なるほど。
テストしてみましたが、レフレッシュさえ使わなければ描画は反映されるみたいですね。
少しDCの理解が深まったと思います。(笑)

えと…読み込んでってことはメモリにロードしてあげるって事になるのでしょうか。
ゲームの表示のために、全画面ピクチャボックスで、描画用に用意したピクチャボックスから、常時表示用ピクチャボックスにBitbltで画像を転送する、という方法をとってます。
(描画用ピクチャボックスは不可視に設定されてます。)
その読み込みAPIを探して、もうワンステップレベルアップしてみようと思います。

114毛の生えたブリーフ:2004/10/24(日) 15:02
アプリケーションアイコンの件です。

フォームを作らずにアイコンを設定する。つまり、コンソールアプリをつくると
きに、エクスプローラ上ではアプリケーションアイコンは指定したものになるのですが、
アプリケーションを起動したときの、ウインドウ左上のシステムメニューのアイコンや
タスクバー上のアイコンがOSで用意されたデフォルトアイコンのままです。

これを変更する方法はありますか?

115ニャン子:2004/10/24(日) 21:18
F-Basic上のコンソールアプリ(風)を作成する際のフォームを作られていない
との事ですが、タイトルバーのアイコンを設定したい場合はフォームをテキスト
モードで作成し、背景を黒、文字色を白に指定しリソースをリンクする事でコン
ソールアプリ(風)のタイトルバーのアイコンを自由に変更する事が出来ます。
(多分です。実験していないので明確な事は言えません)

元々F-Basicのコンソールアプリ(風)はc:\FBASIC63\Bin\f1a0dflt.rcという
リソースを使ってコンソールアプリ(風)のアプリを実現しているだけであり、
実際にはF-Basic自体がウィンドウ上でMS−DOSの互換動作を行う為に用意
したものですから、実際にはウィンドウリソースを持ったアプリです。

仮にどうしてもリソースを作らずにアイコンのみ変更されたい場合は
「c:\FBASIC63\Bin\f1a0dflt.rc」をメモ帳またはテキストエディタで開き、

// Icon file list ===
F1A0IconList RCDATA
BEGIN
    // RCDATAITEMHEADER
    "FB", 3
    "F1a0dflt.ICO\0" <-- この部分
END

上記の「f1a0dflt.ICO\0」の部分を別のアイコン名に変更します。この場合、
最後の「\0」の部分を削除してはいけません。この「\0」はC言語表記の
NULLコードであり、リソースコンパイラが生成するf1a0dflt.resファイル
で必要になる為です。(実際にはコンパイルされたRESファイルをF-Basicラン
タイムが認識する為です)

116毛の生えたブリーフ:2004/10/25(月) 00:01
>>ニャン子氏

コンソールアプリ(風)で、やっと気づきました。確かにコマンドプロンプト
上でアプリケーションファイル名を入力すると、新たにウインドウが現れて、
今までコンソールアプリケーションと思っていたものが、実はふつうのWinアプリ
だったことに気づきました。

c:\FBASIC63\Bin\f1a0dflt.rc は雛形なようで、弄るとまた面倒ですので
最初に指示された通りにしました。きちんと目的を達成しました。

ちょっと面倒だなぁ。

117毛の生えたブリーフ:2004/10/25(月) 00:13
F-BASICの場合、ウィザードが作ったリソースファイルをテキストエディタで
ゴリゴリ改造したほうが手っ取り早い気がします。

118Fbasic使用者:2004/11/03(水) 14:14
お世話になります。
下記と同じ経験をされた事はありませんでしょうか?
BASファイルは40000ステップありまして各Windows 98,2000,XPで
BASファイルを開き下の方へスクロールしていきますと32000当たりで
スクロールが止まってしまいます。サポートへ問い合わせしたらF-BASICの
エディタは1MBまでしか使用できませんと言っていました。
(デバックは問題なくできます。)たまたま、Windows95でBASファイルを
開いてみましたら40000ステップの最後までスムーズにスクロールできました。
その違いが解りません。ご存知の方がおりましたら教えて頂けませんでしょうか。
宜しくお願い致します。

119nisii:2004/11/06(土) 10:34
WindowsXP/2000では、付属エディタで下に行くほどスクロールが遅いですね。
行番号表示をしなければ、かなりマシになります。

120 Fbasic使用者:2004/11/06(土) 17:49
投稿してくださいましてありがとうございました。
Windows95では、行番号表示でも最後までスムーズにスクロールできます。
その違いが解ればWindows98,2000,XPも行番号表示が最後までスムーズに
スクロールできるのではと思いサポートに問い合をしましたが、
はっきりした事はわかりませんでした。
FBASIC.EXEの中にエディタが入っていると言っていました。
確かに行番号表示をしなければ最後までスムーズにスクロールできました。
しばらくの間行番号表示をしないで作業に問題がないか試してみようと思っています。

121Fbasic使用者:2004/11/11(木) 01:00
日頃から大変お世話になりまして、ありがとうございます。
下記につきましてよろしくお願い致します。
IBMのPROTALKであります読み上げソフトを開始しますとダイアログボックスが表示がされます。
__________________
再生        ▲
停止        ■→□
一時停止      ‖
__________________
読み上げが開始しますと□→■になります。読み上げが終了しますと■→□になります。
■及び□のどちらかになっているか調べる事のできますAPI関数はありますでしょうか。
SPYでダイアログボックス情報を調べますとでキャプション・クラス名は
キャプション・・・クリップボード リーダー クラス名 ・・・ClipReadWC でした。
ご存知の方がおりましたら、ご指導を願えませんでしょうか。よろしくお願い致します。

122F橋:2004/11/12(金) 01:27
Fbasic使用者さん>
F-BASIC標準のエディタでは色々と問題があり別のエディタを使っている方が少なくないみたいです
フリーソフトで評判がいいエディタはTeraPadみたいっすねー
http://www.vector.co.jp/magazine/softnews/031227/n0312273.html

私的には好きじゃないけど(笑
(2ストロークキーが使えないから。それを使わない人には関係ないけど)


>IBMのPROTALK・・・
途中で検索を挫折したのですが。ヒントや参考になれば嬉しいっす

「IBM PROTALK API」でGoogleで検索すると
Microsoft Speech API準拠ってのが検索できました

「microsoft speech api サンプル」でGoogleで検索すると↓こんなのを見つけました
http://www.google.co.jp/search?q=cache:MU93g1MCuH0J:www.microsoft.com/japan/whdc/hwdev/tech/audio/default.mspx+Microsoft+Speech+API+��泣�潟�����&hl=ja&lr=lang_ja

この中でうまくキーワードを検索するとVBとかでのAPI例が見つかるかも・・・
それをうまく利用すれば(分からなければVBのサンプルソースをここで公開すれば)
F-BASICの玄人がF-BASICで使う場合のサンプルを教えて頂けるかもです

お役に立たずにすんませーん

123Fbasic使用者:2004/11/12(金) 05:20
F橋さん
日頃からF-BASIC掲示板を活用させて頂きましてありがとうございます。
この場をおかりしましてF橋さん(管理人)、皆様方に心よりお礼を申しあげます。
ヒントや参考になればと「IBM PROTALK API」を検索して下さいましてありがとうございました。
F-BASIC標準のエディタについて質問したいのですがご都合が良ければよろしくお願い致します。
プロジェクトのMAKファイルを起動後プログラムのBASを開きますとF-BASICのエディタになります。
そのエディタを別のエディタ(例えばTeraPad、MIFES)でF-BASICのエディタの代わりで直接開く事は可能なのでしょうか。
もし可能でありましたら、組み込み方法の手順を教えて頂けませんでしょうか。
お手数をお掛けしますが、よろしくお願い致します。

124Fbasic使用者:2004/11/16(火) 13:48
お世話になります。
Internet Explorerのバージョンを調べるAPI関数を探して見ましたが。
どのような関数にすれば良いのかご存知の方がいらっしゃったら教授願
いたいのですが、宜しくお願いします。

125TOKO:2004/11/16(火) 18:05
レジストリの内容を読むようです。
nisiiさんが書いておられるレジストリの読み書きの『読む』ほうを使って
ROOTKEY& = HKEY_LOCAL_MACHINE
SUBKEY$ = "Software\Microsoft\Internet Explorer"
VERNAME$ = "Version"
で、取得できます。

126Fbasic使用者:2004/11/16(火) 18:40
TOKOさん
ご返答ありがとうございました。
レジストリの読み書きの『読む』ほうを使っての情報を下さいまして
お礼を申しあげます。以前から検索で色々とAPI関数で探して見ましたが
探せませんでした。レジストリに有るとは考えもつきませんでした。
レジストリについては知識はありませんので、レジストリについて調べ
バージョンの取得に取りかかる事ができますので本当にありがとうございました。

127akira:2004/11/19(金) 20:18
F-BASICで作ったプログラムで数字を入力するとき、電卓のような入力が
できないか考えていたんですが、実現した人はいるのでしょうか?
手続き型ではできるんですがイベントドリブン型では自分の力では不可能です。
いい方法があったら教えてください!よろしく

128TOKO:2004/11/19(金) 21:14
たとえば、エディットボックスを
複数行入力:あり
テキストの配置:右揃え
などとは意図するところが違うかな?

129akira:2004/11/19(金) 23:10
TOKOさん、どうもありがとうございます。
思い込みでエディットボックスではできないと
きめつけていました。
もっと早く掲示板に書き込めばよかった。
ほんとうにありがとうございました。

130Fbasic使用者:2004/11/25(木) 12:25
お世話になります。
クリップボードの確認方法につきまして
F-BASICのプログラムにより他のテキストデータをクリップボードにコピー後
wait 時間を設けてF-BASICのテキスト画面に転送しています。
wait 時間の代わりにクリップボードにコピーが完了されたかを確認してから
テキスト画面に転送したいと思っています。
クリップボードにコピーが終了されたか確認する方法は有りますでしょうか。
ご存知の方がおりましたら、宜しくお願い致します。

131TOKO:2004/11/25(木) 14:24
「クリップボード 監視 VB」で検索・・・
が、該当するのではないかと・・思うのですが・
一部のサンプルをVBで動作の確認をしています。

132Fbasic使用者:2004/11/25(木) 14:40
TOKOさん
早速アドバイス頂きまして、ありがとうございました。
以前から検索していましたが・・。「クリップボード 監視 VB」で
検索してみましたらサンプルが閲覧できました。
お礼を申し上げます。本当にありがとうございました。

133Fbasic使用者:2004/11/26(金) 14:30
日頃からお世話になりありがとうございます。
サンプルに挑戦してみましたが力不足で解決できませんでした。
それで、今使用していますクリップボードに関するAPI関数でそれぞれで試してみました。
クリップボードのコピーが完全に終了しないと
RET = POSTMESSAGE(HWND,&H111,&HA042,0) 'コピー
if ISCLIPBOARDFORMATAVAILABLE(CF_TEXT) = 0 then
・・・・指定したデータ形式がクリップボードに存在するかどうかを判定する
(CF_TEXT) の内容が変わらない事がこちらでは確認できました。完全にコピーする
までの時間は(例:WIN98 ・・32000バイトで3秒、500000バイトで8秒)でした。
もっと長いバイトではかなりの時間がかかります。F-BASICでは文字制限数が32000
バイトですので約40000バイト越えましたら途中でクリップボードのコピーを止める
ようにする必要から今回の質問としました。ありがとうございました。

134Fbasic使用者:2004/11/29(月) 20:04
幾度にも渡り大変お世話になります。ありがとうございます。
以前から疑問の一つであります、エディタに文字を縦(上→下)に
表示する事はF-BASICでも可能なのでしょうか。
例: 
   か あ
   き い
   く う
   け え
   こ お

もし、その点につきまして、ご存知の方がおりましたら、宜しくお願いいたします。

135のぶちゃん:2004/12/01(水) 18:45
いま、FBASIC VEr4を使っていますが、98、MEでは
BASファイル、が呼びこめますが、XPでは、失敗しましと
エラーがでます。何かいい方法があるのでしょうか?
掲示板を見ていると、VER6では問題ないみたいですね!
VER4とVER6のファイルの互換性はありますか?

136TOKO:2004/12/01(水) 22:59
Ver4を探して、試してみました。
読込に失敗しますね・・
とりあえず、失敗した状態で、他のエディタで読み込んだbasをコピペし、
翻訳するとOKのようです。
sampleのBCALCでテストしました。

137TOKO:2004/12/02(木) 06:51
>>136 続・・
V4.1 L10 アップデートディスクインストールで解決しました。
別々に保管してあり#136ではCD-ROMのみのインストール状態でした。^^;)
のぶちゃん さんはアップデートした状態ですか?

138シマヅ:2004/12/03(金) 22:18
◆管理人・F橋様◆
 何度も同じ書込み(前回10月22日)をして、誠に恐縮です。
 訳あって、F-BASIC(V7)購入予定者のハンドル(シマチャン)を「シマヅ」に変更をお願いします。お手数をお掛けして大変申し訳ありませんが、宜しくお願い致します。

139Fbasic使用者:2004/12/04(土) 13:56
お世話になります。
end sub以降で下記の症状が発生します。end sub以降はどのような処理しているの
かもし、ご存知の方がおりましたら参考程度で教えて頂けませんでしょうか。
宜しくお願い致します。
症状
Win95では特にテスト_Onを起動後STOPまでは問題ありませんでしたが、end subを
実行しますと即終了するはずがメニューに設置してありますビットマップボタン
(BMPBUTTON)の部分が数秒間色抜け(白色)状態になります。その後、終了状態に
なります。
declare sub テスト_On edecl ()
sub テスト_ON()
   ・
   ・
STOP
end sub

140nisii:2004/12/04(土) 18:36
>>139
これってイベントプロシージャなのでは?

イベントを抱えた状態だと、ウィンドウのリフレッシュはできないし、
プロセス系のコマンド・APIなどに悪影響を与えるので、
通常のサブプロシージャに変えてみましょう。

イベントプロシージャでは処理コードだけ返し、メインルーチンから
その処理をするサブプロシージャを呼び出せばOKです。

141Fbasic使用者:2004/12/04(土) 19:33
nisii さん
ご返答を頂きましてありがとうございました。
殆どイベントプロシージャ使用でサブプロシージャは過去に一度だけ使用したことが
あります。問題の所をサブプロシージャにして確かめてみたいと思い取りかかる事に
しました。貴重な情報のご指導をして下さいまして本当にありがとうございました。
心よりお礼を申し上げます。

142Fbasic使用者:2004/12/08(水) 12:08
お世話になります。
受信箱中に存在するメールのメールIDを獲得しますサンプルプログラムがあります。
FBASICV63\Sample_I\READMAILを実行しますと受信トレイ.dbxの更新日時が変更されます。
仮に受信トレイ.dbxのプロパティ→属性→読み取り専用にして実行しますと、
MSGID$=""と判断されます。
MSGID$=MAILFINDNEXT( SEEDMSG$, 0 )
if MSGID$="" then exit
              ・
              ・
MAILFINDNEXTは読み取りと思っていますが、同じデータを書き換えているのでしょうか。
もしMAILFINDNEXTが読み取りでしたら属性を読み取り専用にしても書き換えない限り更新日時
が変更されないとものと思いますが、その点につきまして、ご存知の方がおりましたら、
教えて頂けませんでしょうか。宜しくお願い致します。

143F橋:2004/12/09(木) 13:10
>>138
シマヅさん>
レスを見落とし更新が遅くなり申し訳ございませんでした
先日トップページを修正させて頂きましたのでご確認お願いします

また何か私が忘れていた場合とか遠慮なく教えて頂けますようよろしくです

144Fbasic使用者:2004/12/09(木) 15:08
お世話になります。
>>139
イベントプロシージャにおきまして
declare sub テスト_On edecl ()
sub テスト_ON()
   ・
   ・
STOP
end sub

end sub関数の機能を実現するためにより呼び出しているWindows
提供のDLLがあると思いますのでどのようなDLLを使用
しているのかend subを実行した場合の流れを調べる方法は
F-BASIC V6.3でも可能でしょうか。
宜しくお願い致します。

145nisii:2004/12/09(木) 19:54
>>144
イベントプロシージャ内で数秒以上の処理や停止は、しないことを強く薦めます。
もちろん途中に stop があることも、です。
その状態で発生する症状・エラーは、ほとんど解決できません。

イベントプロシージャの書き換えで困った、ということでしょうか?


#include "windows.bi"

declare sub テスト()
var shared G_TESTON as long

G_TESTON = 0
do
WAITEVENT
if G_TESTON then テスト
G_TESTON = 0
loop
end

' イベントが発生したら、フラグを立てて即イベント処理を抜ける
declare sub テスト_ON edecl ()
sub テスト_ON()
G_TESTON = 1
end sub

sub テスト()
'<目的の実行部>
stop
end sub

146Fbasic使用者:2004/12/09(木) 21:59
>>145
nisii さん
返信ありがとうございました。
説明不足がありましたので追記致しました。大変申し訳ありませんでした。
Windows98、2000、XPではWindows95のような現象はおきていません。
また、記憶が定かでないのですが、Windows95を再インストール後、
このような現象になったような気がしました?。
関係有るか解りませんがWindows95のアップデートも行いました。
以前は電話回線でしたのでWindows95のアップデートもできましたが、
今は光回線にしていますので再インストール後、Windows95のアップデートはしていません。
またイベントプロシージャ内で数秒以上の処理や停止は行っていません。
今回のSTOPは見き分ける為に使用しました。

while 1
WAITEVENT

if G_TESTON then テスト
G_TESTON = 0

wend

declare sub テスト_ON edecl ()
sub テスト_ON()

'<目的の実行部>
G_TESTON = 1
end sub

if G_TESTON then テストで テストの代わりにstopまたendなどを設けてテストしました。
endは即終了されます。stopは即停止になります。stopを実行しますと数秒後になって停止状態になります。
詳しい事は解りませんが、イベントの停止する為のSystem内のdllが関係しているのかと思っていますが?

147ラオウ:2004/12/09(木) 23:18
100個ぐらいの項目の1行が長いCSVファイルを作成したいのですが、1行が
256文字の制限に引っかかるみたいでうまくいきません。
write #FILENUM11,A1,A2,A3,・・・・・,A100
対応方法がありましたら、よろしくお願いします

148nisii:2004/12/10(金) 19:09
>>146
endは、保留イベントも破棄し、全てのリソースを開放するので処理が早いのでしょう。

>>146 ではイベントプロシージャ内に<目的の実行部>が入ったままです。
それとも、>>145 と同等に書き換えても反応が鈍いのでしょうか?

一見無駄に見えるかもしれませんが、>>145 は経験上最もトラブルの出ない方法です。
まずはお試しください。

また、互換性を大事にされるのでしたら、下手にシステムに干渉しないほうが安全です。

149nisii:2004/12/10(金) 19:13
>>147
あらかじめ1つの文字列に連結しておけばどうでしょう?
数値であっても、文字化しておけばいいわけですし。

150Fbasic使用者:2004/12/10(金) 22:51
nisii さん
返信ありがとうございます。
>>145 方法で挑戦してみましたが、while 1・・WAITEVENT間が
かなり長くしましたので簡単に変更出来ませんでした。
今後は、経験上最もトラブルが無く、また、殆どプログラム容量の
心配する必要も考えなくてすむと思いますので145 方法と考ます。
色々とご指導下さいまして本当にありがとうございました。

151ラオウ:2004/12/10(金) 22:57
nisiiさん
ありがとうございます
100個の項目の中に文字列があったので、次のように書いてみると
文字列にダブルクォーテーションがつきません
A1=10
B="ABC"
IN$=STR$(A1) + "," + B$
PRINT #FILENUM, IN$
結果 10,ABC
"ABC"のように、文字列の両側にダブルクォーテーションをつけるには、
どうすればいいのでしょう

152nisii:2004/12/11(土) 11:12
>>151
IN$ = chr$( &h22 ) + trim$( STR$( A1 )) + chr$( &h22 ) + "," + chr$( &h22 ) + B$ + chr$( &h22 )

短く書く工夫は適当に…。(笑)
def fnで文字の両側に"を付ける関数を作るとか、
chr$( &h22 )を #defineで短い名前の定数にするとか。

私の好みだと、見やすくしたいのが優先なので、
1行で1つの値を追加し、必要な数だけ行数を用意します。

153Fbasic使用者:2004/12/11(土) 11:34
お世話になります。
256を越えるAPI関数がありますがAPI関数も文字化にする事が可能なのでしょうか。
例 declare function API_XYZ & lib "ABC" alias "XYZ" ( byval A$ , byval ・・・・ )

154TOKO:2004/12/11(土) 15:05
API見習い中のTOKOです・・
>例 declare function API_XYZ & lib "ABC" alias "XYZ" ( byval A$ , byval ・・・・ )
上記の場合
API_XYZと&の間に空白が入っていないとしてAPI_XYZ&は自由に変更することができます。
DLLの部分"ABC"および関数名"XYZ"は変数に置き換える人はいないでしょうが
#define Z$ "ABC"
#define W$ "XYZ"
declare function API_XYZ& lib Z$ alias W$ ( byval A$ , byval ・・・・ )でも動きます。

例えば下記のAPIをF-BASICで使いたい場合、
Public Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" _
(ByVal dwExStyle As Long, ByVal lpClassName As String, _
ByVal lpWindowName As String, ByVal dwStyle As Long, _
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
ByVal nHeight As Long, ByVal hWndParent As Long, _
ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long

普通、制限文字数に収まるよう下記のように書き換えすネ。

declare function Api_CreateWindowEx& lib "user32" alias "CreateWindowExA" _
(byval dwExStyle&, byval lClassNm$, byval lWinNm$, _
byval dwStyle&, byval x&, byval y&, byval nWidth&, _
byval nHeight&, byval hParent&, byval hMenu&, _
byval hInstance&, byval lParam&)

Ret = Api_CreateWindowEx(・・・・)

極端にいえば

declare function Z& lib "user32" alias "CreateWindowExA" _
(byval A&, byval B$, byval C$, byval D&, _
byval E&, byval F&, byval G&, byval H&, _
byval I&, byval J&, byval K&, byval L&)

Ret = Z(・・・・)

これでも動きますが、制限文字数内でできる限り元の名前を残すようにしています。
http://www.arcpit.co.jp/winapi/api_01/index.htm

155Fbasic使用者:2004/12/11(土) 16:48
TOKOさん
返信ありがとうございます。
F-BASICでは以前から256を越えるAPI関数は使用できないものと思い
あきらめた事がありました。
特に制限文字数に収まるようにする為の書き換え方法は今後、
256を越えるAPI関数を使用する場合の参考になりました。
今まで使用できないものとあきらめていただけに一つ勉強になりました。
色々とご指導下さいまして本当にありがとうございました。

156ラオウ:2004/12/11(土) 22:29
ありがとうございます
IN$ = chr$( &h22 ) + trim$( STR$( A1 )) + chr$( &h22 ) + "," + chr$( &h22 ) + B$ + chr$( &h22 )
PRINT #FILENUM, IN$
これで、100個ぐらいの項目の1行が長いCSVファイルを作成できました
でも、よく考えると、このCSVファイルを読むには、どうすればよいのでしょう
input #FILENUM, IN$じゃ、おかしいし
すみません、お知恵をください

157TOKO:2004/12/12(日) 08:46
>ラオウさん
間違えて『20レス以内で済むF-BASIC質問の件#23』に書き込んでしまいました。(^^;)

158ラオウ:2004/12/12(日) 12:11
読込は1行100項目をを一度に読み込まなくてもいいんだ
そうなんだ
昔からずっと勘違いしていました
ありがとうございました

159Fbasic使用者:2004/12/14(火) 14:37
お世話になります。
__________________________
F$ = WINOPENDLG( "メモ帳",CRDIR$("")+"\メモ帳\*.TXT", "テキスト(*.TXT);全てのファイル(*.*)", 0 )
●ここでデバックのブレークを設定
__________________________
上記でダイアログボックス( WINOPENDLG)を実行後、●ここでデバックの
ブレークを設定の所でフォームに設けてありますビットマップボタン
(BMPBUTTON)のビットマップ全てが色抜け状態(白色)になります。
ブレークからデバックのトレースボタンを一個でも実行しますとビットマップ全ての
色抜け状態はなくなり本来のビットマップに戻りました。
何故このような事になるか解りませんがプログラムで本来のビットマップに
戻す方法は可能でしょうか。何かご存知の方がおりましたら、
教えて頂けませんでしょうか。宜しくお願い致します。

160Fbasic使用者:2004/12/14(火) 16:46
>>159 FBASICサンプルでも確認できました。
FBASICV63\Sample_B\BmpBtnにメニューを設けFBASICV63\Sample_B\Edit
サンプルの開く(o)sub OPEN_ON()・・・・end sub部分を追加しました。
__________________________
F$ = WINOPENDLG( APPNAME, "*.TXT", "テキスト(*.TXT)", 0 )
●ここでデバックのブレークを設定
________________________

161Fbasic使用者:2004/12/15(水) 19:52
お陰様で解決することができました。
ダイアログボックスがビットマップボタンと重なる所が
色抜けになりました。F$ = WINOPENDLG・・・の後に
CLS 0(テキストとグラフィックを消去)を追加することで
再描画される様になりました。

162Fbasic使用者:2004/12/23(木) 10:02
日頃から大変お世話になりまして、ありがとうございます。
再度、下記につきましてよろしくお願いいたします。
フォームにビットマップボタンを作成後、プログラムで作成しました
ビットマップボタンを取り除いてフォームにビットマップボタンを無く
する事は可能でしょうか。
________________________________________________
コントロールID BMPBUTTON21
項目
ビットマップ  XXXXX 
   ・
   ・
ツールチップ XXXXX
__________________________________________________

ご存知の方がおりましたら、教えて頂けませんでしょうか。よろしくお願いたします。

163TOKO:2004/12/23(木) 10:38
BmpButton21のハンドルを取得し、APIのDestroyWindowで破棄できるようですが、
単に、ShowWindow 0では不都合があるのでしょうか?

164Fbasic使用者:2004/12/23(木) 15:25
TOKOさん
早々と、返信くださいましてありがとうございました。
少し遅くなりまして本当に申し訳ありませんでした。
ビットマップボタンを作成後、プログラムでビットマップボタンを取り除
きたい理由はタイマーイベントを発生して切り取り、コピー、張り付けを
ビットマップボタンとして利用しています。Windows98、2000、
XPではよいのですがWindows95ですと遅いため切り取り、コピー、
張り付けを実行しますと全体的にかなり遅くなります。それでWindows
95の場合はタイマーの使用をしない為別に切り取り、コピー、張り付けをビ
ットマップボタンを別に設け上に重ねています。
Windows95以外では上に重ねたビットマップボタンを取り除ければと
思っています。タイマーイベントは周期的に他でも使用していますので停止す
る事はできません。幾度もなくご指導くださいまして深くお礼を申しあげます。
少し早いと思いますがよい年をお迎え下さい。
今後とも宜しくお願い致します。

165Fbasic使用者:2004/12/23(木) 16:25
TOKOさん
APIのDestroyWindowのご回答によりまして
作成後のビットマップボタンをプログラムで取り除く事ができました。
if (GETDLGITEM("Bmpbutton21"))<>0 then RET=winapi_DestroyWindow(GETDLGITEM("Bmpbutton21"))
お陰様で目的通りのものが出来ました。
心より厚くお礼を申しあげます。
本当にありがとうございました。

167芳博:2004/12/28(火) 18:56
早速助言頂きました ありがとうございます

前回も書き込もうとしたのですが出来ませんでした
また
具体的な プログラムで一部教授願うときはどのようにすればよいでしょうか

168延ちゃん:2005/01/08(土) 19:13
lprint 命令を使うには
どうしたらいいでしょうか?
使っているのはFBASIC VER.4
です。

169TOKO:2005/01/08(土) 21:19
プリンタにもよりますが、

#include "Windows.bi"

txt1$ = "abcdefghij"
txt2$ = "漢字の出力"
print txt1$
print txt2$

'(A)Windowsの印刷機能を使用する場合
lprint type "DC"

'(B)F-BASICインストール配下のBINフォルダにあるCHECHPRN.EXEを実行し、漢字が印刷
できるプリンタの場合プリンタポートを直接操作できます。(例:PC-PR201G)
'lprint type "PC-PR"

lprint txt1$
lprint txt2$

'これを入れないと排紙されない
lprint chr$(12);

stop
end

(A)、(B)どちらかを生かして試してみてください。

170ラオウ:2005/02/12(土) 06:12:00
 件数が5万件の配列のソートをしたいのですが、バブルソートでは時間がすごく
かかります。

 F−BASICは再帰呼び出しが使えないようなので、再帰呼び出しを使わない
クイックソートか、他のソートを教えてください。

171TOKO:2005/02/12(土) 17:21:29
http://tokovalue.hp.infoseek.co.jp
のソートテストは参考になりませんか?

172iwakifarm:2005/02/12(土) 18:41:50
ソートする場合すべてのレコードを比較するのかな?
それとも何バイト目から10バイトとか。。。。
一度組んだことがあります。
どこかにソースがありますので探してみます。

173ラオウ:2005/02/12(土) 21:50:31
171さん
 参考にさせていただきます。ありがとうございました。

172さん
 固定長ではなく、配列を次のように設定し、D列の昇順でF列の降順というように
したいと思っています。
 var shared HAIRETU(A,B,C,D,E,F) AS LONG

174初心者:2005/02/12(土) 23:45:05
はじめまして。いつも拝見させていただいております。
申し訳ありませんがお力を拝借したくて書き込みをさせていただきます。

HTTPGETで、"xxx.pl"のようにperlのURLを指定して、
その出力ファイルを得たいと思っています。

実行してみると、html形式の出力は得られるのですが、
なぜかファイルサイズが4096バイトのところまでしか
GETできないようで困っています。

"xxx.html"のように、htmlファイルを指定したときは
ちゃんとEOFまで取得してくれるのですが、
なぜこうなるのでしょうか…。

175F橋:2005/02/13(日) 01:33:50
>>173
私は頭が悪いので(理解力が本当に弱いので)ちょっと確認したいのですが・・・
(速度はとても遅いし配列のソートでは無く「D列の昇順でF列の降順」で表示するのみですが)

>配列を次のように設定し、D列の昇順でF列の降順というように・・・
>var shared HAIRETU(A,B,C,D,E,F) AS LONG

との事ですので

D列の昇順でF列の降順に配列の変数の中身を出力してみてますが・・・

var shared HAIRETU(A,B,C,D,E,F) AS LONG

'HAIRETU(a,b,c,d,e) の aの最大値を max_a, bの最大値を max_b ... とした場合

for d=0 to max_d
 for f=max_f to 0

  for a=0 to max_a
   for b=0 to max_b
    for e=0 to max_e
     print hairetu(a,b,c,d,e)
    next e
   next b
  next a

 next f
next d


D列の昇順でF列の降順に配列の変数の中身を出力してみましたが・・・
要はこんな形で変数の中身を順序よく取り出せればいいだけなんでしょうか?

>>170でソースはある用なので可能ならばそれをここに投稿して頂けると助かります

-----
おそらくですが。こんな巨大な6次元配列で50000件って事は
ファイルから読み込んだものだと想定しております
従って読込時に別配列をキーとして用意すれば高速に並び替える手段が
思いつくような気が・・・少ししますです

-----
今、泥酔中で・・・なんか凄いとんちんかんなレスをしている気が・・・(おい

176F橋:2005/02/13(日) 01:45:52
>>174
多分解決しないと思いますが・・・少々思った事を・・・

1)wait入れたらどうなりますか?(CGIが動ききってない場合を想定)
HTTPGET ID, "xxx.pl"
wait(100)
HTTPGET ID, "xxx.pl"

2)もし xxx.pl が自作ならば・・・
xxx.plの実行結果をxxx.htmlに出力する様に変更してみては如何でしょう?

-----
ネットの読込の何かで4096バイトって何かで聞いた気が・・・
ルーターの有無、別のプロパイダ、OSによって4096バイトでは無い場合が
考えられるのですが・・・(でもその場合の解決策が思いつかない)

Windows95,98とWindowsME,2000,XPで結果が違う気がする・・・
(95系、NT系では無くブロードバンド用の設定のOSとナローバンド用の設定のOSの違い)

177ラオウ:2005/02/13(日) 06:26:11
>>175
すみません。
この表現(var shared HAIRETU(A,B,C,D,E,F) AS LONG)は間違っています。

実際はvar shared SORTWORK1(J&, ITI)で、SORTWORK1の中のITIは6個(1:氏
名、2:年齢、3:住所、4:電話、5:性別、6:金額)があり、年齢を昇順、金額を
降順に並べ替えたいとき

SORT 50000,2,"U" '年齢を昇順
SORT 50000,6,"D" '金額を降順

SUB SORT(TOTALCNT1&,ITI,ZYUN$)
SELECT CASE ZYUN$
CASE IS = "U"
for L& = TOTALCNT1& to 1 step -1
for J& = 1 to L& - 1
if SORTWORK1(J&, ITI) > SORTWORK1(J& + 1, ITI) then
for M = 1 to 6
swap SORTWORK1(J&, M), SORTWORK1(J& + 1, M)
next
endif
next
next
CASE IS = "D"
For L& = TOTALCNT1& to 1 step -1
for J& = 1 to L& - 1
if SORTWORK1(J&, ITI) < SORTWORK1(J& + 1, ITI) then
for M = 1 to SORTKOUMOKU
swap SORTWORK1(J&, M), SORTWORK1(J& + 1, M)
next
endif
next
next
END SELECT
ENDSUB

というふうに、ITIで並べたい項目を指定し、ZYUN$で昇順か降順を指定します。
なお、このサブプロを実行すると2時間以上かかります。

171さんの例を元に、クイックソートで作ってみたのですが、年齢を昇順、金額
を降順に並べ替えたいとき、1回目の年齢を昇順にはきれいにソートできるので
すが、2回目の金額のソートをすると、金額は降順になるのですが、年齢がばら
ばらになってしまいます。
クイックソートでは、もともと無理があるのでしょうか。

長文になりましたが、お知恵をお貸しください。

178iwakifarm:2005/02/13(日) 13:26:27
ラオウさん了解です。
両方共昇順であれば可能です。
そうしてもと言う場合は、昇順されたファイルと降順されたファイル
を同じデータかどうかを調べてでないとでてきません。
そうなると年齢を基準にするか、金額を基準するかでプログラムを
組めば、可能かと思います。

179F橋:2005/02/14(月) 01:51:48
>>177
私の会社と似たようなデータみたいですね(笑
F-ISAMやBtrieve、もしくはアクセスなどのデータベースならファイルを読み込むときに
年齢昇順で金額降順に読み込む。って事が簡単なんですけどね
(私の会社ではある程度の件数以上(1000件以上くらい)はこのようにしてます)

データベースが使えなくて配列でなんとか行わなければならないのなら・・・
別の検索用のキー配列を用意するのがとりあえずは早くなるかと・・・

'/// 年齢昇順、金額降順用のsortキー用の配列を作成(ファイル読込時に作成するといいかも)
for j&=1 to 50000
 nen$=right$( space$(3)+str$( SORTWORK1(J&, 2) ),3 )
 kin&=1000000&-val( SORTWORK1(J&, 6) ) '金額は0〜999999(6桁)の場合
 kin$=right$( space$(6)+str$( abs(kin$) ),6 )
 sortkey$(j&)=nen$+kin$+right$( space$(5)+str$(j%),5 )
next j&

'/// sortkey$()をsortするルーチン・・・はいくつか方法あるので後ほど

'/// sotrkey$()を参照しながらsort結果を出力
for j&=1 to 50000
 code&=val( right$( sortkey$(j&),5 ) )
 for m=1 to 6
  SORTWORK1(code&, 6)
 next m
next j&

(↑一切テストしてないのでプログラムが間違っていたらすいませんです)

sortの方法はいくつか考えられますが・・・
配列のsortkey$()をのみをsortすればいいだけなので単純になるので
どこぞでクイックソートのサンプルでも探して簡単に出来るのでは無いかと・・・

それとF-BASICのサンプルにsortのサンプルが(こっそりと)あるので
それを利用して見ると早いと思います
(\fbasicv63\sample_b\ccall\sortを見てみてください)

クイックソートのサンプルが見つからないとかdllの使い方が分からない場合は
sortkey$()をテキストファイルに書き出してテキストファイルを別のソフトを使用し
(フリーソフト sort テキストなどでGoogleで検索してみてください)
ソート後のテキストファイルを順次読み込む。等が考えられます
テキストファイルのソート専用のソフトは50000件でも数分だと思いますので
ファイルの読込時間や書込時間を考えてもトータルでかなり高速ではないかと・・・

で。どの方法を使うか。使いたいのかが分からないので今回は詳細は省略しますが
1.クイックソートのサブルーチンを使うのか
2.F-BASICのサンプルを使うのか(使った事ないけど多分お勧め)
3.テキストファイルにしてソートを他のソフトに任せるのか

の返答を頂ければもう少々細かくお話しますです

180F橋:2005/02/14(月) 02:10:14
>>177
金額の項目の範囲がどのくらいなのか(マイナスがあるのか、最大でいくらくらいなのか、小数点があるのか)
が分かればさらに高速にする話が出来る。かも知れないです

多分ですが。50000件かつたくさんの項目を持つのならF-BASICでは少々厳しいはず・・・
(配列はメモリの許す限りと書いてありますが件数多いと(F-BASICでは)劇的に遅くなりますので)
別の何かにsortを任せるのが一番だと思います

先に話したF-BASICのsortサンプルがベストだとは思いますが
(私と同じで)dllの呼び出しはよく分からないからしたくない。って場合は
↓が一番簡単で効果が高いかと思います



open "sort.txt" for output as #1
for j&=1 to 50000
 nen$=right$( space$(3)+str$( SORTWORK1(J&, 2) ),3 )
 kin&=1000000&-val( SORTWORK1(J&, 6) ) '金額は0〜999999(6桁)の場合
 kin$=right$( space$(6)+str$( abs(kin$) ),6 )
 print #1, nen$+kin$+right$( space$(5)+str$(j%),5 )
next j&
close #1

shell "sort.exe","sort.txt > sort.out" ... 'shellの使い方忘れた。調べてください(笑
' OSによって標準で sort.exeがついているのを忘れてた。
' sort.exeの使い方はsort/?等で調べてみてください
' 上記の例はsort.exeの使い方を調べずに適当に書いてます
' この方法を使うのなら調べ直すのでご返答下さいです。
'
' 現状でどの方法を使いたいのかが分からないので詳細まで書くと長くなるので省略してます

open "sort.out" for input as #1
while not eof(1)
 line input #1, buf$
 code&=val( right$( sortkey$(j&),5 ) )
 for m=1 to 6
  print SORTWORK1(code&, 6)
 next m
wend

尚、私の知識内では上記の用に何らかの方法で検索用のキーを作り
それをsortする方法しか思いつかないです
キーを作らずに高速にソートをしたい場合が思いつきませんのでご了承下さいです。

181F橋:2005/02/14(月) 02:14:39
ひとりごと

お?今試してみたんだけど。sort.exeは予想以上に早かった(笑

dir /s \ > a.txt でテキストファイル(60000行 3Mbyte)を
sort a.txt > a.out にしたら数秒・・・10秒かかってなかった(Win2000 Pen3 900MHz 256Mbyte環境)

これはsort.exeを利用したが簡単で早そうだ・・・
(書込、読込の時間がかかるだけくらいかな・・・)

182F橋:2005/02/14(月) 02:18:06
>>181の続き

数秒っつーか・・・2秒?2秒以内かも。

Windowsを作ったメーカーがWindowsで標準で用意したSortってのは流石に凄まじく高速っすねー

183ラオウ:2005/02/14(月) 04:24:47
レスありがとうございます。

昇順と降順を含む2つ以上の検索キーをまとめるやり方は勉強になりました。

SORT.EXEをつかってみようとSORT/?をしたのですが、開始位置の指定は/+Nだと
わかったのですが、桁数の指定がわからないので教えていただけないでしょうか。

ファイルを20桁目から昇順にする場合はうまくいきました。
shell "SORT.EXE","C:\A.TMP /+20 /R /O C:\B.TMP"

184nisii:2005/02/14(月) 11:20:49
F-BASIC付属のXSRVC_QSORT(F1A0QSRT.DLL)を愛用しています。
メモリ上で受け渡すので、結構速いよ。
検索キーの位置と長さも指定できますからお試しを。

公開中のツールのほとんどで、ファイル名ソートほかに使ってます。
15万件ソートでも耐えてますよ。(WinXP)

…え?ダウンロードしたファイルに添付されてないって?
実はこっそり埋め込んでます。(苦笑)

私は、sortを始め、shell(DOSコール)を避けるようにしています。
というのも、わずか数百回のコールで、致命エラーが発生することが多いから。
メモリクリアや、メモリ配置の工夫程度では、解決できませんでした。

185ひろ:2005/02/14(月) 18:28:51
FBASICの諸先輩方教えて下さい。
ボタンを押したらFORM2を表示したいのですが実行時にコントロールが見つからないとエラー
が出ます。リソースには登録してあるのですが.....
初歩的な質問で恐縮ですがどなたかお願いします。

#include "WINDOWS.BI"
var shared MAINFORM as object
MAINFORM.ATTACH GETDLGITEM("MAINFORM")

var shared FORM_2 as object
FORM_2.ATTACH GETDLGITEM("Form2") ' エラー発生行 [コントロールが見つかりません]

declare sub BUTTON1_ON edecl ()
var shared BUTTON1 as object
BUTTON1.ATTACH GETDLGITEM("button1")

while X=0
WAITEVENT
wend

sub BUTTON1_ON()
FORM_2.SHOWWINDOW -1

end sub

186ひろ:2005/02/14(月) 18:29:08
FBASICの諸先輩方教えて下さい。
ボタンを押したらFORM2を表示したいのですが実行時にコントロールが見つからないとエラー
が出ます。リソースには登録してあるのですが.....
初歩的な質問で恐縮ですがどなたかお願いします。

#include "WINDOWS.BI"
var shared MAINFORM as object
MAINFORM.ATTACH GETDLGITEM("MAINFORM")

var shared FORM_2 as object
FORM_2.ATTACH GETDLGITEM("Form2") ' エラー発生行 [コントロールが見つかりません]

declare sub BUTTON1_ON edecl ()
var shared BUTTON1 as object
BUTTON1.ATTACH GETDLGITEM("button1")

while X=0
WAITEVENT
wend

sub BUTTON1_ON()
FORM_2.SHOWWINDOW -1

end sub

187nisii:2005/02/14(月) 20:07:07
FORM_2.ATTACH GETDLGITEM("FORM_2") ' エラー発生行 [コントロールが見つかりません]

FORM_2.CREATEWINDOW "FORM2" , 0

188ひろ:2005/02/14(月) 21:50:30
nisiiさん
どうもありがとうございました。

お蔭様で目的が実現できそうです。
FORM_2.SETTOPMOSTWINDOW (-1) 
で手前に表示もできました。
本当にありがとう御座いました。

189F橋:2005/02/15(火) 00:47:09
>>183
>桁数の指定がわからないので教えていただけないでしょうか。
すいません。分かりません。
私の考えで申し訳ないのですがOSによってオプションが変わる可能性もあり得るので
私の場合はオプションを付けずにSORTさせる場合が多いのですが・・・

>>184
致命的エラーが出やすいのは知りませんでした。
私はテストでしか使った事が無いのでこれを納品するとハマる所だったかも知れません
ありがとうございました

nisiiさんの意見のF-BASICサンプルのSORT DLLを使うのに私も賛成は賛成っす
ただDLL呼び出し恐怖症(=数年前の私)の方も見えるし
Windows起動後数回程度しか使わない作り方もあり得るのを考えるとSORTの方向もありかな。と思うですので・・・

あの。nisiiさんの意見を否定してる訳じゃないですよー(涙
(今の私ならDLLを呼び出すのを真っ先に考えるので・・・)

どういうシステムか。開発者がどのレベルか。どういう使い方をユーザーがする予定なのか。等々
条件によって様々考えられるので現段階ではどれが正解かってのは分からないっすよねー(汗

190nisii:2005/02/16(水) 17:39:10
>>179
年齢と金額の2つのキーがあり、それぞれ昇順と降順でソートする方法案。

ソートの優先順を1年齢、2金額と想定します。
元データはカンマ区切りなどのテキストファイルと想定します。

氏名,年齢,住所,電話,性別,金額(改行)
氏名,年齢,住所,電話,性別,金額(改行)


まず、各行の先頭に固定長のキーを加えたファイルを作ります。()内は例。

年齢(023)金額(000010000)氏名,年齢,住所,電話,性別,金額[改行]
年齢(031)金額(000021500)氏名,年齢,住所,電話,性別,金額[改行]


このとき、金額が最大9桁なら、キーの値は(999999999 - 金額)とする。
金額に負の値が存在しうるなら、(999999999 - ( 金額 + 499999999))とする。(最大値に注意)
SORT.EXEなどテキスト対応のソートプログラムがあれば、このままソート。

最後に、先頭のキーを取り除きます。


------------------------
高速なバイナリソートをするなら、レコードを固定長にします。

連番(000001)年齢(023)金額(000010000)
連番(000002)年齢(031)金額(000021500)


これをソートし、最後に連番を元に氏名・住所ほかを取り出します。

メモリが充分あるなら、次のレコードでもOKでしょうか?

年齢(023)金額(000010000)氏名,年齢,住所,電話,性別,金額…長さをそろえるスペース
年齢(031)金額(000021500)氏名,年齢,住所,電話,性別,金額…長さをそろえるスペース


------------------------
参考までに、DOS用のソートプログラム。
http://www.vector.co.jp/vpack/filearea/dos/util/text/sort/index.html

191F橋:2005/02/16(水) 22:56:24
>>190
さらに分かりやすいソートをご紹介頂きありがとうございました
これをchr$()やmki()で圧縮するとさらに速そうですね

>参考までに、DOS用のソートプログラム。
あ。こういうフリーソフトのジャンルがあったんだ・・・
私も嬉しかったりしたです(笑

sortの日付(公開日)が古いのが多いですねー
やはり最近はデータベースとかのsortが主流なんすかね

覚えなければならない事がどんどん増えてる気がする(涙

192ラオウ:2005/02/16(水) 23:15:55
sort.exeを使うことにより、2時間以上かかっていた作業が10秒で終わりました。

nisiiさん F橋さん
どうもありがとうございました。

193亀谷 弘之:2005/02/21(月) 14:37:17
fbasic6.3で簡単なProgを作成し次のような命令をしたところ
 Locate 10,10:input "",A$ A$には漢字を入れたいところ、locateにかかわらず
画面の左上に変換された漢字が出てきます、その後enterキーにより所定の場所に移動しますが
しますが、最初からlocate文の場所に表示させることは出来ないのでしょうか?
教えてください。

194亀谷 弘之:2005/02/21(月) 14:38:14
fbasic6.3で簡単なProgを作成し次のような命令をしたところ
 Locate 10,10:input "",A$ A$には漢字を入れたいところ、locateにかかわらず
画面の左上に変換された漢字が出てきます、その後enterキーにより所定の場所に移動しますが
しますが、最初からlocate文の場所に表示させることは出来ないのでしょうか?
教えてください。

195akira:2005/02/21(月) 22:48:09
教えてください!FBASIC6.3をWinXP上で使っています。
統合環境でフォームにコントロールを配置するとき一つ配置すると
フォームが一番下に行ってしまいます。
今日気がついたんですが、前回までは普通に連続で配置できました。
ほかのウインドウをすべて最小化すれば普通に使えます。
FBASICを上書きしてみましたが直りません。どうかよろしくお願いします。

196F橋:2005/02/22(火) 02:05:26
>>194
このHPのトップページでリンクしてある

F-BASICでAPI
http://www.geocities.co.jp/SiliconValley-SantaClara/1866/index.html

↑の
http://www.geocities.co.jp/SiliconValley-SantaClara/1866/FB/toukou/FV63LIB.html
をご参照下さい



>>195
え?そんな症状があるんですか?
その症状はF-BASICだけなんでしょうか?

うろ覚えですが似たような症状でハード(キーボードかマウス)の故障だった事があったような無かったような・・・
相変わらずお役に立たずにすいません

197akira:2005/02/22(火) 15:59:36
>>その症状はF-BASICだけなんでしょうか?
そうなんです!ほかのアプリでは何でもないようなんです。
前回は上書きしてみたけどだめだったので、今度は完全に
アンインストールして入れなおしてみようかな。

198nisii:2005/02/22(火) 17:59:55
>>197
フォームのプロパティで、トップモーストを指定していませんか?
これをしてると、統合環境のダイアログが隠れて操作できなくなることもあります。
トップモーストは、プログラムから指定することをお勧めします。

199akira:2005/02/22(火) 20:52:50
nisiiさん、いつもありがとうございます。
>>フォームのプロパティで、トップモーストを指定していませんか?
してないです。今回一度削除して再インストールしたんですが
まったく変わりませんでした。
どうも常駐プログラムが悪さしているような気がしてきました
最近セットアップしたSKYPUとB's Recorder GOLD8を止めてもう一度
テストしてみます。

200akira:2005/02/22(火) 22:40:06
やっぱりだめでした。しくしく
ただタイトルバーをワンクリックしてからコントロールの配置位置を
決定すればメインフォームが隠れなくなることがわかったので、とりあえず
そうやって見ます。残念!!

201F橋:2005/02/23(水) 02:49:33
>>200
全然関係ない可能性が高いですが・・・
ウイルスとスパイウェアのチェック(特にスパイウェア)をしたらどうなります?


ウイルスバスター オンラインスキャン
http://housecall.antivirus.com/housecall/start_jp.asp?i=n

Spybot (スパイウェアのチェック)
http://www.dream-seed.com/pukiwiki/index.php?Windows%2FSpybot%A4%CE%BB%C8%A4%A4%CA%FD

202akira:2005/02/23(水) 08:38:40
スパイウエア・ウイルス共にいませんでした。

203F橋@役立たず管理人:2005/02/24(木) 20:25:45
>>202
お騒がせしてしまい申し訳ございませんでした

204nisii:2005/02/25(金) 11:45:21
>>199
ある日を境にこの症状が起きるようになったのであれば、
その直前にやったことが原因ですよね。

WindowsXP SP2を入れた。
DirectXを更新した。
ディスプレイドライバを更新した。
「タスクバーをほかのウィンドウの手前に表示する」などの設定を変えた。
キー・マウス操作の補助ツールを入れた。
トップモースト属性のウィンドウを持つ常駐ソフトを入れた。
気づかずに何かのソフトを入れた。

・そのプロジェクトファイルにフォームを2つ以上登録しているなら、
属性を比較してみる。

・セーフモードではどうでしょう?
セーフモードで正常なら、常駐ソフトが原因の可能性大。

205akira:2005/02/25(金) 19:47:36
nisiiさんいつもありがとうございます。
>>WindowsXP SP2を入れた。
SP2を入れた後も正常に動いていました。
>>DirectXを更新した。
これは意識的には更新していないんですが、テストで
Desktop On-CallというIBMのアプリを組み込んだとき
DirectXを更新したかもしれません。
後前にも書きましたが、B'SとSKYPUを入れたんで削除してみたんですが
やはり変わりませんでした。
まだセーフモードではやっていないのですぐやってみます。
フォームにコントロールを配置するときって最初のうちにやっているので
最近はづっとコーディングばかりだったので気がつくのがおくれてしまい
原因がつかめません。
また報告します。

206akira:2005/02/26(土) 14:54:19
セーフモードでやってみましたが、全く同じ動きでした。
後はDirectXぐらいしか思いつきません。ヒロシですヒロシです・・・・

207nisii:2005/02/26(土) 16:29:04
>>206

セーフモードで変わらないなら、F-BASICの問題か、
キーフックがらみのシステムを書き換えられたか、くらいかな?

前者ならアンインストール後、フォルダの削除。
もちろん残っているはずのレジストリキーも削除。
で、再インストール。

後者だとちょっと面倒だね。システムの復元じゃ直らないかも。

208akira:2005/02/27(日) 17:32:20
nisiiさんどうもです。
参考にいろいろやってみます。

209F-BASIC愛好者:2005/03/01(火) 14:14:49
時々拝見しまして勉強になり大変助けられています。
ファイルをダウンロードするため、ダウンロード記述をクリックしますと、
ファイルのダウンロードで保存する場所(I)がデスクットプになります。
F-BASICで保存する場所(I)をデスクットプでなく指定する場所に変更することは
可能でしょうか。もし、可能でありましたら、ご教授よろしくおねがいします。

210nisii:2005/03/02(水) 10:59:33
WINSAVEDLG関数を実行したときの、デフォルトディレクトリを変更したい
ということでしょうか?
そうなら、APIのSaveDlg()を使えば指定できそうですよ。

211F-BASIC愛好者:2005/03/02(水) 14:27:11
nisiiさん返信ありがとうございました。
自分は説明ができていませんでした。本当に申し訳ありません。
自分事ですが、音声読み上げにつきまして下記にしました。
http://www-6.ibm.com/jp/voiceland/download/engdown.html
http://www-6.ibm.com/jp/voiceland/pt20/ocxdown.html
1.ファイルのダウンロードのダイアルログボックスが表示されます。
2.ダイアルログボックスの保存(S)をクリックします。
3.保存する場所(I)は デスクトップになっていました。
PT97VD07.EXE、PT97ENG.EXE、PTOCX.EXE 3個のソフトをダウンロードします。
これらをソフトでダウンロード&インストールしたいと考えています。
 ダウンロード
1.shell "http://www-6.ibm.com/jp/voiceland/download/dl/PT97VD07.EXE&quot; 
2.shell "http://www-6.ibm.com/jp/voiceland/download/dl/PT97ENG.EXE&quot;  
3.shell "ftp://ftp.jp.ibm.com/pub/software/internet/viavoice/ptocx.exe"
 インストール
shell CRDIR$("")+"\Pt97eng.exe" 
shell CRDIR$("")+"\Pt97vd07.exe" 
shell CRDIR$("")+"\SETUP\SETUP.EXE"
shell CRDIR$("")+"\ptocx.exe"
その保存場所の変更、保存する場所(I)が今どの場所になっているかが
解ればCRDIR$("")が定まりソフトでダウンロード&インストールが行えるので
はないかと考えています。何か方法がありましたら宜しくお願いいたします。

212nisii:2005/03/02(水) 15:43:52
IEに限定していいなら、最後に使ったダウンロード先は分かります。

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Download Directory

レジストリの操作例は、トップの記事に書いています。
http://www.geocities.jp/fbasic63/fbn005.htm

213F-BASIC愛好者:2005/03/02(水) 15:55:41
早々ご回答頂きましてお礼を申し上げます。
レジストリの操作例から最後に使ったダウンロード先が
HKEY_CURRENT・・・ Directoryから分かるとの事で
挑戦する事ができます。本当にありがとうございました。

214mgo:2005/03/02(水) 16:38:35
始めまして。いつもは自分で調べものをして解決してるのですが、
とうとう私にはどうにもできない壁にぶつかってしまいました。
さっそくその質問です(くだらなかったらどうしよう・・・)。
f-basicにおいてビットマップボタンを新規プロジェクトで使うにはどうすれば良いですか?
サンプルBのMCIフォルダにあるにはあるんですが、全然参考になりません。
どなたかご教示お願いします。

215nisii:2005/03/02(水) 18:27:28
プロジェクトにリソースファイル .rc を登録。

リソース…インポートでビットマップを登録。

あとは、フォーム上にビットマップボタンを貼り付け、
プロパティ上からビットマップボタン名を選択。

\Sample_B\BmpBtn も参考になるかと。

216mgo:2005/03/03(木) 14:05:43
なるほど・・・
だいたいわかりました。
ということは、ボタンを押したときに表示するbitmaapも用意しないといけない
と考えてよろしいでしょうか?

217nisii:2005/03/03(木) 15:51:22
>>216

「通常」「押す」を同じビットマップファイルにすることもできます。
押したときに大きく変化するのがいいかどうかは、お好みで。(笑)

218mgo:2005/03/03(木) 16:02:13
よくわかりました。
nisii様、丁寧にお答えいただきありがとうございました。

219F-BASIC愛好者:2005/03/05(土) 13:29:36
お世話になります。
>>211
ファイルのダウンロードにつきましてよろしくお願いいたします。
Windows98,2000で時々、例 shell "http://www-6.ibm.com/jp/voiceland/download/dl/PT97VD07.EXE&quot;
でファイルのダウンロードのダイアルログボックスが表示されますがダイアルログボックスが直ぐ消えることがあります。
タスクバーにもありませんでした。消えるのはどのような事が考えられますでしょうか。
ご存知の方がおりましたら、ご指導願えませんでしょうか。よろしくお願いいたします。

220F-BASIC愛好者:2005/03/07(月) 21:34:26
>>219
ハッキリした事は断定できていませんがウイルス対策ソフト
スパイウエアーの常駐ナシの状態で行っています。
現在の所ダイアルログボックスが消えるような事は発生していません。
FBASICは問題ないと思いました。お世話になりました。

221F-BASIC愛好者:2005/03/13(日) 13:41:36
度々、お世話になります。
初歩的な質問で申し訳ありません。
レジストリの使用につきまして宜しくお願いいたします。
記述に本ソフトは、レジストリ命令を使用していませんので、
システムを壊すような処理は行っておりませんとありました。
レジストリ命令の使用とはレジストリの値を書き換えと思っていますが。
ご指導頂きました>>211最後に使ったダウンロード先、IEのバージョンは
レジストリの値を読み込んでいます。レジストリの値を読み込むだけなら
レジストリ命令の使用に該当しないと思ってよいのでしょうか。また、
実行ファイル(拡張子が.exe)がレジストリを使用しているか、
使用してないか調べる方法はありますでしょうか。
もし、ありましたらご教授して頂ければと願います。宜しくお願いいたします。

222nisii:2005/03/14(月) 11:13:34
>レジストリの値を読み込むだけなら
>レジストリ命令の使用に該当しないと思ってよいのでしょうか。

「参照」でもレジストリを使用しています。
ユーザーに不安を与えたく無いなら「レジストリは変更しません」でいいでしょう。

>実行ファイル(拡張子が.exe)がレジストリを使用しているか、
>使用してないか調べる方法はありますでしょうか。

外から調べるのはまず無理で、作成者に問い合わせるのが一番確実です。

どうしても自力でということでれば、レジストリの監視ツールをなどを使って、
特定の操作をしたときの変化を頼りに推察するしかありません。

223F-BASIC愛好者:2005/03/14(月) 15:04:10
nisii さん
返信くださいまして、ありがとうございました。
レジストリ命令の使用について「レジストリは変更しません」は大変参考になりました。
お陰様でレジストリの監視ツールはレジストリ番犬ロンを検索で探して使用できました。
お礼を申し上げます。

224F-BASIC愛好者:2005/03/21(月) 14:53:01
お世話になります。
例・・・・ VAR www As string *32765
で32765部分の数値を定数(32765)として使用しています。
定数部分を可変できるようにしたいのですが。
ご存知の方がおりましたら、ご教授して頂ければと願います。
宜しくお願いいたします。

225nisii:2005/03/22(火) 14:50:15
工夫できてもこの程度かと。

#define MAX_STRING 32765
var WWW as string * MAX_STRING

226F-BASIC愛好者:2005/03/22(火) 17:07:00
nisii さん
度々、ご回答頂きまして、本当にありがとうございました。
(#define)方法で置換できる事が学べました。お礼を申し上げます。
新たな質問となりますが32765部分を変数にできればと思い、
下記の方法で行いましたが文法が正しくありませんとなります。
A=32765
#define MAX_STRING A
変数にする事はできないのかと思いました
もし変数にする方法がありましたら、ご教授して頂ければと願います。
よろしくお願いいたします。

227nisii:2005/03/22(火) 18:11:37
#define は定数の宣言です。
また、固定長の文字変数は長さを可変にできません。
できたら、固定長と呼びません。(笑)

構造から見ても、固定長の文字変数は実行ファイルの中に領域が確保されるため、
動的に長さを変えることは不可能です。

可変長の文字変数にすれば、用は足りると思います。
var WWW as string
WWW = space$( '長さを変数で指定' )

228F-BASIC愛好者:2005/03/22(火) 19:17:44
nisii さん
早々、ご回答を頂きましてありがとうございました。
初歩的な質問で申し訳ありませんでした。
お陰様で動作することができるようになりました。
ご指導して頂きまして本当にありがとうございました。
心よりお礼を申し上げます。
今後とも、よろしくお願い致します。

229ごむんご:2005/04/07(木) 07:57:04
ふと思ったので質問いたします。
f-basicに限ったことじゃないかもしれませんが、
ファイルを多重に開くメリットってなんでしょう。
システムクラッシュ時においてそれらのファイルが破壊させる危険が大きくなるだけかと
思うんですが皆様はどう思われます?
ちなみに私は一つ一つ順にopen、closeを繰り返してます。

230F橋:2005/04/07(木) 20:47:36
>>229
>ファイルを多重に開くメリットってなんでしょう。
同じファイルを別プログラムで開くのでしょうか?
それとも別々のファイルをたくさん開くのでしょうか?

同じファイルをいくつも開くのはサブルーチンの様に使う時はメリットになると思います
住所録の様なソフトを作ったとし、それの検索ソフトを作るとします
住所録のソフトから検索ソフトを起動する時に住所録でファイルをopenしたままでも
検索ソフトで再度openするとしますよね。無駄に見えますよね。
でも。検索ソフトだけ立ち上げたり出来ますよね?
あまりいい方法では無いかも知れませんが検索ソフトを呼ぶようなプログラムを作る時に
ファイルがopenしているかどうか。とかを考えずに使えるので楽は楽かと…

別々のファイルをたくさん開くのはレスポンスだと思います
登録ボタンを押した時に10〜20くらいのファイルに書き込まなければならない時…
それら全てをopen〜closeしていては反応が遅いのでopenしっぱなしもあるかと…

>ファイルが破壊させる危険が大きくなるだけかと
その通りです(笑
データベースを使っているのならば回避手段があったりしたはずですが…

231ごむんご:2005/04/08(金) 05:30:49
まず、きちんと状況を説明せずに質問したことをお許しください。
私としては、別々のファイルを一度に沢山開くという意味で書いたつもりでしたが、
同じファイルを別プログラムで開くというのは思いつきませんでした。


F橋様ご返答ありがとうございました。

232ニャン子:2005/04/09(土) 02:44:43
超〜・・・お久しぶりです。ニャン子です。

ごむんごさん>
> ファイルを多重に開くメリットってなんでしょう。

プログラムを作成する際の思想にもよりますのでOpen,Closeを繰り返す方法が
良い場合もあれば、それがかえってレスポンスを悪くする場合もあります。
これは私の場合ですが、データを保存する目的で使用する場合はファイルを使用
する直前にOpenし、ファイルへの読/書が終了した時点でCloseします。

しかし、プログラムによってはメモリの限界を超えてデータ量を扱う場合もあり
ます。その様な場合、ファイルをメモリの一部の様に扱う必要があり、その場合
はランダムファイルまたはバイナリファイルで随時アクセスする必要があります。
その様な場合はプログラム起動時に複数のテンポラリファイルをOpenし、プログ
ラムが終了するまでCloseは行わない場合もあります。

また、単にデータを蓄積する様な場合であってもOpen,Closeを繰り返すと
レスポンスに大きく影響する場合もあります。基本的にスタンドアロンであれば
Open,Closeを繰り返した方が安全かと思いますが、ネットワーク上でサーバと
クライアント間での通信を行う際にファイルのOpen,Closeを繰り返すとネット
ワークに大きな負担を与える事になります。通信以外にもRAIDを装備したマシン
でファイルのOpen,Closeを繰り返すと、それだけWAITが多く発生します。

その他、業務PGでは複数のファイルをMATCH, JOINなどにより一つのファイル
にまとめる場合があります。これらの場合は最低3つのファイルを同時にOPEN
しておかなければなりません。

という事で、Open,Closeを繰り返すメリットとデメリットはソフトを開発する際
の設計思想に依存すると思われます。

> システムクラッシュ時においてそれらのファイルが破壊させる危険が大きく
> なるだけかと思うんですが皆様はどう思われます?

これも設計思想に含まれますが、万が一クラッシュが発生した場合にどのレベル
までデータを復旧させる事が出来るのかを予め設計段階で決めておきます。
シーケンシャルファイルの場合はデータ書き込み時にクラッシュが発生した場合
データの破損は大きいと思いますが、ランダムファイルやバイナリファイルで
予め使用するデータの大きさを確保しておけばFATが壊れる事が殆どなくなり
ます。汎用機やオフコンなどではファイルを使用する領域を予め確保する必要が
ありますので、その仕組みを活用して予めファイルアロケートを行っておく事も
良いかと思います。

233F橋:2005/04/09(土) 17:00:32
>>231
>同じファイルを別プログラムで開くというのは思いつきませんでした。
私は同じファイルを別プログラムでどんどん開くというのが最近少なくないので(笑

>>232
>ファイルをメモリの一部の様に扱う必要があり、その場合はランダムファイルまたは
>バイナリファイルで随時アクセスする必要があります。
この部分が特に分かりやすいです
私が説明したかった事がこの一文で済んでる気がしました(笑

234ごむんご:2005/04/15(金) 06:50:39
ニャン子様、F橋様ご返答ありがとうございます。
視野が広がりました。
仮想メモリのような使い方があるなんて・・・!
本当にありがとうございました!

235ごむんご:2005/04/15(金) 19:55:38
ニャン子様F橋様先日はありがとうございました。

また質問させてください。
ニャン子様のfbhackとnisii様のフォルダ選択を組み合わせて使用してて
気づいたんです。
はじめにeditboxにkeydownイベントを追加して、その後でフォルダ指定ダイアログを
表示し、そこで特定の条件を満たすフォルダを指定すると
「続行不可能なエラーが発生しました」とでて強制終了してしまいます(9X系だとモジュール違反とでます)。

特定の条件というのは私が実験した限りだと
・フォルダ指定ダイアログを開くのが最初であること
・一番下の層のフォルダ名が半角14文字を超えた場合
です。
原因を探ってみましたがどうも
API_SHGETPATHFROMIDLISTとGetModuleFileNameの相性が悪いのかなぁって位しかわかりませんでした。
というのも、API_SHGETPATHFROMIDLISTを先に実行すると後のGetModuleFileNameでエラーが、
またGetModuleFileNameを先に実行すると、API_SHGETPATHFROMIDLISTのところでエラーが出てしまいます。
この二つのapiは同時に使用することはできないのでしょうか?

お世話になったばかりなのですが、よろしくお願いします。

236名無しさん:2005/04/17(日) 23:53:35
apiは得意では無いので・・私の経験談での話で申し訳ないですが・・

>この二つのapiは同時に使用することはできないのでしょうか?
これは無いと思います

>・フォルダ指定ダイアログを開くのが最初であること
これと似た症状を何度か経験しましたが。そのほとんどが私の場合はプログラムミスでした
API等に渡す変数のパラメータがあっていない可能性が高いと思います
特に文字列のbyte数が違う等が私の場合はほとんどでした

二つのAPIを使っているとの事なのですが。違う文字列長を定義しなければならないのに
その二つに同じ変数を使っていてどちらかの呼び出しが違うとかありませんか?

私はこういう症状になったときに適当な所に dummy1$=space$(1000) dummy2$=space$(1000) ・・・等を
色々な所にいくつか入れてます
これでエラーが出なくなった場合はまず間違いなく文字列のパラメータが違う場合
(API等に渡す文字列変数の文字長が違う場合)でした

もう一つ・・可能な限り小さくしたエラーの症状が出るサンプルソースをこちらに貼って頂けると
他の方からもレスしやすいかも知れません

237F-BASIC愛好者:2005/04/18(月) 23:29:20
お世話になります。
WIinXPで下記と同じ現象になりますでしょうか。
WIin98では下記の現象にはなりませんでした。
例えばC:\FBASICV63\Sample_B\Edit
sub NEW_ON()
*abc
goto *abc
end sub
ファイル(F)→新規作成(N)起動後、数秒後メニューバー部分をクリックしますと
メニューバー【ファイル(F)編集(E)表示(V)・・・】の記述の文字が消え白色になります。
記述の文字が消えるような同じ現象になりますでしょうか。
WAIT 中にクリックしても同じ現象になりました。
ご存知の方がおりましたらご指導お願い出来ればと思います。
宜しくお願い致します。

238nisii:2005/04/19(火) 18:49:15
>>237

イベントを抱えたまま待ったり長時間の処理をすると、
どうしてもそうなります。>>140
ウィンドウのリフレッシュなどは、イベントプロシージャから抜けた後に行われるため。

途中で待ちが発生する場合は、面倒でも「イベントの受け取り」と「処理」は分けましょう。

回避例(○イベントプロシージャ外で実行する解決例 を参照)
http://www.geocities.co.jp/SiliconValley-Sunnyvale/8635/fbn008.htm

239F-BASIC愛好者:2005/04/19(火) 23:49:20
nisii さん
ご回答くださいましてありがとうございました。
VBでも確かめてみましたが、同じ現象でしたので、OSが関係しているのではないかと
想像していました。nisii さんのイベントを抱えたまま待ったり長時間の処理をした場合、
ウィンドウのリフレッシュはできない。その為「イベントの受け取り」と「処理」は分ける
とのご説明は大変参考になり納得する事ができました。
また解決参照例 までご指導下さいまして本当にありがとうございました。
まだ十分に理解できていませんが自分なりにWin9Xはスタンドアロン単独OS
WinXPは連動OSによる為に現象が違っていたのかと理解しました。
今後とも、よろしくお願い致します。 心よりお礼を申し上げます。

240京都のI・T:2005/05/09(月) 02:16:59
名案が有ったら教えて下さい。
基本画面に別ウインドウ又はpicture画面を数枚貼り付けた状態で、各画面のマウスの現在座標を、
リアルタイムで同時に取得する方法はないでしょうか。現在は、各画面のイベントにより取得した座標と
表示位置を加減算するという原始的な方法を使用しています。アクティブでない(後に隠れている)画面
のマウス座標を取得したいのです。いい方法がありましたら教えて下さい。宜しくお願します。

241chigu:2005/05/25(水) 11:24:54
はじめまして。先月からF-BASICをはじめたchiguと申します!
このサイトにはいろいろとお世話になっています。
ファイルの保存について質問なんですが、
保存名に拡張子をつけなくてもファイル形式を固定する方法がないでしょうか?
(( 保存名:aaa , ファイル:aaa.TXT )っとなるような感じなんですが)
基本的な質問なのかもしれませんが、よろしくおねがいします。

242名無しさん:2005/05/26(木) 01:09:23
>>240
すいません。分かりません

>各画面のイベントにより取得した座標と表示位置を加減算するという原始的な方法を使用しています。
私もこの方法を使うと思います



>>241
>ファイルの保存について質問なんですが、
>(( 保存名:aaa , ファイル:aaa.TXT )っとなるような感じなんですが)

WINSAVEDLGを使ってます?
戻り値にファイル名変える様なので

L$ = "テキストファイル(*.TXT)"
F$ = WINSAVEDLG("ファイルの保存","3DG.BAS",FL$,0)
if F$ <> chr$(&H1B) then
'実際はリネームする前にPATHを分解する必要があります。
'また既に同名のファイルがあった場合に削除する処理も必要と思われます
IF RIGHT$(UCASE$(F$),4)><".TXT" THEN NAME F$ AS F$+".TXT"
endif

こんな形で後から慌ててリネームするという方法も無くは無いですが・・(笑

尚、私はWINSAVEDLGを使った事が無いのでご了承下さい
(WINSAVEDLGの引数で勝手に拡張子って付けてくれないんですよね?)
また、WINSAVEDLG以外でファイルの保存を考えている場合はどういう形なのかも教えてください

後は・・私以外のF-BASIC上級者からの返答をお待ち下さい(笑

243chigu:2005/05/26(木) 16:49:25
242>>
親切な回答ありがとうございます!!
説明不足でした(反省)。ご指摘の通りWINSAVEDLGを使っています。
早速試してみたのですが、「ファイル記述に誤りがあります」とエラーが出てしまいました。
ちなみに

L$ = "datファイル(*.dat)"
F$=WINSAVEDLG("新しい名前をつけて保存","main.dat",L$,0)
if F$<>chr$(&H1B) then
open F$ for create as #1
print #1
if right$(ucase$(F$),4)><".DAT" then name F$ as F$+".DAT"

end if

としてみたんですが(フォルダ名やドライブ名でFというものはないんですが)
なにが原因なんでしょう?

244nisii:2005/05/27(金) 11:29:11
name命令にドライブ名やフォルダ名を含めることはできません。

245名無しさん:2005/06/04(土) 08:43:38
>>241
固定ファイル名で保存するなら、
保存しますか(Y/N)
のダイアログで十分だと思いますが。

246F-BASIC愛好者:2005/06/09(木) 23:20:02
日頃から大変お世話になりまして、ありがとう御座います。
概要
自作F-BASICソフトから別ソフトを実行(SHELL)して、別ソフトのCHECKチェック
ボックスに当たる位置にマウスを移動(SETCURSORPOS)クリック(MOUSE_EVENT)に
よりチェックありに設定しています。そしてスタートに当たるBUTTON位置にマウスを
移動してクリックして起動しています。
質問
CHECK、BUTTONのハンドル(HWND&)は得る事は出来ています。
マウスを使用しないでSendMessage(HWND&,・・・・・・・・・)でチェックボックス
にチェックありに設定、及びスタートBUTTONを起動出来ないものかと思っていますが、
記述方法が解りません。ご存知の方がおりましたら、ご指導して頂ければと願います。
宜しくお願い致します。

247F-BASIC愛好者:2005/06/11(土) 19:11:49
日頃からお世話になります。
SendMessage メッセージのメンバをインターネット
で検索してなんとか解決することができました。

248F橋:2005/06/12(日) 01:12:59
>>243
>早速試してみたのですが、「ファイル記述に誤りがあります」とエラーが出てしまいました。

name命令の1つ目のパラメータにフォルダを指定する事は出来ますが
2つ目のパラメータにフォルダを指定する事は出来ません

>if right$(ucase$(F$),4)><".DAT" then name F$ as F$+".DAT"
F$の内容が"c:\windows\aaaa.tmp" とします

name "c:\windows\aaaa.tmp", "c:\windows\aaaa.dat" はエラーですが
name "c:\windows\aaaa.tmp", "aaaa.dat" なら可能です

>if right$(ucase$(F$),4)><".DAT" then name F$ as F$+".DAT"
この例では F$ の変数をフォルダ名、ドライブ名に分ける必要がありますね
パス名やドライブ名を分けるのは SPLITPATH命令を使ってみてください


>>246
分かりません。と書こうと思ったですが・・>>247で既に自己解決されていて助かりました(笑

249chigu:2005/06/13(月) 10:59:10
>>245 , >>248
回答ありがとうございます!
もうできないものと思いあきらめていましたが、これで何とかなりそうです。
また質問することがあると思いますが、その時はよろしくお願いします。

250F-BASIC愛好者:2005/06/13(月) 19:21:23
お世話になります。
WindowsフォルダおよびSystemフォルダ(GetWindowsDirectory、GetSystemDirectory)
のパスを取得することは可能ですが、キャプション又はハンドルのパス取得は可能で
しょうか。もし可能でありましたら、ご指導して頂けませんでしょうか。
よろしくお願いいたします。

251nisii:2005/06/13(月) 21:50:58
>>250
http://www.geocities.co.jp/SiliconValley-Sunnyvale/8635/api17.txt

ただし、WindowsME/98/95では、フルパスのモジュール名が返り、
WindowsXP/2000(NT4.0不可)では、モジュール名のみが返ります。

252nisii:2005/06/13(月) 22:38:25
>>250
http://www.winapi-database.com/Program/Library/GetModuleHandle.html

実行モジュールのハンドルを得て、
>>250のGetModuleFileNameでフルパス名が得られるかも。
でも未確認なので動かなかったらゴメン。

253F-BASIC愛好者:2005/06/13(月) 23:34:32
nisii さん
幾度にも渡りまして、ご回答下さいましてありがとうございました。
提供頂きましたapi17.txt(関数GetModuleFileNameからフルパス名が得られました。)
まだ完成はしていませんがWinXPでは文字化けがありましたがWin98では問題ありませんでした。
従いましてGetModuleFileNameからパス名が得られる確認ができました。
いつも早々と、ご回答頂きまして感謝しております。本当にありがとうございました。

254F-BASIC愛好者:2005/06/13(月) 23:52:13
>>253のWinXPで文字化けが一度ありましたが再度行いましたら
正常にフルパス名が得られ問題はありませんでした。

255F-BASIC愛好者:2005/06/15(水) 15:25:56
度々、お世話になります。
下記のウィンドウハンドルからアイコン取得の記述がありました。
hicon = HICON(SendMessage(hwnd, WM_GETICON, TRUE, NULL));
C言語と思われますが、HICONにつきましてVB又はF-BASICでそれに
変わる記述方法はありますでしょうか。
ご存知の方がおりましたら、ご指導を願えればと思います。
よろしくお願い致します。

256F-BASIC愛好者:2005/06/24(金) 21:43:31
お世話になっています。
>>255ウィンドウハンドルからアイコン取得が、やっとの思いで解決できました。
参考:関数DrawIcon、GetClassLongから取得しました。
今後ともよろしくお願い致します。

257F-BASIC愛好者:2005/06/26(日) 16:30:49
度々、申し訳ありません。
F−BASIC掲示板ですが、VBにつきまして投稿しました。
VBは、初心者ですのでよろしくお願いいたします。
>>250
ご指導していただきました下記のソース
http://www.geocities.co.jp/SiliconValley-Sunnyvale/8635/api17.txt
をF−BASICで問題なく使用させて頂いています。お礼を申し上げます。
ソースをVBに置き換えていますが、自分なりに色々と試してみましたが
解決できませんでした。

概要
resulttext.txtファイルでは
F−BASICでは全てのHWND ProcessID パスがresulttext.txtファイルに
表示されます。VBではresulttext.txtファイルの内容が
----------------------------------------------
実行モジュールは C:\WINDOWS\デスクトップ\API17.EXE
"",   
----------------------------------------------
のみでHWND等 が作成されません。
F−BASICとVBの違いを見比べてみました。
---------------------------------------------------------------
' (ウィンドウの検索を自分自身から開始することとし、そのハンドルを取得する)
HCURRENTHWND = API_GETWINDOW(GETHWND, GW_HWNDFIRST)
---------------------------------------------------------------
GETHWNDの中身はF−BASICではハンドルは取得されます。VBでは”0”でした。)

'------------------------------------------------------------
' サブプロシージャ
'------------------------------------------------------------
' ウィンドウハンドルから、これをオープンしたモジュール名を得る
sub GETMODULEPATH( byval HWND& , MODULEPATH$ )

'------------------------------------------------------------
' サブプロシージャ宣言
'------------------------------------------------------------
' ウィンドウハンドルから、これをオープンしたモジュール名を得る
declare sub GETMODULEPATH( byval HWND& , MODULEPATH$ )

ステップでみましたらサブプロシージャには飛んできました。
サブプロシージャ宣言では記述エラーになりました。
F−BASICとVBとではサブプロシージャの記述に違いはありますでしょうか。
違いがありご存じの方がおりましたらVBの記述方法を教えて頂ければと願います。
初心者ですので基本的な事がよくわからないで質問していましたら、
申し訳ありませんでした。よろしくお願い致します。

258nisii:2005/06/28(火) 11:24:39
>>257

手元のVB本では、Me.hWndで自分のウィンドウハンドルを得てるみたい。

259F-BASIC愛好者:2005/06/28(火) 14:50:21
nisii 様
>>258
ご回答下さいましてありがとうございました。
お陰様で問題なく動作するようになりました。
自分のウィンドウハンドルはForm1.hWndにしました。
度重なるご回答を頂きまして本当にありがとうございました。

260k5:2005/08/09(火) 11:16:15
HP iPAQ hx2400を手に入れました。
このPCでF-BAISCで作成したアプリを動かしたいのですが、可能でしょうか?

261F橋:2005/08/09(火) 20:35:33
>>260
OSがWindowsMobile2003の様ですので動かないと思います
(F-BASICの対象はWindows95 98 98se ME NT 2000。XPは保証外ですが何とか動く)

ただ。私がWindowsCEとかMobileとかは一切触った事が無いので分かりません
CEとかMobileってWindows3.1の流れなんでしょうか?
だとすればF-BASIC95にWindows3.1版が同梱されているのでそれが動くかも知れませんが…

262nisii:2005/08/10(水) 15:53:14
http://www.microsoft.com/japan/windowsmobile/developer/technicalarticles/default.asp
http://www.microsoft.com/japan/windowsmobile/pocketpc/techpapers/techguide/default.asp

基本的にはWin32アプリケーションとして開発できるようですが、
Unicodeが標準であるとか、APIが必ずしも共通でない点などから、
動作は難しいかも。

…もし動いたら、こんな作り方で動いたって報告をいただけると嬉しいです。

263F-BASICの初心者:2005/08/22(月) 22:41:27
初めまして。F-BASICの初心者で、自分の手に負えないので
こちらに質問させてもらいました。
仕事でF-BASICを使ってデータの計測をしています。
RS232Cでパソコン1台と複数台の計測器をつないでデータを計測
しているのですが、データを送受信しているときに
不定期で固まってしまいます。
PCはOSがWin2000でF-BASIC6.3です
(6.3は最新版にアップデートしてます)
ちなみに以前は性能が半分ぐらいのPCで
OSがWin95、F-BASIC6.0で上記と同じように
PCと計測器をつないでデータ計測していたのですが
その時は何の問題もなく何十時間も動いていました。
OSの種類&F-BASICのバージョンによってデータの送受信中に
固まってしまう原因があるのでしょうか?
自分では解決の糸口すらわからないので
どんなアドバイスでも歓迎です。
よろしくお願いします。

264F橋:2005/08/22(月) 23:01:19
>>263
分かりません(おい(笑

私はWindows2000でRS232Cを使っているのはバーコードスキャナ(2400bps〜9600bps)で
1日中使ってもその様な問題は発生しませんでした
>>263さんの常時RS232Cで送受信よりは頻度が少ないのでうまく行っているかも知れません

無難な返答しか出来ませんが…
ボーレートを含むRS232C設定があっているか。そのRS232Cは他で使っていないか。
(モデムを使っていないか)等を確認してみて下さい

他のソフトが勝手にRS232C設定を変える場合やポートを勝手に変える場合があった気がします
Windows2000のみで他のソフトが何も入っていない状態。(モデム含む)RS232C使うだろう機器を
外した状態でテストしてみて下さい

265F-BASICの初心者:2005/08/24(水) 23:14:45
早速お答えいただきありがとうございます。
ボーレートを含むRS232C設定はあってない場合
全く動かなくなる場合が多いので、おそらく設定は
あっていると思います。

他のソフトが勝手にRS232C設定を変える場合やポートを勝手に変える場合
があるのですか。参考になります。
PCはノートパソコンで、RS232Cの差込口?が一つしかないので、
その他のRS232Cを使う機器は接続されていないと思います。
会社のPCなので他のソフトが何も入っていない状態に
するのは難しいと思います^_^;
アドバイスありがとうございました。

266シマヅ:2005/08/29(月) 17:31:49
F-BASICの初心者様
参考になるかどうか分かりませんが、私の経験を記述します。
制御する機器にデータを送り、直ぐに機器から送られて来るデータを受取るようにした時に、機器とのタイミングの関係かと思いますが、「F-BASICの初心者」さんと同じ事が起きた記憶があります。
私の場合は、機器にデータを送る行で、For〜Nextで囲いデータを【For a=0 to 2 (Open 〜「データ送信行」〜 close) next a】を追加して数回データを送るようにしたら安定したことがありました。
解決にならないかも知れませんが、ご参考まで。(もっとベストの解決方法があるかとも思います)

267名無しさん:2005/08/30(火) 13:53:02
CSVファイルを読みたいのですが、項目数が多いと「1行の文字数が255文字を
超えています」というメッセージが出ます。

Input #FILENUM,A1&,A2$,B1$,B2&,   〜  ,K1,K2,K3,K3,K5

この場合、どうすればよいのでしょうか。

268nisii:2005/08/30(火) 15:31:12
>>267

読み込みを2回(以上)に分ければOKですよ。

Input #FILENUM,A1&,A2$,B1$,B2&…
Input #FILENUM,K1,K2,K3,K3,K5…

269名無しさん:2005/08/30(火) 20:56:59
>>268

できました。ありがとうございました。

270F-BASIC愛好者:2005/08/31(水) 08:54:41
お世話になります。
ホームページ画面が複数の枠(フレーム)で構成されているかそうでないかを
調べたいのですが調べる方法はありますでしょうか。ご存知の方がおりましたら、
ご教授して頂ければと願います。宜しくお願い致します。

271DOSD:2005/08/31(水) 23:44:58
FRAMEタグがあるかどうかを探せばいいと思いますが…
テキスト中に <FRAME> という文字列を探しあればフレームと判断で如何でしょう?

ただし厳密には<FRAME>という単語が文中で使われている可能性もあると思いますので
100%の判断は難しいと思いますが…

100%判断したいのなら以下の様な条件判断が必要と思われます
<FRAME>タグが入っているかどうか(<FRAME>という文字列がテキスト中にあるかどうか)
その<FRAME>タグはコメントになっていないか
( <!--- <FRAME> ---> は BASICで言う REM文(コメント)と同じ)
その<FRAME>はタグが有効な所に入っているか
(タグを忘れましたが。このタグからこのタグまではタグとせずそのまま表示。というのがあります)

272F-BASIC愛好者:2005/09/01(木) 06:35:58
DOSDさん
早々、ご返信下さいましてありがとうございました。
まだ、実行はまだ出来ていませんがテキスト中の<FRAME>タグを
探してフレームを判断する方法は大変参考になりました。
詳細な説明をして頂きましてお礼を申しあげます。
今後とも、よろしくお願い致します。

273F-BASIC愛好者:2005/09/01(木) 08:36:02
>>271の、ご指導して頂いた事によりまして下記の事が理解できました。
<FRAMESET>はウィンドウをいくつかのフレームに分割する際に使用していました。
ソースを取得してFRAMESETのタグが記述に含まれているかにより複数の枠(フレーム)
で構成されているかそうでないか調べたいとのですがwebのソース取得方法が分かりません。
ソース取得方法で、ご存知の方がおりましたらご指導願えればと願います。宜しくお願い致します。

274F-BASIC愛好者:2005/09/01(木) 09:01:46
度々申し訳ありません。
webのソース取得方法は解決することができました。
以前使用したことを思いだしました。
サンプルSample_I のHttpgetに使用例としてあります。
大変お世話になりました。ありがとうございました。

275F-BASIC愛好者:2005/09/01(木) 14:19:31
再度、お世話になります。
webをタグにできるサンプルがありましたので一部手を加えました。
-------------------------------------------------------------------
Private Sub Command1_Click()
Dim ObjIE As Object
Dim myHTML As String
Dim iFileNo As Integer
Label1 = "なし"

Set ObjIE = CreateObject("InternetExplorer.Application")
With ObjIE
.Visible = False
.navigate "http://www3.nhk.or.jp/hensei/fm/20050901/frame_12-18.html&quot;
While .Busy Or .ReadyState <> 4
DoEvents
Wend
myHTML = .Document.body.innerHTML
End With

Text1 = myHTML
If InStr(Text1, "FRAMESET") <> 0 Then Label1 = "あり"
End Sub
--------------------------------------------------------------------
vbにつきましてはDim→Ver変換及びvb、F-BASIC共通についての知識しかない初心者です。
上記のvbサンプルをF-BASICに置き換えれればと思っていますが可能でしょうか。
ご存知の方がおりましたらご指導して頂ければと思います。宜しくお願い致します。

276F-BASIC愛好者:2005/09/01(木) 21:23:33
何度にも渡りまして本当に申し訳ありません。
>>275が解決できました。 下記のURLより
タグ表示ができるサンプルプログラムがありました。
http://tokovalue.hp.infoseek.co.jp/index.htm
■URLダウンロードとキャッシュファイル削除
お陰様で希望するものが得られました。
ありがとうございました。お礼を申しあげます。

277DOSD:2005/09/01(木) 22:22:00
>>272-275
色々あったみたいですが解決されたみたいですね…お疲れさまです
解決されたのなら不要とは思いますが…
FRAMESETの文字列があるかどうかの判断は下記の様な感じかと…

HTTPGET ID, "http://www.yahoo.co.jp/index.html&quot;, "index.html"

open "index.html" for input as #1
frameflg%=0
while not eof(1)
 line input #1, lbuf$
 if instr(lbuf$,"FRAMESET")>0 then frameflg%=1
wend

if flameflg%=1 then print "FRAMESET文字列あります(=フレームのサイトだと思う)"

注意1:internet.biのインクルードや internetstgart(end), httpopen(close)等省略してます
注意2:読み込んだファイルはCR+LFが前提です。LFのみならうまく動かないはず…

何かミスがあればnisiiさんやニャン子さんがツッコミいれてくれるかと…(おい

ともかく。F-BASIC愛好者様。お疲れさまでした!

278F-BASIC愛好者:2005/09/01(木) 23:25:57
DOSDさん
幾度に渡りまして、ご指導下さいましてありがとうございました。
ご指導して頂きましたFRAMEタグがあるかどうかを探す詳細な
説明をして頂いた事により解決する事ができました。まだ完全ではありません。
>>277
FRAMESETの文字列があるかどうかの判断で動作したいと思います。
お陰様で前進する事ができました。大変お世話になり本当にありがとうございました。
心より厚くお礼を申し上げます。

279F-BASIC愛好者:2005/09/02(金) 04:54:27
度重なり、大変お世話になりました。
>>271,>>277 貴重な情報を提供下さいまして自分なりに満足できるものができました。
もう一点、下記の件につきまして連続質問させて頂きました。

(IEのURL)ホームページアドレスの取得につきまして
例: アドレス(D)  → http://www.msn.co.jp/ が表示されていた場合に、
IEのハンドル【IE_HWND = API_FINDWINDOW("IEFrame",byval 0) 】から
http://www.msn.co.jp/ を取得できればと思っていますが、
ホームページアドレスの取得は可能でしょうか。
ホームページアドレスの取得につきまして、ご存知の方がおりましたら、
ご指導して頂ければと願います。宜しくお願いいたします。

280F-BASIC愛好者:2005/09/03(土) 11:18:11
>>279部分の一部訂正を致しました。現在開いているIEのアドレス取得につきまして

訂正前 → ホームページアドレス http://www.msn.co.jp/ を取得できればと
                 ↓
訂正後 → ホームページアドレス http://www.msn.co.jp/ の記述文字が取得できればと

281TOKO:2005/09/03(土) 17:37:53
ご無沙汰しております^^;)
ホームページアドレスの文字列取得について「IEのアドレス欄にある文字列取得」
に、UPしてみました。希望通りのものかはわかりませんが、こういった方法もある
ということで・・・

282F-BASIC愛好者:2005/09/03(土) 18:44:33
TOKOさん
こちらこそご無沙汰しております。
以前から幾度もお世話になり今回も
ご回答投稿下さいましてありがとうございました。
早速「IEのアドレス欄にある文字列取得」を行いました。
自分が希望するものでした。お礼を申しあげます。
VBでもサンプルを色々検索してみましたが検索に至りませんでした。
自分が思いますには今後、IEのアドレス欄にある文字列取得は
その他にも利用できるのではないかと思いました。
本当にありがとうございました。今後も宜しくお願い致します。

284F-BASIC愛好者:2005/09/13(火) 09:53:34
お世話になります。
VBで申し訳ありませんが、Timer イベント の時間につきまして
Timer1.Interval = 65000 設定された時間が経過するたびに発生しています。
65000(65秒)までは問題ありませんが66000(66秒)に設定しますと
【実行時エラー '380'プロパティの値が不正です。】のエラーになります。
設定時間を66秒→24時間でも設定出来る方法はありますでしょうか。
ご存知の方がおりましたら、ご指導をお願いできませんでしょうか。
よろしくお願い致します。

285nisii:2005/09/13(火) 11:37:47
TimerのInterval制限です。
タイマイベント内に静的変数を置いて、24時間をカウントしましょう。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbconlimitationsoftimercontrolsintervalproperty.asp

ただ上の方法は、負荷や他のソフトの影響によって、数分〜数時間もの遅れが出ることがあります。
開始時のシステム時間を保持し、時々現在のシステム時間と見比べるようにすれば、
タイマの間隔やCPU負荷に関係なく、ほぼ正確に24時間を判定できますよね。

286F-BASIC愛好者:2005/09/13(火) 12:29:09
nisiiさん
日頃から大変お世話になります。
開始時の時間を保持し、時々現在の時間と見比べる方法は
全く気がつきませんでした。
早々ご回答ありごとうございました。

287F-BASIC愛好者:2005/09/15(木) 15:19:30
お世話になります。
タイマイベントにつきまして、>>285を参考にさせてもらいました。
入力したタイマの間隔時間(時、分、秒)単位と開始時のシステム時間を保持し、
入力したタイマの間隔時間と開始時のシステム時間を加算します。
加算した時間は次のイベント発生としました。
例:
入力したタイマの間隔時間(5分)に設定
開始時のシステム時間(10時00分10秒)
加算した時間から5分毎にイベント発生します。 
10時05分10秒、10時10分10秒、10時15分10秒・・・・・

簡単な要点を記述しました。

Timer1.Interval = 1000

Private Sub Timer1_Timer()

If 加算した時間 = システム時間 Then
  If hWndIE <> 0 Then Ret = PostMessage(hWndIE, &H111, &HA220, 0) 'IE更新
End Sub

If 加算した時間 = システム時間 ・・・で変化するシステム時間と見比べるようにています。
WindowsXP・・・100回に1回、Windows98,95・・・5回に1回の割合で一致しません。
その為、検索エンジンで参考例を検索しましたが見つけ出すことができませんでした。
その点で、ご存知の方がおりましたら、ご指導願えませんでしょうか。また、
秒単位の参考例はありましたが、時、分のタイマ間隔に関しては見つけだす事ができませんでした。
時、分のタイマ間隔の参考例がありましたら、教えて頂けませんでしょうか。
よろしくお願いいたします。

288F-BASIC愛好者:2005/09/15(木) 16:40:37
お世話になります。
>>285タイマイベントにつきまして、
Timer1.Interval = 1000を
Timer1.Interval = 10に設定しましたら
今の所一致しています。
はっきりした事は分かりませんが、
良くなったような気がします。
少し様子を見て行きたいと思います。

289F-BASIC愛好者:2005/09/15(木) 16:44:09
申し訳ありません。
>>288に於いて訂正がありました。
訂正 >>285 → >>287

290DOSD:2005/09/15(木) 22:28:52
タイマー関数をあまり知らない私が横から申し訳ないのですが
タイマーは取りこぼしがたまにあると記憶しておりますが…

5分に1回何かを実行ならタイマーで5分間をカウントするのでは無く
タイマーで何秒に1回時間(TIME$)を確認し該当時間以上になったら実行
の様な処理にした方がいいかも知れません

該当時間以上というのは…

>10時05分10秒
IF TIME$="10:05:10" … では無く
IF TIME$>="10:05:10" … にした方がよろしいかと…
(パソコンの処理速度不足で "10:05:10"を拾えず "10:05:11"の時に実行出来る用にする為)

TIME$では無いのですがMILLITIMEを使って行ってみてます
(MILLITIMEは日付変わると0に戻りますのでご注意を)

ISTART=INT(MILLITIME/1000)
IEXECTIME=ISTART+(60*5)

WHILE 1
 IF IEXECTIME>=INT(MILLITIME/1000) THEN
 ' ↑IEXECTIME=INT(MILLITIME/1000) では無いのを確認して下さい
  '(60*5)秒に1回行う処理をここへ
  IEXECTIME=IEXECTIME+(60*5)
 ENDIF
WEND

-----
タイマーを使うのなら1秒に設定し…

NXTIME$="10:05:10"
'↑実際にはTIME$から5分後を作るルーチンが必要です

Private Sub Timer1_Timer()

IF NXTIME$>=TIME$ THEN
  If hWndIE <> 0 Then Ret = PostMessage(hWndIE, &H111, &HA220, 0) 'IE更新

'// 次に実行する時間(NXTIME$)の更新の処理 //
NXTIME$="10:10:10"
'↑実際にはNXTIME$に5分後をプラスするルーチンが必要です

End Sub


nisiiさんが紹介していたMSのサイトより…
>間隔が厳密に時間どおりに経過することは保証されていません。
>正確さを保つには、内部で蓄積された時間を追跡する代わりに、
>必要に応じてシステム時計をチェックします。

私には「時間通りは無保証です。システム時計でチェックして下さい」に見えます(笑

291F-BASIC愛好者:2005/09/15(木) 23:17:13
DOSD様
ご返信下さいましてありがとうございます。
先日は大変お世話になりました。
自分はまだ初心者ですので検索情報を参考にしながら
覚えています。Timer1.Interval の定数を 1000から
10にしましたら今の所落ち着いています。
ご指導下さいました
TIME$="10:05:10"をTIME$>="10:05:10" にする方法は
気が付きませんでした。"="を">="にすることで一度のチャンスを
広げる事ができますのでより安定できますので活用させてもらいます。
タイマの間隔時間(5分)をシステム時計に加算しながらループしています。
間隔が厳密に時間どおりに保証されていませんとのことで少し安心しました。
大変貴重な情報を提供下さいまして心より厚くお礼を申し上げます。

292F-BASIC愛好者:2005/09/15(木) 23:57:09
DOSD様
重ねてお礼を申し上げます。
時間で"23:59:59"から"00:00:00"に切り変わりますと
一致できなくなり調べていました。提供下さいました
"="を">="に入れ替えますと一致するようになりました。
お陰様でより安定したものができました。
ご指導がなければ簡単にはいかなかったと思っています。
本当にありがとうございました。今後とも宜しくお願い致します。

293DOSD:2005/09/16(金) 00:29:35
お役に立った様で嬉しいです

>時間で"23:59:59"から"00:00:00"に切り変わりますと
日付が変わると少し面倒ですよね…
確かWindowsが起動してからの時間を簡単に取得する方法があったはずです
(Windowsが起動して何秒経過しているかを得る関数?方法?があったはず)
それを使えば日付を気にせずに出来るので(日付をまたぐのなら)お勧めします

話し変わりますがWindows95系が連続で動くのは確か40日と少ししか動かなかった気が…
もしずっと動かしっぱなしの用途で使われるのならばNT系上で動かすのをお勧めします
(毎日…もしくは数日に一度電源入れ直すのならWindows95系でも問題無いかと…)

>今後とも宜しくお願い致します。
イベント処理はF-BASIC愛好者さんのが私よりスキル高いかと思います
イベント処理で私が悩んでいる時は是非ご指導お願いします

294F-BASIC愛好者:2005/09/16(金) 00:55:40
DOSDさん
わざわざ、ご返信くださいましてありがとうございました。
全般的には詳しくありませんが、もし私が分かり
ましたら、是非、返信したいと思っています。
こちらこそ宜しくお願いいたします。

295F-BASIC愛好者:2005/09/17(土) 19:17:00
お世話になります。
基本的な事が理解できていませんので
何度もVBの質問をして申し訳ありません。
宜しくお願い致します。
--------------------------
Private Sub Timer1_Timer()
Labe1 = GetActiveWindow
 Exit Sub
---------------------------
アクティブを別のフォームに移しますとLabe1が
0表示になります。自分自身のフォームにアクティブを移しますと
ハンドルが取得できます。別のフォームではなぜLabe1が0表示になるのか
分かりません。ご存知の方がおりましたら教えて頂けませんでしょうか。

296F-BASIC愛好者:2005/09/17(土) 20:13:26
お陰様で希望の関数を探すことで解決する事ができましたきました。
現在アクティブになっているウィンドウハンドルの取得
--------------------------
Private Sub Timer1_Timer()
Labe1 = GetForegroundWindow
 Exit Sub
---------------------------
初心者質問で本当に申し訳ありませんでした。

297Hauz_vapor:2005/10/26(水) 00:24:40
はじめまして。
当方、高校のPC部部員でして、
過去の先輩達のF-BASIC作品のソースプログラムを見つけたので、
それを何とか動作させたいと考えております。

しかし、F-BASIC自体が既に無い状態なので、
プログラムソースを別のBASICに移植することにしたのですが、
カラーコードが分からず再現に困っています。

0から15までの指定色を、RGB値で教えてもらえませんか?
無理でしたら色名だけでも…

それともう一つ訊きたい事を。
color@(a1,b1)-(a2,b2),c
という命令の意味は何なのでしょうか?

またここでちょくちょくお尋ねすることになるかもしれませんが、
是非ともよろしくお願いします。

298nisii:2005/10/26(水) 17:57:18
>>297

以下は、F-BASIC V6.3ヘルプの抜粋です。

-----------------------------------------
カラーコード(テキストカラー)
-----------------------------------------
0黒
1青
2赤
3紫
4緑
5水色
6黄色
7白
8黒(反転)
9青(反転)
10赤(反転)
11紫(反転)
12緑(反転)
13水色(反転)
14黄色(反転)
15白(反転)


-----------------------------------------
パレットコード(グラフィック画面の描画色や背景色)
-----------------------------------------
0黒
1灰色
2青(低)
3青(高)
4赤(低)
5赤(高)
6紫(低)
7紫(高)
8緑(低)
9緑(高)
10水色(低)
11水色(高)
12黄色(低)
13黄色(高)
14白(低)
15白(高)


-----------------------------------------
COLOR@
-----------------------------------------
指定された座標の2点を結んだ線を対角線とする四角形中に表示されている文字の色や機能を設定します。

形式

COLOR@ (x1, y1)-(x2, y2)[, [表示色] [, アトリビュート] ]

引数
・<(x1, y1)-(x2, y2)>

操作対象となる領域の四角形の対角線の始点と終点を、キャラクタ座標で指定します。
(x1, y1)が始点、(x2, y2)が終点となります。

・<表示色>

表示されている文字に設定する色をカラーコードで指定します。

省略された場合は、直前に実行されたCOLOR命令で指定されたテキストカラーが適用されます。

・<アトリビュート>

表示されている文字に設定する機能を指定します。
省略された場合は、直前に実行されたCOLOR命令で指定されたアトリビュートが適用されます。

コード意味

0低輝度で表示します。
1低輝度で反転表示します。
4通常輝度で表示します。
5通常輝度で反転表示します。

補足

・<表示色> に0を指定した場合、輝度によって表示される色は次のようになります。

通常輝度‥‥黒
低輝度‥‥‥灰色

・COLOR@命令は、すでに表示されている文字などに対して有効です。指定した四角形の中に新たに文字を表示しても、この命令の影響は受けません。

299Hauz_vapor:2005/10/26(水) 20:56:07
nisii様、迅速なレスをありがとうございます。
反転表示というのがよく分からないのですが、
これは背景色が文字色で表示され、文字色が背景色になる、
テキスト選択時のような色になる指定色と考えてよろしいですか?

また、F-BASICでは標準の背景は黒地なのでしょうか?

300puff_puff:2005/10/27(木) 23:05:27
Hauz_vapor さん、初めまして。

F−basicの標準は、黒なのかもしれませんが、
メニューのファイルー新規作成で、リソース(rc)を選ぶと、
とりあえず1枚目のウインドウが作成されます。
それは、白背景になりますが、そのウインドウを右クリックして
プロパティを選択し、「表示内容」の部分のカラーを選択すると、
バックグラウンドカラーが選択できます。
そこで白のところをクリックすれば、好きな色が
(といっても少ししかないですけど)選べますよ。
なお、リソースファイルを作らずにプログラムを組むと、
黒のバックのウインドウにテキストなどが表示されます。

それから、反転表示というのは、お察しの通りだとおもいます。

301Hauz_vapor:2005/10/28(金) 07:06:35
>リソースファイルを作らずにプログラムを組むと、
>黒のバックのウインドウにテキストなどが表示されます。
なるほど、リソース作成の有無ですか…
プロンプト画面は黒背景で、リソースウィンドウは白画面(標準)、
ということですね。

puff_puff様、ご回答ありがとうございました。

302シマヅ:2005/10/28(金) 22:55:04
■exeファイルを「スタート」ボタンにドロップしてショートカットを置き、スタートボタンからそのショートカットで起動するとエラー発生してしまいます、改善方法がありましたら教えて頂きたくお願いします。

「むだい」さんのホームページにある「カレントフォルダの取得(API)」を利用させて頂き下記のようなプログラムにしましたが、標記のようなエラーを発生してしまいます。
◆エラー発生してしまうプログラム(メイン部分のみ)
-------------------------------------------------
DT$=PATHNAME+"\ABC.dat"【←「PATHNAME」は「むだい」さんのサンプルのまま利用させて頂いています】
open DT$ for input as #1
   input #1,XTZ$
 close #1
-------------------------------------------------
◆実行時エラー発生表示内容→「○○.bas エラー[63]指定のファイルが見つかりません」

OSはWindowsXP Home edition です。(他のOSは未確認です)
コンパイルした「exe」ファイルを直接起動した場合やディスクトップにショートカットを置いて、更にそのショートカットを「スタートボタン」にドロップして、ショートカットを作った場合はエラー発生しません。
もし、既に同じトラブルの解決方法が記載されているホームページなどありましたら、教えて頂ければ幸いです。
よろしくお願い致します。

303TOKO:2005/10/29(土) 20:36:59
>>exeファイルを「スタート」ボタンにドロップしてショートカットを置き
WindowsXPにおいて、この方法はファイルの複写でありショートカットは作成されないよ
うです。

「カレントディレクトリと自exeフォルダは必ずしも同じではない」ようですので
DT$ = PATHNAME & "\ABC.dat"の後にprint DT$の1行を追加して検証してみました。

WindowsXPにおいて、
1)exeファイルを直接「スタートメニュー」へドラッグ&ドロップした場合、
DT$ → C:\Documents and Settings\hoge\ABC.dat
故に「○○.bas エラー[63]指定のファイルが見つかりません」が表示されるのでしょう。

2)「ショートカットの作成」でできた○○.exeへのショートカット.lnkを「スタートメ
ニュー」へドラッグ&ドロップした場合は、
DT$ → C:\TEST\ABC.dat

Windows2000およびWindows98においては、上記1)、2)共に
DT$ → C:\TEST\ABC.dat

WindowsXP、Windows2000において、デスクトップにTEST.EXEをへドラッグ&ドロップした場合、
 DT$ → C:\Documents and Settings\hoge\デスクトップ\ABC.dat
故に「○○.bas エラー[63]指定のファイルが見つかりません」が表示されます。

Windows98においては、
 どちらの方法をとっても、ショートカットが作成されるのでエラーはでない

GetCurrentDirectoriの代わりにCRDIR$("")を使っても全く同じ結果です。

304TOKO:2005/10/29(土) 20:40:40
訂正(^^;
GetCurrentDirectori → GetCurrentDirectory

305シマヅ:2005/10/29(土) 22:08:08
■TOKO 様
 早速の回答を頂き有難う御座います。
>>WindowsXP、Windows2000において、デスクトップにTEST.EXEをへドラッグ&ドロップした場合、DT$ → C:\Documents and Settings\hoge\デスクトップ\ABC.dat

 了解しました。う〜ん、そうですか。すると今回の事例を解決するには、WindowsXP用を考慮したプログラミングをしないといけないようですね。大変参考になりました。どうも有難う御座いました。今後ともよろしくお願い致します。

306nisii:2005/10/31(月) 12:06:55
>>305

' ロードされている実行モジュールのフルパス名を得る
http://www.geocities.co.jp/SiliconValley-Sunnyvale/8635/api17.txt

を参照してください。
呼び出され方や環境にかかわらず、自分のフルパス名が得られます。

307シマヅ:2005/10/31(月) 22:37:42
■nisii 様
 解決しました。
 教えて頂いたプログラムのうち不要そうな部分(ウインドウを列挙するなど)を除いて、自作のプログラムに追加して動作させたところ、エラー発生もなく正常に動作致しました。
nisii様、および皆様、どうもお世話になりしました。厚くお礼申し上げます、どうも有難う御座いました。今後とも宜しくお願い致します。

308F橋:2005/11/07(月) 22:54:45
今更のレスですいません

>>295-296
F-BASIC愛好者さん>
自己解決されたみたいで。お疲れさまでした

>>297
Hauz_vaporさん>
初めまして。一応管理人のF橋です
(ご質問の件は既にnisiiさんの方から回答されているみたいなので省略します)
F-BASICから別の言語への移行なんですよね?
どんな言語へ移行なんでしょう?
他の方も同じ事があるかも知れませんのでどの言語へ移行中なのかも
こっそりご紹介頂けると助かります

>>298
nisiiさん>
ありがとうございます!

>>300
puff_puffさん>
ご回答ありがとうございます

>>303
TOKOさん>
ご回答ありがとうございます

>>306
nisiiさん>
いつもありがとうございます

>>307
シマヅさん>
解決された様で。お疲れさまっす

309F-BASIC愛好者:2005/11/08(火) 07:24:24
F橋さん
ご無沙汰しております。
レスして下さいましてありがとうございました。
お陰様で>>295>>296(GetForegroundWindow)でなんとか自己解決できました。
日頃から大変お世話になり、お礼を申し上げます。
今後とも宜しくお願い致します。

310ゆぃ:2005/11/18(金) 20:42:13
はじめまして。仕事でF-BASICを使用しなければならなくなり、
ソースを見てるのですが全く分かりません。
ソースの意味を教えて欲しいのですが…

・ソースで
 01 open "aaa.ctr" for rndio as #1 len=256
 02 field #1,10 as AAA$
 03 field #1,8 as BBB$
 04 get #1,1
 とあった場合、

 01行目の rndio って言うのはランダムファイルって事ですか? len=256 は固定長が256って事でいいんですか?
 02行目の AAA$ の $ って意味は何なのですか? $がある場合とない場合の違いは何ですか?
 04行目の get #1 の意味は分かるのですが、レコード番号が 1 って言う意味がよくわかりません。
 これは02・03行目をまとめたデータがレコード番号1で登録されていて04行目で呼び出そうとしているのですか?

まだまだ分からないことが沢山ありますが、なにぶん今日から始めたばかりで…NETで調べてもあまり分かりませんでした。

こんな私ですが、よろしければご教授の方をお願いできないでしょうか。

311ゆぃ:2005/11/19(土) 08:43:42
>310 の質問は解決できそうです。
教えてくれた方・教えようと思った方
ありがとうございます。

312ゆぃ:2005/11/19(土) 13:22:10
http://jbbs.livedoor.jp/computer/7997/
に書いた方がレスが早いので。と教えてもらったのですが、
書き込む事ができなかったので、ここにて質問させて下さい。
まだまだ初心者で分からないのでお聞きしたいのですが、

ステップ毎にトレースログを書き出す記述と、
取得している値を書き出す記述がわかりません。

どんな方法があるのですか?
インターネットでF-Basicで調べてもなかなか出てこず、分からないので
どなたかご教授していただけないでしょうか。

お願いします。

313nisii:2005/11/19(土) 21:58:25
はじめまして、ゆぃさん。

トレースのお勧めは、ツールバーのトレースとウォッチボタン。
ブレークポイントはメニューから設定します。

DOS窓で実行するなら、TRON/TROFFも使えますよ。

なお、イベント処理などWindowsスタイルでプログラムすると、
どちらも使えなくなったかな?

F-BASICはネットでも情報が少ないので、付属のヘルプを見るのが一番です。
あと、N88-BASIC(86)の資料も共通部分が多くて便利。


ログの取り方ですが、自力でファイルに書き出す方が現実的でしょうか?

もし、デバッグのためにログが必要と思われているのでしたら、
独立したサブプロシージャ単位で機能を作るスタイルをお勧めします。
そうすることで、要所の値を確認するだけで、バグを見つけられる

コンパイル型の言語で、トレースを見てデバッグというのは、
決して効率的ではありませんので…。

314ゆぃ:2005/11/21(月) 10:45:07

nisiiさん。レスありがとうございます。
早速、修正・実行してみます。

あと、こう言う風にして欲しいと言われています。
それが、
・各処理ステップ毎にトレースログを書き出す。
 プログラムがどの処理まで進んでいるかの調査が行いやすいように、
 ログを書き出すポイントを考慮する事。
なのですが、私が調べた結果、
 Call ETA.Trace(App.EXEName, "モジュール名.関数名", "S ")
 Call ETA.Trace(App.EXEName, "モジュール名.関数名", "E-01")
関数を使用しないといけないのかなぁと考えてたんです。
それに、あまりソースを変更しなくてもできる。とも言われました。

F-Basicを使用し、まだ2日…全然分かりませんね。

315ゆぃ:2005/11/21(月) 15:24:23
度々すみません。もぅ一つ質問です。

F-BasicのVer6.3なんですが、
何も修正をせずに、コンパイル・実行は可能なんですが、
一度プログラムを(空白でも何でも)修正するだけで
コンパイル(翻訳)ができなくなってしまいます。
エラー内容は、「error LNK2001:外部シンボル "XXX"は未解決です。」
なんですが、コメントや空白をつけただけで外部呼出しに失敗とかしますか?
どうすればコンパイルができる様になるのでしょうか?

度々すみません。ご教授をお願いします。

316nisii:2005/11/21(月) 16:02:30
環境がWindowsXPであれば、SP1またはSP2をあててください。

原因は、WindowsXP初期版のリッチテキストコントロールのバグ。
改行コードが化けるというのがあるんです。

317ゆぃ:2005/11/21(月) 16:54:00
nisiiさん。ありがとうございます。

環境はWindows 2000
   5.00.2195
   Service Pack 4 です。
この場合、どうすればよろしいんでしょうか?

318ゆぃ:2005/11/21(月) 20:47:43
すみません。実行できない原因が分かりました。
メインフォームとサブプログラムを画面に一緒に表示させて、
プロジェクトモジュールに一緒に追加にしないといけないんですね〜
本当初心者的ミスですよね。さすが初めて2日目(オイッ)
本当申し訳なかったです。

そして、ありがとうございます。これでやっと先に進む事ができます。

319nisii:2005/11/21(月) 20:50:52
エラーが起きたファイルをバイナリエディタで見て、0Dh 0Dh 0Ahがあれば、
下記のバグによる改行化けです。
http://support.microsoft.com/default.aspx?scid=kb;ja;JP320368

原因を切り分けたいのであれば、いきなり既存のプログラムで検証するのは無駄です。
翻訳の条件、例えばリソースなどの参照先がすべて存在するかも含めて調べないといけないでしょう。

まず、数行のプログラムを入れて翻訳したらどうなりますか?
そこからはじめましょう。

320nisii:2005/11/21(月) 20:52:45
>>318
おっと解決されていましたね。
ということで >>319 は忘れてください。(笑)

321ゆぃ:2005/11/21(月) 21:39:32
nisiiさん。調べてくださったんですね。
ご迷惑をかけ本当すみません。ありがとうございます。


あと、プログラムの事をお聞きしたいのですが、
>>312 の質問と同じトレース関数なんです。

トレースログをファイルに書き出す事は可能でしょうか?
私の中の考えでは
 1.最初にファイルをOUTPUT OPENして作成。
 2.作成されたファイルにトレースログの出力結果を書き込む
と、言う手順しか頭に浮かばないんですが…
手順は頭に浮かんでも、プログラムの記述が全く分からないです。
調べても、それらしいプログラムはなかなか出てきませんし。

申し訳ありませんが、ご教授の程、よろしくお願いします。

322maruko:2005/11/22(火) 04:47:02
2〜3日前よりコンパイルすると次のエラーが出るようになりました。
┌────────────────────────┐
 │(テンポラリ) : 10.作業ファイルが作成できません │
└────────────────────────┘
お分かりの方、対処方法をお教え願います。
(バージョンは、F-BASIC V6.3 L10 U003です。)
宜しくお願いします。

323maruko:2005/11/22(火) 21:16:11
分かりましたので投稿を引き揚げます。

324nisii:2005/11/24(木) 14:46:45
>>321
下記リストのようなサブプロシージャを作っておけば、
TRACEWRITE "文字列"
だけでログを残せます。


'トレースサンプル
#include "file.bi"
#include "windows.bi"

declare sub TRACEWRITE( ALINE$ )

TRACEWRITE "初期化"
do
TRACEWRITE str$( rnd )
loop
end


'サブプロシージャ
'トレース出力
sub TRACEWRITE( ALINE$ )

var FILENO as long
var MESSAGECODE as long
var TRACEFILE$

TRACEFILE$ = GETWINDOWSDIRECTORY + "\temp\tracesample.txt"
if ALINE$ = "初期化" then kill TRACEFILE$

FILENO = freefile
open TRACEFILE$ for append as #FILENO
print #FILENO , ALINE$
close #FILENO

'値の表示
if MESSAGEBOX( "値の確認" , ALINE$ , 1 , 4 ) <> 0 then
'キャンセルボタンでログ表示・終了
SHELLEXECUTE TRACEFILE$
end
endif
end sub

325ゆぃ:2005/11/26(土) 13:39:57
nisiiさん。度々ありがとうございます。
そして、返事が遅くなり申し訳ないです。

326F橋:2005/12/03(土) 02:32:33
ゆぃさん>
初めましてです。レスが遅く技術も無いのですが一応管理人のF橋です
既にnisiiさんが返答済みの様ですね。これからもnisiiさんに聞いてください(おい(笑

nisiiさん>
という訳で。いつもいつも本当にありがとうございます

marukoさん>
ご回答できずに申し訳ございませんでした
>>322-323の件は解決済みの様ですがもしよろしければどの様に問題が発生し
どの様に解決したかも書いて頂けると他の方に参考になると思います
お時間あればで構いませんのでよろしくお願いします

327ロディマス:2005/12/05(月) 20:00:03
BASIC/98に浮気してみようかと思うのですが、使っている人います?

328DOSD:2005/12/06(火) 01:20:09
BASIC/98はN88BASICに慣れている方ならかなり使いやすいですよ
ただしWindowsの機能が弱い様で色々質問するとF-BASICを勧められるらしいです
(どなたかが「こういう機能は無いか?」といくつか質問するとF-BASICを勧められた事があるらしい)

逆に言うとWindowsの機能(エディットボックスなどやAPIなど)を一切使わず
N88BASICから簡単に移行したいのならばお勧めです

尚。N88BASICからの移行ならフリーソフトの99BASICもちょっとお勧めします
(ファイルが2つしか開けないという大きな欠点があるので業務向けではお勧めしませんが)

329akira:2005/12/06(火) 01:51:59
自分も最近浮気してしまいました。
相手はPurebasicというBASICで、使い始めて2ヶ月ほど
たちましたが、なかなか面白い開発環境だと思います。
(Windows MACOS LINAX AMIGA用の実行ファイルを出力可能)
欠点は日本語の解説がほとんどないことです。
体験版もあるので誰か使ってみませんか?
日本人の仲間が増えるともっと良い環境になると思います。

akira

330DOSD:2005/12/07(水) 01:06:37
浮気候補の一つにさせて頂きます(笑

あれ。もう2つ程浮気予定があった気がする(笑

331ロディマス:2005/12/08(木) 20:41:53
Purebasicは購入にクレジットカードを使わなければならないのが不安ですね。何か別の方法が無いでしょうか?

332akira:2005/12/09(金) 00:16:10
自分はおりゃさんに頼んで買ってもらいました!
http://dbp.cool.ne.jp/fmailpb.html
ここに頼み方が書いてあります。

akira

333ロディマス:2005/12/09(金) 20:01:31
>>332
おお!これはいい方法ですね!早速購入いたします。

334DOSD:2005/12/10(土) 01:00:28
PureBASICを使っている方。感想頂けると助かります
以前のBASICの様に使えるのかVBの様なイベント処理なのか
Windowsの機能が使えるか(apiやdllが呼び出せるか)等ご指導頂けると助かります

335akira:2005/12/11(日) 13:20:25
まだPBの初心者なんですがわかる範囲で書きます。
>以前のBASICの様に使えるのか?
できると思います。(自分では使っていない)

OpenConsole()       ;DOS窓のようなものが開く
ConsoleLocate(10, 10):Print("これはテストです")
a$=Input()
ConsoleLocate(10,20):Print(a$)
a$=Input()
End
こんなふうに書くとN88BASIC風に動きます。
>Windowsの機能が使えるのか?
APIやDLLは簡単に呼び出せます。
イベントもFBASICより沢山あるので困ることがない。
MDBも直接アクセスできる。
http://dbp.cool.ne.jp/program/purebasic/purebasic.htm
ここにおりゃさんがPBの特徴を書いてますので見てください。
自分はFBASICと同じくらいPurebasicが好きで
今までFBASICで作ったものをPureBasicに移植してみましたが
問題なく移植できました。
興味のある方は体験版があるので是非使ってみてください。

akira

336ロディマス:2005/12/11(日) 20:00:08
;自分はFBASICと同じくらいPurebasicが好きで
;今までFBASICで作ったものをPureBasicに移植してみましたが
;問題なく移植できました。

BASIC/98の方を買ってしまいました・・・。構造体が使えないです。PureBasicの方が良かったかな?ボーナスが出たものでつい・・・。

337akira:2005/12/11(日) 20:20:45
え!そうなんですか
残念
だけど体験プログラムが無料であるので、是非使ってみてください。
ちょっとしたプログラムは十分これでつくれますよ。

akira

338ロディマス:2005/12/16(金) 22:02:50
富士通はCOBOLを無償公開しているのだから、F−BASICもそうしてくれないかな?

341化石:2005/12/27(火) 15:26:26
XP対応させようとの運動、でも来年はビスタが発表になるとか。

XPはなんとか動きましたが、ビスタはどうなのでしょうか?

342F橋:2005/12/29(木) 16:04:09
>>341
一部不具合は出るとは思いますが何とかなるとは思います
ですが実はかなり心配していたりします

343puff_puff:2006/01/08(日) 17:12:48
あけましておめでとうございますって、もう1週間も過ぎてるな…。
ああ、ゲームばっかりしていて、プログラムが組めていない、大変だあ。
Windowsが新しくなるのは少し期待していますが、F−basicが
動かなくなるのは、本当に困ります。
MSさん、なんとかF−basicも動くようにしておいて
くださいねって、言う相手が違うか!

ところで、どなたか、windowsのAPIで(ちょっと名前が分からないのですが)
エクスプローラーのようにリストボックスの中に列が複数あって、それぞれ
項目名をクリックすると項目毎にソートされるやつの使い方を
教えていただけませんでしょうか?
組んでいるプログラムでリストボックスだけではどうしてもできないところが
あるのです。よろしくお願いします。
APIの本を色々見てみるのですが(立ち読みですけど)どれが該当するのか
分かりませんのです(トホホ)

344<削除>:<削除>
<削除>

345<削除>:<削除>
<削除>

346<削除>:<削除>
<削除>

347<削除>:<削除>
<削除>

348シマヅ:2006/01/11(水) 17:47:01
 管理人さま、皆さま、大変申し訳ありません。(344)の質問を書き直します。
■コンパイル時のエラーに関して
 皆様、毎度お世話になっております。
 OSの調子が不安定(電源オフ操作しても、再起動を何回も繰り返す、その他)になったので、正月にOSを再インストールしました。
 ところが、その後、F-BASICを起動して今まで正常に動作していたプログラム(全く何も手を加えていない)ものを再度コンパイルした時にエラー発生するようになってしまいました。
▼エラーの内容は「○○行 [02] 文法が正しくありません」のようになります。【これが1から5行位で発生する】
 従来のプログラムに全く手を加えていないので、プログラムを幾ら見直しても原因が分かりません。エラーの出る前後の行に改行を入れたり(空白の行が出来る)や、エラー行の先頭コマンドの前に半角スペースを1っ追加するとエラー発生しなくる場合もありますし、逆に半角スペースを1っ無くすとエラー発生しなくる場合もあります。(全角スペースなどは入っていません)
 しかし、これで解決しない行もありますし、その行が直ると別の行(コマンドが全く違う)のに同じエラーが発生する場合もあります。
 原因が分からなくて困っています。この様なことを体験されて、解決した方などがおりましたら教えて頂きたくお願いします。
▼現在はWindowsXP HomeEdition SP1(SP2は未使用)です。
 F-BASICはVer6.3 L10 U003です。OSの再インストール後に他のソフトで変更があったのは、ノートンインターネットセキュリティー2005から2006にVerUPしたことと、Windowsの(SP1,2を除く)Updateをしたこと位です。
 以上の状況です、よろしくお願い致します。

349TOKO:2006/01/11(水) 21:03:23
シマヅさん>
>>▼現在はWindowsXP HomeEdition SP1(SP2は未使用)です。
>>Windowsの(SP1,2を除く)Updateをしたこと位です。
どちらが正しいのでしょうか?
もし、初期のWindowsXPでSP1および、SP2にUpdateしていないのであれば、それは、
WindowsXP自身のバグでF-BASICのせいではありません。
(【雑談】雑談専用・愚痴歓迎【愚痴】の203参照)
SP1、SP2を当てたくない理由があるのであれば、ニャン子さんが発表しておられる
「WindowsXPでもF-Basic V6.3を使いたい」が参考になるかと思います。
http://www.geocities.co.jp/SiliconValley/1223/fb01.html
SP1を当てているということであれば、その場合の情報は持ち合わせておりません。

350シマヅ:2006/01/11(水) 23:33:38
◆TOKO様
 解決しました。
 早速のご回答を頂き有難う御座いました。再度確認したら、SP1ではありませんでしたので対応させました。念のためhttp://www.geocities.co.jp/SiliconValley/1223/fb01.htmlも対応させておきました。(初歩的なことで、申し訳ありませんでした。)

 OSの再インストールをした後、WindowsのUpdateをし、SP1もインストールしたのですが、その2日後くらいにSP2をインストールしたところ、IE6を起動すると動作中や終了時などに頻繁にエラー発生するようになりました。そのためシステムの復元で、インストール前に戻したのですが、復元の方法に手違いがあったのか、SP1も削除されていたようです。おまけに、何故か外付けHDDにバックアップしていたフォルダ内の「exeファイル」だけが、全て消えていました。(外付けHDDのアクセス・ランプがいつまでも点灯していたので、イヤな感じはしたのですが・・)
 なにしろ、「'」(REM)だけの行まで、文法エラーが発生していたため、目の前真っ暗の感じになってしまいました。

◆管理人さま、皆さま
 ソフト仕上げの期日が迫っていたためアセッテいました。コンパイルが出来ないことで、精神的に動揺していたこともあり(そうでなくとも?)、掲示板を汚してしまって大変申し訳ありませんでした。これで期日に間に合います、ホッとしました。本ホームページのお陰で助かりました。皆様の素早やく暖かいフォローに心から感謝します。
 生まれつきのオッチョコチョイで、子供のころから未だに自分の名前(本名)を間違って発音したりする人間のため大変失礼しました・・【「百円」を「しゃくえん」と発音してしまいます(別に言語障害者ではありませんが)】・・情けない・・言い訳になってしまってスミマセン。

 管理人さま、掲示板「344〜347」は「記入者の依頼で削除」にして貰ってOKです。それから、F-BASIC Ver7(WindowsXP対応版)購入予定者に記載して頂いておりますが、もし「Windows Vista」の対応版・購入予定者を記載(掲載)する場合がありましたら、私のハンドル(シマヅ)も追加して下さい。
 どうも有難う御座いました。今後ともよろしくお願い致します。

351F橋:2006/01/12(木) 01:31:58
>>343
>あけましておめでとうございますって、もう1週間も過ぎてるな…。
すいません。管理人なのにおめでとうを言い忘れてます。
今更ですが。あけましておめでとうございます!

>MSさん、なんとかF−basicも動くようにしておいて
>くださいねって、言う相手が違うか!
MSがF-BASICの権利を買ってMSで販売してくれれば…あり得ないですね(笑

>どなたか、windowsのAPIで(ちょっと名前が分からないのですが)
>エクスプローラーのようにリストボックスの中に列が複数あって、それぞれ
>項目名をクリックすると項目毎にソートされるやつの使い方を
>教えていただけませんでしょうか?
ご存じの方。よろしくお願いします

352F橋:2006/01/12(木) 01:45:35
TOKOさん>
ご回答頂きありがとうございました
相変わらずレスの遅い役立たず管理人で申し訳ございません

シマヅさん>
> 生まれつきのオッチョコチョイで、
オッチョコチョイ大歓迎です!既にバレていると思いますが私もかなりの天然です
私と似た様な方が見えて非常に助かります。もっとも私の方が天然の自信がありますが(笑

>掲示板「344〜347」は「記入者の依頼で削除」にして貰ってOKです。
削除しました。投稿者から削除出来ない掲示板ですので遠慮無く削除の指示を頂けます様お願いします

353F橋:2006/01/12(木) 01:52:14
掲示板へご参加頂いている皆様へ

レスは遅いのですが削除は可能な限り早く行う様心がけております
投稿者から削除が出来ない掲示板ですので(自己都合でも全然構いませんので)
遠慮無く削除の指示を頂けますようよろしくお願いします

さて。何人かから違う掲示板をしないか?とご要望を頂いております
メインで頂く意見として投稿者自身が削除出来ないので投稿する時に緊張してしまう。の様な話を頂きます
この様な形式(スレッド型)の掲示板でお勧めの掲示板があれば検討したいと思いますのでよろしくお願いします
(レンタル掲示板ではなくCGI設置型の掲示板でも構いません)

尚。スレッド型以外の掲示板は申し訳ないのですがお断りさせてください
以前スレッド型ではない掲示板を使っていたのですがある件数以上は消えてしまうので
毎回過去ログの整理に時間がかかってしまい過去ログの公開がかなり遅れてしまいました
ここのスレッド型掲示板の場合は(私の都合ではありますが)過去ログの負担が無いのが理由です
よろしくお願いします

354シマヅ:2006/01/12(木) 09:36:09
■管理人さま
>レスは遅いのですが削除は可能な限り早く行う様心がけております
▼素早い削除対応をして頂き有難う御座いました。大恥を長時間晒さずにすんで、一安心です。超マヌケ人間のためにお手数をお掛けして大変申し訳ありませんでした。

>何人かから違う掲示板をしないか?とご要望を頂いております
▼私のような、超マヌケ人間のために、掲載時にパスワードも入力して、自分で削除出来る形式だと有難たいです。
 たまに宝くじ(ロト6)を購入していますが、その時に覗いている、下記のような掲示板もいいかな?などと思っています。それと検索も、し易くて・・などなど。
http://www4.big.or.jp/~gmt/ibbs/bbs.cgi
 勝手な意見で恐縮です、今後ともよろしくお願い致します。

355puff_puff:2006/01/12(木) 23:19:55
管理人様 レスありがとうございます。
そうですか、みなさん消せないので書込時に緊張されていたのですね。
私は、全然気にしていませんでした。
これについての情報は持ち合わせていないので申し訳ありませんが、
でも、いざというとき、自分で消せるのも良いかもしれません。

それから343>にも書いていますが、APIの名前と使い方と、そのAPI
の画面写真なんかが載っているWEBページでも有ると良いのですが、
どなたか、エクスプローラーのようなリストボックス(?)の使い方
教えてほしいです(しつこくかいてすんません…)

356TOKO:2006/01/13(金) 20:53:35
エクスプローラは左の部分がTreeView、右側の部分はListViewですね。
これらは、Windowsのコモンコントロールですので、CreateWindowExで作成することが可
能です。
にわか勉強ですが、http://tokovalue.hp.infoseek.co.jp/の「TreeView・ListViewの作成」
に載せておきました。まだ、項目の入力まではできていませんが暇をみて挑戦してみよう
と思っています。

参照URL
http://yokohama.cool.ne.jp/chokuto/urawaza/comctl.html

的はずれの場合はゴメンナサイ・・

357F橋:2006/01/15(日) 00:32:15
>>354
掲示板の候補をご指導頂きありがとうございます。ただ大変申し訳ないのですがスレッド型の掲示板では無いので
申し訳ないのですがご遠慮させてください

スレッド型(2ちゃんねる型)に拘る理由は投稿内容のほぼ全てが残る(=過去ログ整理がいらない)点にあります
ここで使っている掲示板は50スレッド*1000レスの最低50000の投稿内容が保存できます
(あくまで最低です。スレッドは1000程度まで拡張でき1スレッドのレス数も10000まで可能です)
このスレッド型以外の掲示板では半年から1年程度しか過去の投稿内容が見れません

スレッド型もいくつかの種類がありますのでその中で削除可能な掲示板があればご指導頂けると助かります
KENT WEBでスレッド型でCGI型(レンタルでは無いので自分でCGI設置が必要なもの)がありました
KENT WEBのスレッド型掲示板は投稿者自身の削除が可能なのですが、geocitiesがCGIに対応しておりません
CGI設置が可能な所を探してみます
尚、レンタル掲示板でスレッド型で削除が可能なのがあればすぐに設置出来ますのでご指導頂けると助かります

358F橋:2006/01/15(日) 00:43:32
>>355
>そうですか、みなさん消せないので書込時に緊張されていたのですね。
何人から似た様なお話を頂きました。
それを聞くまで私も忘れていたのですが、私も初めてネットの掲示板に書き込む時は非常に緊張しました
お気軽に参加出来るのを考えれば自分で削除出来る掲示板は必要と思います
たまに参加する方やカウンタ等を考えるとROMのみの方。(掲示板に参加しにくい方)が以外にいると思われます

>それから343>にも書いていますが、APIの名前と使い方と、そのAPI
>の画面写真なんかが載っているWEBページでも有ると良いのですが、
>どなたか、エクスプローラーのようなリストボックス(?)の使い方
>教えてほしいです(しつこくかいてすんません…)
私には分かりませんがご協力出来る様な事があれば行いますが…
例えばこの質問内容をこの掲示板の上部に常時表示する。と言った事ならば考えますが…

それと。うろ覚えの為返答をしませんでしたがどんな方法でも良ければ解決策に心当たりがあります
ニャン子さんがF-BASIC用のシート(Excelの様な表)の関数群を自作されていたはずです
イベント処理にも対応しておりかなり素晴らしいものです。Excelの表での動作と比べても見劣りしないです
(言葉で説明しにくいのですが。上部がボタンになっておりボタンを押した時の処理が可能。
 記憶違いが無ければ幅を縮めたり広げたりも可能)
WindowsのAPIでは無いのですが見た目や操作面も含めて非常に完成しているものと記憶しております

359goma:2006/01/15(日) 18:52:16
始めまして。
F-BASICって、最後のBASICだと思っています。
VB.netやABは、BASICと呼べるのかどうか??

ここを発見し、今もF-BASICを使い続けておられる方々が居られるということで、私もまた、使ってみようかという気になりました。
そこでお尋ねしたいのですが、XPに非対応とのことで、対応策も拝見しましたが、開発環境がXPに非対応ということなのですか。
コンパイルして完成したEXEは、他のXPでも問題なく動作するのでしょうか。
もし問題がなければ、使ってみたいと思います。
よろしくお願いします。

360puff_puff:2006/01/16(月) 00:00:47
>356 >358 TOKOさん F橋さん レスありがとうございます。
さっそく、やってみます。また分からなければ教えてくださいね。
本当にありがとうございます。

361F-BASIC愛好者:2006/01/16(月) 12:33:56
旧年中は皆様方に大変お世話になりましてありがとうございました。
今年も宜しくお願い致します。
下記のサンプルプログラムが探せず投稿いたしました。
Webページが更新されたかチェックできるプログラムをVBで検索しましたが
探すことができませんでした。参考になりますサンプルプログラムが
ありましたら教えて頂けませんでしょうか。
宜しくお願い致します。

362puff_puff:2006/01/16(月) 21:42:20
gomaさん、こんにちは。
私は、F−Basicを使うだけの人間ですので、
なぜWINDOWSで動くのかとか、どういう翻訳があってEXEに
なるとか、詳しいことは全く知りません。
でも、自作で事務的な仕事に使っている(20人くらい別々の環境で)
ソフトはme でも XPでもほぼ問題なく動いています。
ただ、ここの掲示板にも幾つか書いてありますが、SP1とかSP2でないと
困ることがあるようです。
あと、富士通がXPに対応と言ってくれないので…

363goma:2006/01/16(月) 22:20:18
puff_puff さん、お返事をありがとうございます。

今頃何を・・・と言われそうなんですが、、、
98DOSのQuickBasicで組んだソフトをWindowsで動かそうとしているのです。
ほとんど作り直しですが、けっこう大きなソフトなので、F-BASICのほうが、
開発時間がかなり短縮できると思うのです。
それに、F-BASICはサポートがなくなりましたが、マイクロソフトは、QB以降、
DOSのVBからWindowsのVB、VB6から.net、さらに.net2005へと、変化が激しすぎます。
その意味で、F-BASICは今後変更(して欲しいが)されないので、安定です!?
だから、解決できない問題がなければ、使って見たい気がします。

ところで、XP環境のF-BASICで作った独立EXEを、Windows98(SE)で動かすと、
フォントが大きくなって画面に収まらないと聞いたのですが、いかがでしょうか。
また、よろしくお願いします。

364goma:2006/01/16(月) 22:23:55

訂正します。
(誤)画面に収まらない → (正)指定した枠に収まらない

365TOKO:2006/01/16(月) 23:43:46
Web更新チェックは、何を比較しているのかわかりませんが、Vectorなどでソフトの詳細
説明をみると、日付・文字列などをチェックしているものもあるようですね。
文字列比較については、APIのCompareString(比較オプションに対応した文字列比較関数)
が、使えそうかなぁと思います。

Windows9xとWindowsNT系のフォントサイズは、明示的に指定することで解決できます。
参考:http://www.geocities.jp/fbasic63/fbn201.htm

366F-BASIC愛好者:2006/01/17(火) 07:57:24
TOKOさん
昨年は大変お世話になりました。
早速、ご返答くださいましてありがとうございました。
比較には日付・文字列があるとのことですが今回は日付で考えています。
説明不足がありまして申し訳ありませんでした。
今後、文字列などをチェックする場合は「文字列を比較する 」
http://tokovalue.hp.infoseek.co.jp/CompareString_M.htm
をご参考にさせて頂きます。ありがとうございました。

367F-BASIC愛好者:2006/01/17(火) 23:09:02
C言語は解りませんが、Webページ更新チェックソフトWWWCのソースが公開されていました。
http://www.nakka.com/wwwc/  
WWWC    ソースコード
________________________

VB6のWebページ更新チェックソフトは探しだせませんでした。

368F橋:2006/01/18(水) 02:00:26
>>359
初めまして。レスが遅く知識乏しく役立たず管理人のF橋です。これからもよろしくお願いします

>F-BASICって、最後のBASICだと思っています。
>VB.netやABは、BASICと呼べるのかどうか??
私も思います。DOS時代のBASICとイベント型のBASICは全然違う言語と思っています

>コンパイルして完成したEXEは、他のXPでも問題なく動作するのでしょうか。
いくつかご回答がある様ですが私も同じ認識で「ほとんど問題なく動作する」と思っております
私が唯一困ったのは kinput (漢字のinput)を行った時に画面の下にIMEが起動するくらいです
(言葉ではうまく言えません。社内で使うには問題無いが社外には出せない。と言えばいいでしょうか)
ただこの件もとある方が富士通に交渉し修正ルーチンがネット上に存在します
業務用のシステムを作成しておりますが少なくとも私は現在は困った点がありません
強いて言えば次期OSへの不安程度です

社内で統合環境のエディタを使って(XPのSP2なんですが)文字化けの様な不具合があるのは確かです
ただ私の場合は別のソフトのエディタを使っているので問題になった事がありません

うろ覚えで申し訳ないのですが。XPでのトラブル報告をいくつか聞いた気がしますが
そのほとんどが画面の表示程度だったと記憶しております
逆に言うと画面の表示をそれほど気にしない個人及び社内でのソフトではまず問題が無いかと…
現段階では残念ながらF-BASICを主言語としてプログラマとして独立には向かないとは思います

ただし。予備のプログラム言語としてお考えならば全然問題ありません
例えば。主はVCを使える。けどVCのみでは時間がかかるから9割F-BASICで作り
F-BASICでは扱えない部分1割の部分をVCで作る。というのならば全く問題ないと思います

その他。思い出したF-BASICの欠点を少々。
ActiveXをF-BASICで完全に使えた人がいない?
(ActiveXの制御を試し途中まで成功した方は見えます)
コールバック関数が使えません
(コールバック関数は私もなんとなくしか分かりません。私の業務では使った事無いです)
((コールバック関数を知っている方の話ではそれを使えばより便利なソフトにはなるらしいです))
後は情報の不足(F-BASICのサンプルが少ない)のが欠点かと思います

gomaさんがどの様なプログラムを予定しているかが分からないので確定は出来ませんが
旧BASICで行っていた事をWindows版にしたい。と思われているのならまず問題無いと思われます

369goma:2006/01/18(水) 18:54:57
F橋さん、お忙しいところ、詳しいレスをありがとうございます。
作ろうとしているのは事務処理で、例外事項を含む為に計算が難しいのと、指定書式の印刷が多いものです。
DOSでは、入力を簡単にする工夫をして、ポップアップ画面を多用して項目の選択を容易にしたりしていました。
その為に、アセンブラで作成した自作ライブラリーを沢山作って使っていますので、そのまま転送はできません。しかし、ファイル(構造体)や計算部分は、一部の型変換だけすれば、そのまま使えるかと思ったりしています。

私なりに、いろいろ調べていますが、長短あって難しいですね。
途中で変更できないのでもう少し調べてみますが、.netが無難な気もします。
しかし、ランタイム不要のF-BASICは、使える場面では利用したいと思いますので、これからもよろしくお願いします。

F-BASICの進化が止まったのは惜しいですね。
この言語仕様のまま、新OS対応、コントロールを増やすなどして貰えば、文句なしですが。

ところで、TOKOさんのサイトを拝見しましたが素晴らしいですね。参考にさせていただきます。

370goma:2006/01/26(木) 18:43:27
結局、クラスを多用したいので.netにしました。
いろいろと、ありがとうございました。

371F橋:2006/01/29(日) 01:36:25
gomaさん>
レスが遅くなってすいません。社内業務で印字等なら特に不具合無く使えると思います
印刷プレビュー機能(印刷イメージ)などはありませんのでそういうちょっとした所を考えると
社内ではいいけど販売するソフトとしてはF-BASICではやや難しい部分があるかもです
なんというのか…F-BASICで不具合あっても代わりにこういう使い方で回避。なんてのが多いんですね
ですので社内では問題無い場合が多いと思うんですけどね…

と。すいません。既に.netに…
確かに.netのが無難なのは確かですよね
(実は私も勉強中で…(汗

372goma:2006/02/02(木) 15:12:24
F橋さん、お返事をありがとうございます。
F-BASICの6.3を持っているとばかり思い込んでいて、確認すると6.0だったのです。
で、6.3を今更買うのもどうかと思いました。現行品なら買いますが。
F-BASICは、目的によってはかなり使えると思いますし、もし6.3を手に入れたら、いろいろと使ってみたいです。
また、よろしくお願いします。

373F-BASIC愛好者:2006/02/03(金) 10:43:38
お世話になります。
VB6で申し訳ありません。
ファイルの更新日付取得につきまして
MsgBox FileDateTime("C:\FBASICV63\Sample_B\SAMPLES.TXT")で
更新日時分秒が取得できました。しかし
MsgBox FileDateTime("C:\・・・・・・\Temporary Internet Files\xxx.TXT")では
インターネット一時ファイルではファイルがみつかりませんとなります。
一時ファイルのファイルは読めないようになっているのでしょうか?。
もしご存じの方がおりましたら、ご指導願えますでしょうか。
よろしくお願いいたします。

374nisii:2006/02/03(金) 13:59:16
一時ファイルはアクセスしてほしくない、という構造になっています。

1.レジストリからIEの一時フォルダ名を得る
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Cache

2.次の一時フォルダから、さらに下層のサブフォルダを探す
<1.のパス名>\Content.IE5

3.サブフォルダ群の中から、目的のファイルを探す
\ADX2REPC などの作成日時を調べれば、どのあたりのフォルダに入っているかが絞れるでしょう。

次の点に注意。
・この手法はIE5(以降)専用で、他のブラウザには対応しません。
・システム属性付きのファイル・フォルダを検索できる機構が必須です。
・一時ファイルは、元の名前と違うことを考慮してください。(例) index[1].html など
・フォルダ・ファイル構造は \Content.IE5\index.dat に入っていますが、解析は自力でお願いします。

今回は解析までしなくても目的を達成できそうですが…。

375F-BASIC愛好者:2006/02/03(金) 16:02:04
nisii さん
急速なご回答ありがとうございました。
度々お世話になりお礼を申しあげます。
VB6でWebページの更新日付情報を取得したいと色々探しましたが
VB6では殆ど参考になるサンプルはありませんでした。
そこで今回の方法となりました。 少し難しいそうですが
ご指導くださいました注意点に従い挑戦してみたいと思います。

3761大学生:2006/03/10(金) 09:49:42
こんにちは!fbasicいつも愛用させてもらってます。
最近気になった事があって調べてたんですがどうしてもわからなかったので質問させてください。

fbasicでexeファイルを作成する時に、
exeファイル内にファイルバージョンを記入できないものなんでしょうか?

processExplorerなどのソフトで見てみるとバージョンがn/aになってて
ちょっとかっこ悪いので直したいなぁとおもったんです。
ご存知の方がいらっしゃいましたらお教えいただけないでしょうか。
よろしくお願いいたします。

377F-BASIC愛好者:2006/03/14(火) 20:07:06
実行ファイルを一本にする方法につきまして
実行ファイル test1.exe(F-BASIC) とtest2.exe(VB6.0) 2本の実行ファイルを
test1.exeの後にtest2.exeをつないで1本にしました。
F-BASIC(test1)でアドレス000F000を指定して直接起動(test2.exe)する事は可能でしょうか。
もし可能でありましたらどの様な記述にすればよいのか、宜しくお願いします。

アドレス
0000000   test1.exe(F-BASIC)
  .   .
  .  .
  .      .
000EFF0 test1.exe(F-BASIC)
000F000 test2.exe(VB6.0)
  .   .
  .  .
  .      .
001FF10 test2.exe(VB6.0)

378名無しさん:2006/03/16(木) 01:30:35
>>376

Windpws エクスプローラからファイルのプロパティで
表示されるパージョン表示は、EXEファイルにリソース
として埋め込みます。
F-BASIC/Win ではサポートされていませんので、
手作業で直接ソースファイルに直接書き込む必要があります。
もちろん、保証外の方法です。
フォームのデザインを格納しているリソースファイル  <ファイル名>.rcを
メモ帳やのテキストエディタで開いて、書き換えればできます。


 ソースをすべて保存しておいてからF-BASICを終了します。
 フォームのデザインを格納しているリソースファイル  <ファイル名>.rcを
メモ帳やのテキストエディタで開いて、書き換えます。

    <-- ファイル内容先頭 -->
#include "f1a0form.h"

<<< この間に挿入します >>>

FB$VersionInfo RCDATA
BEGIN


 リソースファイルを翻訳後のファイルが <ファイル名>.RES
ですので、これを削除します。(再翻訳させるためです)。
F-BASICを起動して、翻訳 処理して実行ファイルを作成させます。
 フォームのデザインを変更したり変更せずとも保存すると
書き換えた内容は消えます。

リソースファイルを書き換える前に必ずバックアップをとっておいてください。
動作保証外ですので、不具合が起きるかもしれません。

379名無しさん:2006/03/16(木) 01:38:09
>>376
つづきです。
書き込む内容はこんな感じのものです。

--------

// File version info ===
1 VERSIONINFO
FILEVERSION 1,0,0,0
PRODUCTVERSION 1,0,0,0
FILEFLAGSMASK 0x3fL
FILEFLAGS 0x0L
FILEOS 0x40004L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
  BLOCK "StringFileInfo"
  BEGIN
BLOCK "041103a4"
BEGIN
     VALUE "Comments", "\0"
     VALUE "CompanyName", "\0"
     VALUE "FileDescription", "\0"
     VALUE "FileVersion", "1, 0, 0, 0\0"
     VALUE "InternalName", "\0"
     VALUE "LegalCopyright", "\0"
     VALUE "OriginalFilename", "\0"
     VALUE "ProductName", "\0"
     VALUE "ProductVersion", "1, 0, 0, 0\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x411, 932
END
END
--------

中身の書き方にしついては以下のページの解説がわかりやすいようです。
ttp://www7a.biglobe.ne.jp/~tsuneoka/win32tech/20.html

3801大学生:2006/03/16(木) 14:30:13
大変勉強になりました。
これからのfbasicプログラミングに活用させていただきます。
丁寧にお教えいただき感謝しています。
ありがとうございました。

381名無しさん:2006/03/17(金) 23:45:01
>>377
>F-BASIC(test1)でアドレス000F000を指定して直接起動(test2.exe)する事は可能でしょうか。

F-BASICのみでは無理だと思います
私はアセンブラ及び機械語は分かりませんが私の知識内での話をします
コンパイル済のEXEファイルをバイナリエディタを使用しF-BASIC(test1)が終わった所で
000F000へジャンプする命令を書き換えればいいとは思いますが…
ウイルス(現在はワームもウイルスと言いますがワームでは無くウイルスの方です)の
作り方と似ているのでその辺りを参照すれば分かるかも知れません

あ。書いてる途中で思ったですが2つ目のプログラムは起動出来ない(もしくは暴走)かも

test2.exe内に先頭から何バイトにジャンプの様な命令が無い訳が無い。
test1.exeを先頭に入れればジャンプする位置はずれるので暴走すると思われます
(おそらくですが2つ目を実行出来ないのには他にも理由がいくつかあると思われます)

さて。1つのファイルにしなければならないのでしょうか?
1つのファイルですが途中で2つ目を準備し後で2つ目削除…え〜と…

test1.exeとtest2.exeを合体。test1.exe終了直前に、test2.exeをtest1.exeより取り出し
test2.exeを作成。test2.exeを実行。そのtest2.exe終了後test2.exe削除。なら可能と思いますが…

382F-BASIC愛好者:2006/03/18(土) 01:43:24
>>381
返信ありがとうございました。
問い合わせをしましたら、アドレスを指定して起動する命令はF-BASICではない事を
確認できました。1つのファイルにしようと思いましたのは、F-BASICと同じ様にVB
にして実行しました。しかしF-BASICでは良かったのでしたがVBでは異なる動作が
一部ありました。それにより1つのファイルにしようと思いました。

383ま。:2006/04/15(土) 21:26:14
FbasicV6.3でWindowsXPの音声合成は使用できますか?
サポート外ではありますが、おわかりになられる方がいましたら、
ご教授お願います。

windowsXPでは、音声認識・合成機能が入ってるものがあります。
(入ってなくても、マイクロソフトからダウンロードできるようです)
この音声合成機能を、V6.3で使用する事は可能なのでしょうか?

簡単に言うと、パソコンから任意の言葉をしゃべらせたいのです。
例えばタイマーソフトで「時間ですよ!」とか、いろいろな
言葉をしゃべらせられると良いのですが。

よろしくお願い致します。

384nisii:2006/04/16(日) 02:53:10
Microsoft Speech API 5 を使えるかってことでしょうか?
資料は Speech SDK5.1 をダウンロードしてみましょう。
http://www.microsoft.com/downloads/details.aspx?FamilyId=5DAAE9C4-188C-4547-A9D6-1671132A39A1&amp;displaylang=en

OLEコントロールのようですが、F-BASICで動作させるのはかなり無理があると思います。

385ま。:2006/04/16(日) 21:27:56
そうです。
音声認識(音声合成)のプロパティで日本語が合成できるのに、
この機能がF-BASICで使用できないのは残念ですね。
そもそも、この機能の使い方も分かりませんが。
せめてクリップボードを読み上げてくれれば、F-BASICで使用できるのにと。

386素人ドンペイ:2006/04/23(日) 03:07:57
すみません、私は素人の素人です。どうも理解できないのです。
F-BASICV6.3の入門書42ページに変数の共有のことが書かれています。

プログラム例

declare functionn F1(A)
A=10
print F1(A)
stop
end

function F1(P)
A=A+2
F1=A*P
end function

実行結果
20

となっていますが、関数らしきものが使っているそうですが、このプログラムの流れがよく分からないのです。

1行目にdeclare functionn F1(A)と宣言されて、その後、function F1(P)があるのですが、このPの変数がどうなっているのか、プログラム自体が全然分かりません。
お手数ですが、ゼロのゼロから教えて下さい。

387名無しさん:2006/04/23(日) 04:20:00
>>386
変数の有効範囲(スコープでしたっけ?)と関数が分かりにくいのでは?(私もそうなんですが…)
全てがグローバル変数(インタープリタで多いBASICでの変数。N88BASICなど)で
関数等の定義をしない場合は下記の様な感じになります

MAIN_A=10
P=MAIN_A : GOSUB *F1
PRINT F1_RET
STOP
END

*F1
F1_A=F1_A+2
F1_RET=F1_A*P
RETURN

388名無しさん:2006/04/23(日) 04:40:30
>>387の続きです

10 declare functionn F1(A)
110 A=10
120 print F1(A)
130 stop
140 end
200 function F1(P)
210 A=A+2
220 F1=A*P
230 end function

>function F1(P)があるのですが、このPの変数がどうなっているのか、プログラム自体が全然分かりません。
まず確認から。110行から140行の変数Aと200行から230行の変数Aは別です
110行から140行の変数AはメインルーチンのA。例えば MAIN_A という変数で
210行から230行の変数AはF1関数のA。例えば F1_A という変数で、同じAという変数名でも違うものです
変数の有効範囲もしくはスコープなどで調べると分かるかも知れません
例えば。PROG1.BASで使われている変数AとPROG2.BASで使われている変数Aは名前は同じでもそれぞれ別の数値を管理します
これと同様に1つのプログラム内でも110行から140行で使うAと200行から230行で使うAと別々に扱われます
全体(110行から140行)で使うAと関数内(200行から230行)で使うAという感じで別々で管理されます

話を戻して…

>このPの変数がどうなっているのか、

120 (略)F1(A)
200 function F1(P)



120 XXX=A : GOSUB *F1
200 *F1 : P=XXX

と思って下さい

120 F1(変数1)
200 function F1(変数2) ' ← 内部で変数2=変数1を行っています

上記の説明で分からない点あればどこが分からないか教えて頂ければ再度ご返答します
質問内容から悩んでいる点が3カ所程度考えられますので。

389素人ドンペイ:2006/04/23(日) 11:59:28
>>387

ご返答ありがとうございます。

下記のプログラムですが、私流で解釈しますと、

MAIN_A=10       '変数MAIN_Aに数値の10を設定    
P=MAIN_A : GOSUB *F1 '変数Pに変数MAIN_Aを代入(P=10) *F1へジャンプ 
PRINT F1_RET      'F1_RETの値を表示
STOP          'プログラム終了
END

*F1          
F1_A=F1_A+2      '変数F1_Aに数値2を足す 
F1_RET=F1_A*P     '変数F1_RETにF1_AとP(=10)かけた数値を代入
RETURN         'GOSUB *F1の次のところへリターン

プログラムの流れとしては、こんな感じで理解してよろしいでしょうか?
ただ一点の疑問は、F1_Aは数値ゼロ?、つまり
定義されていないF1_Aは数値ゼロとみなして構わないのでしょうか?
素人のへんなこだわりかもしれませんが、ご教授願います。

390素人ドンペイ:2006/04/23(日) 13:13:34
>>388

120 F1(変数1)
200 function F1(変数2) ' ← 内部で変数2=変数1を行っています

えーと、この情報でなんとなく分かったような、分からないようなって感じです。
もやもやをイッキに氷解したいので以下のプログラムも私流で解釈しますと


10 declare functionn F1(A) 'F1(A)のプロシージャ宣言 行200へジャンプ
110 A=10            'A=10を代入
120 print F1(A)       'F1(A)の数値を表示
130 stop            'プログラムストップする。
140 end 'プログラム終了
200 function F1(P)       'F1(A)のAをPへ内部変換
210 A=A+2           '変数Aに2を足す(A=10ではなくゼロ?)よってA=2
220 F1=A*P           '変数F1にA=2とP=10(なぜ10?)をかける よってF1=20
230 end function        '行110へ

流れはそんな感じだと私は思っています。

行10から行200 へジャンプするときはA=10と認知してないから
行210ではA=0としているんだと考えているのですが、それでは行220ではなぜ?
P=10と認知しているのか?理解できないのです。
くだらない疑問ですが、またご教授願います。

391プルプル:2006/04/23(日) 21:06:26
F-BASIC6.3を使用してあるデータ処理プログラムを作成・使用しています。
そのプログラムではバーコードリーダーから入力した文字を元にデータファイルを
オープンしています。通常PCを直接操作する必要が無いため見えない場所に
置いてあり、そのため該当アプリケーションがアクティブになっていない場合
バーコードリーダーからアプリケーションにデータを入力できないことになります。
バーコードリーダーからデータを入力するタイミングはシリアルポートから
別途渡されるためこれをトリガーにしてウィンドウをアクティブにしたいのですが
SETFOREGROUNDWINDOWなどを使ってもなかなかうまく動作しません。ネットにて
検索してもアクティブなアプリから別のアプリをアクティブ化することは
可能ですが、非アクティブなアプリが自分自身をアクティブにする方法が
わかりません。一部ではWin98or2000以降からの仕様らしいのですが、WinXPでは
SETFOREGROUNDWINDOWで切り替わるPCとタスクバーが点滅するだけのPCがあり
単に仕様だけの問題なのかも良くわかりません。出来ればOSはWin98,2000,
XPpro(日本語、英語版)での対応を考えています。良い知恵がありましたら
ご教授お願いいたします。

392F橋:2006/04/24(月) 03:29:57
>>389
>プログラムの流れとしては、こんな感じで理解してよろしいでしょうか?
その通りです

>ただ一点の疑問は、F1_Aは数値ゼロ?
その通りです

>210 A=A+2           '変数Aに2を足す(A=10ではなくゼロ?)よってA=2
問題なく理解されてますよ。「A=10ではなくゼロ?」←これもその通りです

>10 declare functionn F1(A) 'F1(A)のプロシージャ宣言 行200へジャンプ
>200 function F1(P)       'F1(A)のAをPへ内部変換
>210 A=A+2           '変数Aに2を足す(A=10ではなくゼロ?)よってA=2
>220 F1=A*P           '変数F1にA=2とP=10(なぜ10?)をかける よってF1=20
>
>行10から行200 へジャンプするときはA=10と認知してないから
>行210ではA=0としているんだと考えているのですが、それでは行220ではなぜ?
>P=10と認知しているのか?理解できないのです。
>くだらない疑問ですが、またご教授願います。

>行10から行200 へジャンプするときはA=10と認知してないから
認知していません。ここは「F1という関数がこういうルール」という宣言だけでありジャンプはしません。

10 declare functionn F1(A)
10 declare functionn F1(B)
10 declare functionn F1(XXX)
10 declare functionn F1(HENSUU)
10 declare functionn F1(SEISUUGATA)

↑全部同じ意味です。(10行のみを↑に入れ替えてもプログラムは同じです)

F1(A) のAは整数型の1つの変数が必要と宣言するだけです
()内に整数型1つの変数が入るのを指示するだけです
関数を定義する(作る)事が出来ますがその関数にはどの変数が必要というのも定義する必要があります
今回は F1(x) ですが。xが無いと F1(x$) なのか F1(x,y)なのか分かりませんよね?
1つの変数がいるのを指示(定義)するだけです

例えば線を描く関数。PSET(X,Y)の様に定義されています。されていますが
PSET(AX,AY)やPSET(A,B)、PSET(10,10)と書いたりしますよね?
定義されている変数と実際に使う変数は違います
declare funcion PSET(X,Y) は PSET(数値型の変数,数値型の変数) と定義していると同じですね

>10 declare functionn F1(A) 'F1(A)のプロシージャ宣言 行200へジャンプ
変数Aを必要とする関数の定義。ではありません。変数Aの型を必要とする関数の定義です
Aは型を指示する為だけに使われこれ以外の処理の変数Aとは全く関係ありません

↓10行を function F1(B) の様に ()内をBに変えました。意味は同じです

>10 declare functionn F1(B) 'F1という関数を宣言。F1はBと同じ型の変数を引数とする
>200 function F1(P)       'F1() の ()内の変数の値を Pに代入
>210 A=A+2           '
>220 F1=A*P           '

210行のAは内部で F1_A と扱われると思って下さい。F1関数以外での変数Aとは違う変数で扱われます
F1_Aは初めて使われる変数になるので初期値が0になっています
プログラムをRUNすると全ての変数が初期化(数値の場合は0)になりますが
関数の場合は呼び出された時にRUNと同様初期化されるので210行は A=A+2 は必ず 2になります
(この関数を2回呼んだから以前の内容を覚えている。という訳ではありません)

う〜ん…うまく説明できない…
私もそうだったんですがこの辺りは旧BASICユーザーが分かりにくい部分の1つだと思うんですよね
関数のスコープとか関数の定義とかで検索してみてもっと分かりやすく説明しているサイトを探してみます

393F橋:2006/04/24(月) 03:45:30
>>391
>バーコードリーダーからデータを入力するタイミングはシリアルポートから
>別途渡されるためこれをトリガーにしてウィンドウをアクティブにしたいのですが
方法があるかも知れませんが少なくとも私にはシリアルポートからの入力時にアクティブにする方法は分かりません

>SETFOREGROUNDWINDOWで切り替わるPCとタスクバーが点滅するだけのPCがあり
SETTOPMOSTWINDOWでも駄目なんですよね?

環境が良く分からないので(他のソフトが毎回動くのか。たまにしか動かないのか。もしくは
バーコード入力が毎回なのか1時間に1回なのか。等により違いますので)最適な説明言えませんが
たまにフォーカスがズレるのでたまに(数秒〜数十秒に1度フォーカスを自分に戻したい)のならば
フリーソフトでマウス操作のマクロを作る事が出来るものがあるのでそれを使う手もあるかと思います

マウスを操作せずに。一定時間毎にマウスをどれだけ動かしボタンを押す。という操作を
(あたかもマウスが操作されたかの様に)予約できるフリーソフトがあったはずです

数秒に1回から数十秒に1回程度のタイミングでアクティブにするのなら可能と思われます
(これでいいのならばVectorで探してみます)
逆に常時アクティブ(一瞬たりともアクティブにならない時間があってはならない場合)には難しいと思います

394iwakifarm:2006/04/24(月) 19:02:17
fuctionにいくとAはグローバル変数ではないから、
MAINでA=10としてもfunction,subではAの値は不定か、ゼロになります。
どうしてもfunction等でAの値を使用したいならばINTEGERもしくは
DIM A
と宣言すればfunctionでa=10が使えます。

395プルプル:2006/04/24(月) 21:08:41
F橋さん、レスありがとうございます。
環境が分かり難かったですね。勤務先の工場で生産設備に使用してるPC用のアプリが今回の
案件です。PCはシリアルポートでPLC(と呼ばれる機械のコントローラ)に接続されていて、
PLCからの要求によりPC側のアプリはバーコードリーダーの入力待ちになります。
この時PC側のアプリのメインフォームがアクティブになっていないとバーコードリーダーからの
データが渡せないことになります。PCはWin98、Win2000、WinXP-Proと時代によって
使用OSが変わっています。また、近々海外工場へ設備をもって行くのでWinXP-Pro(英語版)への
対応も必要な次第。PCはノートで設備の中に入れているため通常は直接操作する必要は無く、
アプリもこのソフトのみですが、ウイルス対策ソフトなどが常駐しています。
アプリの起動はスタートアップから行っておりますが、常駐ソフトの起動タイミングの影響か
肝心のアプリのフォーカスが落ちてしまうPCがあります。また、オペレータがPCを操作しないとも
限らないため、PLCからバーコード読み取り要求があったらとりあえずアクティブにしたい訳です。

>SETTOPMOSTWINDOWでも駄目なんですよね?
最前面には出ますが、アクティブにならないのです。Win98以降の仕様らしくアクティブな
スレッドからじゃないとウィンドウを切り替えられないなどの条件があるようです。

>マウスを操作せずに。一定時間毎にマウスをどれだけ動かしボタンを押す。という操作を
>(あたかもマウスが操作されたかの様に)予約できるフリーソフトがあったはずです
上記のような方法も考えましたが、今ひとつスマートじゃなくて・・・
奥の手に取っておきます。

今日もネットを彷徨っているとアクティブなアプリの入力処理機構にアタッチして・・・
という方法があるようなのですが、ほとんどがVBやVCなどのサンプルでFBでどのように
実装していいものやら・・・APIの使い方を理解していないもので(^^;

http://www.microsoft.com/japan/technet/prodtechnol/winxppro/deploy/exappmigratoxp.mspx
にサンプルがあるのですがFBではどのような実装になるのでしょう?
Webページ内をAttachThreadInputで検索してみてください。

お手数ですが、よろしくお願いいたします。
これを機にWindowsプログラミングを基礎から勉強しなくてはと思う今日この頃・・・

396素人ドンペイ:2006/04/24(月) 22:42:51
本当によく分かりました。F橋さん、ありがとうございました。
かなり勉強になりました。
今回の件をステップにして、F-BASICを少しでも使えるようにがんばります。

で、今は、野球のスコアブックみたいなものを作ろうかと考えています。
グランドを作成し、ボールの飛んだ位置(グランドのある地点)をクリックしたら、
スコアシートに自動的に書き込んでくれるようなものを、、、、と
本当は、ネットでサンプルプログラムが落ちていればと思っているんですが、
甘くないですねー。

397nisii:2006/04/24(月) 23:43:39
>>395
>http://www.microsoft.com/japan/technet/prodtechnol/winxppro/deploy/exappmigratoxp.mspx
>にサンプルがあるのですがFBではどのような実装になるのでしょう?
>Webページ内をAttachThreadInputで検索してみてください。

TOKOさんのサイト
ウィンドウを最前面に表示(Ⅱ)異なるAPP間
http://tokovalue.hp.infoseek.co.jp/index.htm

上記のままでは失敗することがあるので、下記も参照してください。
http://karura.dynsite.net/~kjinc/?date=20040910
http://techtips.belution.com/ja/vc/0012/

398プルプル:2006/04/25(火) 08:43:05
>>397
nisiiさん、レスありがとうございます。
教えていただいたHPを参考にして何とか解決することが出来ました\(^o^)/
また何かありましたらよろしくお願いします。

399F橋:2006/04/26(水) 02:40:58
プルプルさん>
私は旧BASICの知識があるだけでWindowsのBASICの機能のDLLとかAPIとかは非常に弱くて・・
これ以上は分かりません。
DLLやAPI関連は私もnisiiさんや他の方々にご指導頂きましたのでnisiiさんとか皆さんを頼ってみてください(笑

nisiiさん>
これ以上分からなくて…助かりました
話変わりますがTOKOさんのサイト見覚えがある様な無い様な…
ともかくこんなに情報量の多く凄いサイトのリンクが無いのはまずいので早めにTOPページからリンクしようと思うです

400F橋:2006/04/26(水) 03:10:15
>>396
素人ドンペイさん>
>本当によく分かりました。
私の下手な文章でご理解頂きありがとうございます!(笑

>で、今は、野球のスコアブックみたいなものを作ろうかと考えています。
>グランドを作成し、ボールの飛んだ位置(グランドのある地点)をクリックしたら、
>スコアシートに自動的に書き込んでくれるようなものを、、、、と
私がスコアブックがどの様なものかがほとんど分かりません
(なんとなく分かる程度…ボーリングのスコアをもっともっと難しくした感じだったと記憶してます(笑))
ただF-BASICの勉強としては凄く最適な素材な気がします
仕事で組む場合なら辛いでしょうが趣味や勉強としてなら最高の素材に思えます
サンプルプログラムが無いとの事でしたがいくつかお話させて下さい
(スコアブックに関係なく何かをソフトにしたい。という時に役に立つと思います)

自分の望んでいるソフトの100%のサンプルは無いと思って下さい
難しいのですがうまくそのソフトをうまく分割しそのサンプルを探してみて下さい
例えば。今回の例ではマウスでクリックするサンプル、入力を出力するサンプル。等です

次に妥協点を探して下さい。
全てが備わった難しいソフトの完成では無くとりあえずこの部分だけ形にする。を目指して下さい
例えばマウスでクリックするとファーストとテキストに表示するだけのプログラム
(テキストに表示した後に自分で文字を入力するスコアシート補助プログラム)
そこから改良して行くといいかと思います

100%ソフトでは無く。20%ソフトを目標に自分の分かりやすい範囲から始めて頂き
慣れて頂きレベルアップして頂くといいと思います。

尚。難しい話は私では分かりませんのでnisiiさんや他の人を頼って頂くのを強くお勧めします(おい(笑
(私は基礎的な所しか分かりません。私も皆さんにたくさん教えて頂いたです。…ここの管理人なのに(笑))

401おくて:2006/05/16(火) 17:03:39
はじめまして
今頃、F-BASIC にホレコミマシタ。おくてなもんで
どなたか、V6.3 譲っていただけませんでしょうか?
マニュアルはコピーでもO/K、きれいなほうがありがたいです。
もうチョット早く気がつけば、バージョンアップできたんですが
残念!

402nisii:2006/05/17(水) 23:35:12
通販で求められてはいかがですか?

在庫を持ってそうなビックカメラとか。
http://www.biccamera.com/bicbic/jsp/w/catalog/list.jsp?FREE_SEARCH=F-BASIC&amp;SORT=2

403おくて:2006/05/18(木) 01:33:23
>> 通販で求められてはいかがですか?
>> 在庫を持ってそうなビックカメラとか。

> nisiiさん ありがとうございました。
> まだ売っていました、ビックカメラの通販で!!!
> おかげさまで、やっと新品買えました。
> 何日も、何日も、探しまわっていたので・・・・・
> ヤ〜、うれしいな〜、ウレシイ!、ウレシイ!、ヤッホ〜

404ロディマス:2006/05/24(水) 22:37:52
http://www.freebasic.net/
http://fbide.sourceforge.net/
http://gamdev.org/w/?%5B%5BfreeBasic%5D%5D
このフリーベーシックが大変良さげです。
F−BASICの文法がほとんどそのまま使えます。
また、F−BASICの数倍早く動きます。C言語並です。

405F橋:2006/06/01(木) 03:18:49
おくてさん>
F-BASIC手に入れられた様でおめでとうございます!

さて。今更無理なんですがささやかな抵抗として。トップページのF-BASIC Ver7お願いします!の署名欄に
おくてさんも掲載させて頂けませんか?
現在ここのメールアドレスが使えませんので。掲示板で。掲載したいハンドルネーム(おくてさんでいいでしょうか?)と
もしVer7が発売されたら購入予定の本数をご指導頂き署名に参加する旨を掲示板で連絡頂ければ掲載させて頂きます

ロディマスさん>
海外でF-BASICというとFreeBASICを指すくらい有名で使いやすい言語らしいっすね
私も浮気しようと何度も思ったです(笑
あと。ActiveBASICにも浮気しようと思ったです
あ。まだあります。99BASICも用途限定ですがお勧めです。
99BASICはファイルのオープン数などに制限がありますがインタープリタなのになぜか高速に動きます
(プレイステーションのプログラマが作ったゲーム作成可能の速度が出るインタープリタです)

さて。個人的にVBは好きでは無い。好きでは無いんすが仕事する上ではやはり必要になってきてます
仕事を視野に勉強される方にはVB.netもお勧めしなければならないっす
VB.netには現在フリー版(無料版)のExplessが存在します
アドレス忘れました。Visual BASIC .net expless等のキーワードで検索してみてください

VisualBASIC .net Ver2003 スタンダード が1万円程度の有償でした。が。
VisualBASIC .net Ver2005 Expless が無料でスタンダード並に使う事が出来ます

Ver2003スタンダード(及びVer2005)とProの違いはクリスタルレポートがあるかどうかがメインで…と。
話長くなるし相違点はいくつかあるので省略させて頂くです

406F橋:2006/06/01(木) 03:29:27
ひとりごとです。
現在VB.netに奮闘中です

シンプルなグラフィックだけどテキストで全て表す事が出来るF-BASIC(N88BASICなど過去のBASIC含む)に比べ
グラフィック的にはいいんですが表を出すだけでも(フォントの幅が違うので)どうやって作成しようか悩んだりしてます

表を作る前にテストをしようと思い。テキストファイルを表形式に表示。の前にテキストファイルを読もうとしました

open "dummy.txt" for input as #1 : while not eof(1):line input #1,buf$:print buf$:wend

↑これが使えません
BASICの規則から外れているはずなのにBASIC名乗っているのはなぜ!?と思ったりしてます

F-BASICやN88BASICはマニュアルとサンプルがあればほぼ思い通りにプログラム出来ます
VB.netは数冊の本を購入し調べてるんすけど未だに作りたいもの(表が作りたいだけなんです)が作れません(涙


旧BASICでは20〜30種類程度の命令を覚えれば大半の事が出来ると思います
ですがVB.netの場合は20〜30冊の本を読まねば大半の事が出来ない気がします(笑

何というのか…世間の流れ的に違和感がある気がしてるです

グラフィックのプログラムはまだ始まったばかりだと思います
数年先。VB.net簡単バージョン。VB.netに比べ1/100くらいの簡単さ。(代わりにVB.netの8割くらいの機能)
なんて言語が出てきそうな気がするんすけどね〜
(ある意味Accessですが。データ基準のAccessでは無く。実行結果を求める様なAccessと言えばいいのか…)

20年くらい前のMS-DOSのC言語とBASIC。C言語の8割くらいの機能しか無いBASICだけど1/100くらいの命令数で
(速度はいまいちとは言え)C言語の8割が出来たと思います
数年したら驚く様な言語が出るのを期待してるんすけどね〜
(ただ。MSが一番の現在。競争相手がいない現在ではそれが難しいかも。とちょっと思ってますけどね)
((ある意味JAVAがあてはまるのかも知れませんね))

407ぶるぶる:2006/06/02(金) 17:31:29
freebasicちょっと触ってみました。確かに処理速度早いですね。
作成されたexeファイルのサイズ自体も小さいかも。
ただ…構造化プログラミングの概念がない言語なのかもしれません。

408F橋:2006/06/14(水) 01:55:30
FREEBASICを触った事は無いのですが…他の方から似た様な意見を聞いた事があります
評判いいみたいですね

409名無しさん:2006/06/15(木) 15:01:59
F-BASICでウインドウを任意で大きさ変えられないようにする(デフォのまま
で固定する)方法ってありますか?
基本的なプログラム以外はよくわからないもので。。。

410akira:2006/06/15(木) 19:28:02
mainformのプロパティでフレーム種類をダイアログフレームにすると
固定になります。

411409:2006/06/16(金) 03:08:41
>>410
ありがとうございます。今までその辺全くいじってませんでした。

412小川:2006/06/18(日) 10:07:40
F-Basicでwebのhtmlを呼び出す方法が解りませんので教えて下さい
とりあえず急ぎで方法が知りたいのでよろしくお願いします。
http://www.geocities.jp/bio_balance_harmony/

413nisii:2006/06/18(日) 23:32:42
SHELLEXECUTE で呼び出せますよ。

414初心者:2006/07/10(月) 11:17:17
漢字入力としてATOKを使っています。

ATOKの機能として単語登録が有り、よく使う、または業界の特殊単語を登録します。

漢字を打ち出す際、ローマ字入力すると窓にいくつかの候補が出、その中から選択します。

ワープロには外字登録機能があり、業界特有の外字を外字登録します、一太郎、Excel、Word等は漢字の候補を示す窓に外字登録されて文字がそのまま表示されますが
F-BASIC V6.3は外字の部分が・で表示され、なんと書いているのはわかりませ。

解決方法を教えて下さい

415nisii:2006/07/10(月) 22:18:14
>>414
外字は使ったことありませんが、Unicodeなのでは?
F-BASIC内部ではShift-JISが基本になるため、Unicode表示はサポート外です。

416YUTTA:2006/07/20(木) 01:10:18
おひさです。またしても質問なんですが、APIでメール送信を
やってたんですが(某TigayaさんのHP参照)、最近いつのタイミング
かわからないんですが、「ソケットの接続に失敗しました」で、
エラーになってしまいます。APIがかわっちゃったんでしょうか?
どなたか、対処法ご存知のかたいましたらご教示お願いいたします。
<(_ _)> 宜しくです。 YUTTA

417TOKO:2006/07/20(木) 06:59:46
YUTTAさん>
お久しぶりです。
Ws2_32は、使ったことがなかったので、検証報告のみ・・
そのプログラムを走らせてみましたが、正常に送ることが出来ました。
WindowsXP_HE、Ws2_32.dllバージョン5.1.2600.2180

418TOKO:2006/07/20(木) 12:25:57
YUTTAさん>
下記のような場合もあるようです。
ウィルスバスター2006をお使いの場合
メールを送信する際、「外部に接続しようとするプログラム/・・・」が表示された場合
一度「接続を拒否」を実行した場合、[接続を拒否] ボタンをクリックすると、このアク
セスはブロックされ、以降は同じ種類のアクセスがすべてブロックされます。

パーソナルファイアウォール→プロファイルの設定→該当ネットワーク→編集
→例外ルール(ここの一覧の該当EXEにチェックが入っている)

419YUTTA:2006/07/20(木) 22:29:36
TOKO様>
いつも親切にご指導頂きまして、TOKO様には感謝感謝です。 <(_ _)>
ソースネクストのウイルスセキュリティーを使っています。
もう一度打ち込んだリソースをチェックしなおし、更にウイルス・ソフト&
ファイヤーウォールについて検討してみます。ありがとうございました。
私と違う環境のヒトではうまくいったり・・・、で、ちょっと悩んでいました
ので、もしかして、セキュリティー関係かもですね・・・。"^_^"
がんばりますです。 (^^ゞ

420YUTTA:2006/07/21(金) 19:20:46
TOKO様>
何度もすみません。<(_ _)>
TOKO様ご指摘のとおり、ウイルス・ソフトが原因でした。 (ToT)
以前使っていたものでは何も問題なかったのですが、
メインのPCが変わり、ウイルス・ソフトも・・・。
目から鱗・・・原因がこちらのPC環境とは・・・。(ToT)
ホントニ、度重なるご指導ありがとうございました。<(_ _)>

421名無しさん:2007/01/26(金) 19:57:39
FM-7のFBasic関係の資料はどこのサイトを参考にしたらいいですか?
検索しても見つからなくて昔の資料も無いので、もしありましたら教えて下さい。

422二股男:2007/02/16(金) 00:02:44
Visual Basicを勉強しようと思い、VisualStudio2005ProfessionalをインストールしたらFBASICV63
内の.MAKを開こうとするとVisualStudio2005側のメッセージが出てきます。
共存する方法はありますか。Vbasicは全く初心者ですが

423名無しさん:2007/02/19(月) 22:44:23
>>422
ファイルの拡張子 .MAK、.BAS、.FRMなどのファイルがVisualBasicと重なるので。
VisualBasicに関連付けられた状態かと思います。

とりあえずの回避方法としては、
 F-BASICをWindowsのスタートメニューなどから起動して、
ファイル(F)メニューの開く(O)を選択、
ダイアログのファイルの種類欄で プロジェクト(.MAK)に変更して
.MAKのファイルを開く。


解決方法としては、
A. F-BASICを再インストールして、再度F-BASIC側に関連付けさせる。
B. 手作業で.MAKの関連付けをF-BASICに設定変更する。
のいずれかの方法になると思います。

424kuri:2007/02/20(火) 19:01:10
**.MAK を F-Basicから開く方法。
右クリックから「プログラムから開く」、そしてF-Basicを選ぶ。
もしF-Basicが出なければ、「プログラムの選択」からF-Basicを選ぶ。
この時、「この種類のファイルを開く時は、選択したプログラムをいつも使う」にチェックを入れておけば、MAKファイルを開く時、デフォルトでF-Basicが起動するようになります。

425後追い男:2007/02/21(水) 23:18:45
本当にありがとうございます。

426DOSD:2007/02/22(木) 02:44:17
VBもF-BASICも同じ拡張子を使うのでSendTo(送る)を使ってみては如何でしょうか?
私は拡張子TXTは標準のメモ帳のままですがSendToにエディターを入れて
右クリックの送るからエディターを起動できる状態にしメモ帳とエディターを使い分けています

427kuri:2007/04/01(日) 15:35:14
f-basicでの質問です。
宛名ソフトでよくあるのですが、名前を入力して漢字変換後、
ヨミガナに自動的に入力するのは、できるでしょうか?
よろしくお願いします。

428TOKO:2007/04/01(日) 16:40:03
kuriさん>
F-Basic掲示板に書き込みがあると、ホッとしているTOKOです。
ヨミガナについては、APIを使用することで実現可能です。
*ttp://tokovalue.hp.infoseek.co.jp/の「フリガナ取得」に
一例を紹介しておりますのでご覧ください。

429kuri:2007/04/01(日) 21:28:50
TOKOさん、さっそくにありがとうございました。
すごい内容の充実したサイトですね。
試してみました。
ただ、入力の途中で区切ると後半だけの分しか残らないのですね。
研究してみます。

それから、またお願いなのですが、
エンターキーで入力項目を移動するという、よくあるパターンですが、可能でしょうか。
メーカーサイドのアナウンスでは、不可能だったと思うのですが。

430TOKO:2007/04/01(日) 23:17:35
「Enter」によるコントロール間移動

Ⅰ.ニャン子さんの「F-Basic Programming Life」
 *ttp://www.geocities.co.jp/SiliconValley/1223/mainmenu.html
 9.【番外編】ウィンドウメッセージを横取りする
 を、利用させていただく・・・

Ⅱ.ここのHPトップの
 ★エディットボックスでエンター移動★(gobou氏)

Ⅲ.昔どなたかが発表されていた方法

#Define CrLf$ Chr$(13, 10)

Declare Sub Edit1_Change edecl ()
Sub Edit1_Change()
Ed1$ = GetDlgItemText("Edit1")
EPos = InStr(Ed1$, CrLf$)
If EPos <> 0 Then
Ed1$ = Mid$(Ed1$, 1, EPos - 1) & Mid$(Ed1$, EPos + 2)
Edit1.SetWindowText Ed1$
Edit2.SetFocus
End If
End Sub

※EditBoxのプロパティ設定
 複数行入力→あり
 文字数制限→目的文字数+2(CRLFの2文字分)
 垂直オートスクロール→あり

などがあります。

431kuri:2007/04/02(月) 22:41:44
TOKOさん、またまた有難うございます。
御礼が遅くなりすみません。
風邪を引いてしまい、咳が強くて困っています。
まだ、試していませんが、じっくりと研究してみます。
複数行入力ありって、面白い発想ですね。
また、よろしくお願いします。

432ハル2183:2007/04/03(火) 12:45:33
あるフォルダー内のファイル名を全て変換したいのですが、教えていただきませんか?
例)track1.mp3→恋ものがたり.mp3

433nisii:2007/04/04(水) 01:34:38
どういう状況で困られているのかが、分かりません。
つまづいている点を、具体的に書いていただけませんか?

434あった:2007/04/22(日) 23:55:08
F-Basicのことを誰に聞いていいのかわからず、
ネットを見ていたらこんなに充実した掲示板があるなんて!!
よかったら仲間に入れてください。
Q:mainformのクローズボタンを押した後、
クローズを取り消すにはどうしたらよいのでしょうか?
QUERY_CLOSEのイベント内で処理できますか?
お願いします。

435nisii:2007/04/23(月) 04:42:47
この掲示板トップの「F-BASIC掲示板(雑談歓迎)」でメインサイトに戻り、
「アプリケーションを閉じさせない」を参考にしてください。

436あった:2007/04/23(月) 22:55:22
nisiiさんありがとうございます。すでに書かれていたんですね。

437kuri:2007/06/01(金) 03:54:23
すみません、教えてください。
HTTPOPEN(CLOSE) や HTTPGET は、独立型では使えないのでしょうか。
コンパイルすると、こんなエラーが出ます。
MAIN.obj : error LNK2001: 外部シンボル "_FB$HTTPOPEN@8" は未解決です
MAIN.obj : error LNK2001: 外部シンボル "_FB$HTTPGET@16" は未解決です
MAIN.obj : error LNK2001: 外部シンボル "_FB$HTTPCLOSE@4" は未解決です

プロジェクト環境のライブラリーで、次のように表記されますが・・・
「インターネット拡張ライブラリー(独立型はサポートされていません)」
どこかに、ライブラリーは、あるのでしょうか。

438nisii:2007/06/01(金) 21:56:54
>>437
この場合、独立型はサポートされませんので、ランタイム型でコンパイルしましょう。
別のPCで実行する場合は、ランタイムファイルを実行ファイルとともにコピーします。
私がよく使うのは次の4つです。

F1A0RN63.DLL 基本命令2
F1A0LF63.DLL ファイル拡張
F1A0RW63.DLL ウィンドウ拡張
F1A0RI63.DLL インターネット拡張

ライブラリファイルはF-BASICインストールフォルダの\LIBにあります。

439kuri:2007/06/01(金) 22:58:03
nisiiさん、ありがとうございます。
やはり、独立型ではサポートされていないのですね。
なんだか、詐欺に遭った気がします。
F-BASICでありがたいのは独立型が簡単に作れた事ですが、ちょっと残念です。

440kuri:2007/06/01(金) 23:29:29
nisiiさん、たびたびすみません。

F1A0RN63.DLL 基本命令2
F1A0RW63.DLL ウィンドウ拡張
F1A0RI63.DLL インターネット拡張
この3ファイルは、system32 にありましたが、
F1A0LF63.DLL ファイル拡張
このファイルは、どこにも見つかりません。
もし、存在場所をご存知でしたら、教えてください。

441hill:2007/06/01(金) 23:34:54
いまさらなんですが・・・F-BASICって手に入らないでしょうか?

442nisii:2007/06/02(土) 02:15:08
>>440
あ、書き間違いがありました。ごめんなさい。
>>438 の4つは.DLLではなく.LIBです。
F1A0LM63.LIBは、実行ファイルに組み込まれます。

443nisii:2007/06/02(土) 02:15:52
>>441
オークションとかで気長に待つしかないかも、です。

444kuri:2007/06/02(土) 20:07:33
>>442
nisiiさん、ありがとうございます。

結果的に、次の3ファイルが必要という事ですね。
F1A0RN63.DLL 基本命令2
F1A0RW63.DLL ウィンドウ拡張
F1A0RI63.DLL インターネット拡張

445kuri:2007/06/07(木) 19:13:41
>>430
少し古い話で恐縮です。
TOKOさんに教えていただいた方法ですが、
Enterキーの入力では Sub Edit1_Change() に行きません。
何が間違っているのでしょうか。
よろしくお願いします。

446kuri:2007/06/07(木) 19:20:24
>>445
すみません、少し間違いました。
edit1 で 複数行入力を「あり」とすると、Edit1_Change は発生します。
しかし、次の部分で crlf を認識しません。
Ed1$ = GetDlgItemText("Edit1")
EPos = InStr(Ed1$, CrLf$)
よろしくお願いします。

447<削除>:<削除>
<削除>

448TOKO:2007/06/08(金) 17:22:33
kuriさん>こんにちは
あれっ!動きませんか?
コードの一部だけでは、どうなっているか解りませんので
EditBox を3個貼り付けた例を下記にUPしておきます。
*ttp://www.geocities.jp/tokovalue05/EnterMove.htm

449kuri:2007/06/08(金) 22:10:02
TOKOさん、ありがとうございます。
垂直オートスクロール(あり)を忘れていました。

API_GETKEYSTATEを使って、一応解決していましたが、
こちらの方が、妙な音はしないし、スマートで良いです。

あまり F-BASIC を使った事が無かったのですが、思っていた以上に良い言語ですね。
多くのファンが、まだ居られるのが解ります。
継続して欲しかったですね。

450Vista不得意人間:2007/07/17(火) 20:21:39
XPではSETORIGIN 0,0でホームが移動しましたが、同じプログラムをVista上で
動かしても稼働しません。

何か良い方法はありませんか?
(私のバグならお許しください)

451F橋:2007/07/19(木) 02:22:44
>>450
SETORIGIN 0,0 を使った事がありません
数行程度のサンプルソースをここにコピペして頂ければ
1週間以内に私が使っているVistaでの動作をご報告できますが・・

452Vista不得意人間:2007/07/23(月) 15:30:43
#include "windows.bi"
#include "file.bi"
MAXIMIZEWINDOW
close #1
SETFOCUS
SETIMEMODE 2
cls
locate 2,2:print "SETORIGIN 0,0のプログラムです"
locate 2,80'この段階でlocate 2,2:print "SETORIGIN 0,0のプログラムです"が上に消えます

input "お願いします ";Z$
SETORIGIN 0,0
stop:end

******.RCで

#include "f1a0form.h"

// version info ===
FB$VersionInfo RCDATA
BEGIN
// RCDATAITEMHEADER
"FB", 0
0x6, 0x10
END

// 'MAINFORM' form data ===
MAINFORM RCDATA
BEGIN
// RCDATAITEMHEADER
"FB", 1
__BEGIN
__CLASS, "MAINFORM\0", "\0"
__CREATE3, XWT_FORM, 0xff0115L, 0x0L
__ATTRDATA3, 0x0L
__3DFORM3, 0x0L
__REDRAWMODE, RDRW_BITMAP
__TEXTBUFFER, 132, 124
__AXIS3, 0x0L
__WINDOWTITLE, "MAINFORM\0"
__CONTROLNAME, "MAINFORM\0"
__TEXTCOLOR, 0
__FORECOLOR, 0
__BACKCOLOR, 15
__GRID2, 1, 1, 8, 8
__CLIPBOARD, 1
__FONTSIZE, 16
__FONTNAME2, "MS 明朝\0", 1, 44
__SENDMESSAGE, 0x32L, 0x0L, 0x0L //WM_SETHOTKEY
__WINDOWSIZE3, 0x0L, 0x96L, 0x120L, 0x320L, 0x1ceL
__EVENT
__BEGIN
__EV_START, "MAINFORM_START\0"
__EV_END, "MAINFORM_END\0"
__EV_SETFOCUS, "MAINFORM_SETFOCUS\0"
__EV_KILLFOCUS, "MAINFORM_KILLFOCUS\0"
__EV_RESIZE, "MAINFORM_RESIZE\0"
__EV_CLICK, "MAINFORM_CLICK\0"
__EV_DBLCLICK, "MAINFORM_DBLCLICK\0"
__EV_MOUSEDOWN, "MAINFORM_MOUSEDOWN\0"
__EV_MOUSEUP, "MAINFORM_MOUSEUP\0"
__EV_MOUSEMOVE, "MAINFORM_MOUSEMOVE\0"
__EV_QUERYCLOSE, "MAINFORM_QUERYCLOSE\0"
__EV_NOTIFYICON, "MAINFORM_DROPFILES\0"
__EV_DROPFILES, "MAINFORM_NOTIFYICON\0"
__EV_MOUSEWHEEL, "MAINFORM_MOUSEWHEEL\0"
__END
__SHOWWINDOW3, XSW3_SHOWMAXIMIZED
__ENABLEWINDOW, 0
__END
END

でかなり画面の下で表示されてもかならず0,0に戻りそこで初期の画面表示が出来ます

(このままの******.basではlocate 2,80でエラーがでます)

453F橋:2007/07/26(木) 22:55:25
>>452
私は頭が悪いので

>(このままの******.basではlocate 2,80でエラーがでます)
と言われても分かりません(笑)
また、SETORIGINを使った事が無いので正常異常の区別できません

main.basに貼り付けて翻訳実行するだけでいいサンプルを頂ければ
再度ご報告致します

454HongKong_market:2007/11/19(月) 22:47:17
【U003+】
F-BASIC v6.3に対して提供されているアップデートは、公式にはU003までです。
私は2000年当時、富士通に対してバグ報告をしてアップデートのローカル
リリースを受けました。

ドキュメントには「U003+」とあり、SETORIGIN命令とENUMFONTNAMES関数に
冠する不具合が修正されています。

興味のある方はご連絡ください。

455F橋:2007/11/20(火) 03:50:12
>>454
非常に興味があるのでメールで送って頂けませんでしょうか?
2000年前後に同様に富士通からバグフィックスを送って頂いた方が見えてそれを利用していますが
それと比べてみたいと思います

よろしくお願いします

456HongKong_market:2007/12/01(土) 00:04:17
U003+公開】
ローカルリリースされた F-BASIC V6.3向けアップデータ U003+ を下記におきました。
興味をお持ちの方はアクセスしてみてください。

   ttp://bluemarble.jp/fbasic/

457HongKong_market:2007/12/04(火) 19:57:58
【F-BASICマニュアル】
下記の富士通のWebによると、F-BASIC Ver.6.3のマニュアルを
販売しているとあります。

   www.fmworld.net/product/soft/fbasic/books/

実際に FOMダイレクトショップ(0120-818-128)に聞いてみた
ところ、すでに絶版になっているとのこと。
コピーして製本したものならば販売できるが、価格は同じで、
3冊で1万ン千円とのことでした。

電波新聞社が発行している「F‐BASIC V6.3プログラミングのすべて」
という書籍はまだアマゾンでも手に入るようです。
どのような内容なのか、読まれた方はいらっしゃいますか?

   www.amazon.co.jp

458TOKO:2007/12/05(水) 22:53:52
HongKong_marketさん>
U003+をダウンロードさせていただきました。情報ありがとうございます。
私も、何時だったかは忘れましたが、format$ の不具合でリリースを受けた
ことがありました。その後のバージョンでは修正されているのでしょうが、
報告のあった人にだけ修正版を提供(違うかもしれませんが)というのが
チョット引っかかります。
U003+では、>>450 のSETORIGINも修正されているのでしょうかね?
私は、使ったことがないので解りませんが・・

HAMの方でもご活躍のようですね。私は10年ほど前から局免を更新していません^^;)
JA8KIL ex JA1WGR
TOKO

459F橋:2007/12/06(木) 01:07:46
>>456
メール送りましたのでご確認頂けると助かります

>>457
F‐BASIC V6.3プログラミングのすべて持ってます
BASIC初心者もしくはWindowsBASIC初心者がF-BASICで楽しく勉強したい方に特にお勧めです
BASICの文法、ボタンを押して表示、画像の表示や編集、データベースへの接続、FTPやHTTPのサンプルなどです
仕事でプログラムをしている方でマニュアルやサンプルを一通り見ている方なら不要かも知れませんw
(F-BASICのマニュアルとサンプルは非常に充実しているので)
ただし見やすい分かりやすいなどは確かで私は買って損は無いと思っていますよ

nisiiさんやニャン子さんのような方はいらないと思います(笑
仕事でプログラムしている私ですが、本を読み理解する能力が低い私には少し便利です(笑

>>458
>報告のあった人にだけ修正版を提供(違うかもしれませんが)というのがチョット引っかかります。
実は私も同じでなぜ富士通が公開してくれないかが気になります
富士通がF-BASICの自然消滅を願っている気がします

460ままま:2008/01/01(火) 23:02:10
元旦早々の質問、よろしくお願いします。

まままと申します。初参加です。
数年来F-basicを使用し、どこかでVBに移行しなければと思いつつも、
結局販売終了となったV6.3まで、毎回のVersionUPを継続してきました。
年明けには、新しくドットNetが発売されるとの事、ついに以降の時かと思い、
それでいて、この休みにいろいろネット検索をしているうちのこちらを発見しました。
私も、是非ともVersion7を期待したく思います。

前置きが長くなりましたが、本題の質問です。
(長年使ってますが、超初心者です)
現在、win2000で使用しているのですが、コンパイル後のexeプログラムを
XpやVistaで使用する際に、文字が大きくなり困っています。
こちらに掲載される情報を拝見すると、各コントロールのフォントサイズを
指定して回避できるとの事で、早速、行ってみました。
そして、結果は、その通りなのですが、下記の点、お教えください。

1.フォームに多くのボタンを配置しています。これまでは、ボタンの
プロパティでフォントサイズを指定していたのですが、コントロールごとの
指定になると、すべてのボタンに対して、下記の3行が必要なのでしょうか?
例えば、ボタンが20個あると、20x3=60行の命令追加が必要ですか?
var shared ... as object
... attach getdlgitem("...")
... setfontsize ..

2.そのような長いプログラムの追加で、メモリの使用量や動作速度への影響は
いかがなものでしょうか?

3.Xpでの表示では、いったん大きなフォント(プロパティ指定の大きさ)で表示され、
その後、コントロール(プログラム上)の指定サイズで小さく表示されるため、
文字の大きさが小さく変化するのが見えてしまします。
これは、回避できないのでしょうか?

いきなりの参加でのご質問ですが、よろしくお願い致します。

461nisii:2008/01/02(水) 09:01:16
まだ酔っ払い中につき、手短で失礼します。

1.
コントロール毎にフォントサイズの指定が必要です。

2.
再利用しないコントロールは、フォント指定後にDETACHで開放できます。
特にWindowsMe/98を前提にするなら、積極的に行うのが望ましいです。
起動時に指定するだけですし、プログラムの実行速度には影響しません。

3.
あらかじめMAINFORMのプロパティ…基本スタイル…可視…なし
で非表示にしておき、すべての準備ができた時点でSHOWWINDOWを使って
表示すれば解決できます。

462TOKO:2008/01/02(水) 09:21:20
皆様、明けましておめでとうございます。
今年もよろしくお願いいたします。

まままさん>
MainFormにButton数が20個の場合、MainFormを「可視なし」に設定。

Var Shared Button(19) As Object

For i = 0 To 19
Button(i).Attach GetDlgItem("Button") & Trim$(Str$(i + 1)))
Button(i).SetFontSize 14
Next i

ShowWindow -1

というのは、どうでしょうか。

と、書いてページ更新をしたら、nisiiさんに先を越されていました。

463ままま:2008/01/02(水) 19:18:47
nisiiさん、TOKOさん、お正月にも関わらず、
ご回答ありがとうございます。

早速、試してみます。
と、申しましても、私には簡単なことではないので、
少々時間がかかるかと思いますが、近いうちに、結果を
ご報告致します。(今夜は寝られないかも)

しかし、このような場があると、心強いですね。
今更ながら、"F‐BASIC V6.3プログラミングのすべて"を注文しました。

464ままま:2008/01/03(木) 01:02:44
Var Shared Button(19) As Object

For i = 0 To 19
Button(i).Attach GetDlgItem("Button") & Trim$(Str$(i + 1)))
Button(i).SetFontSize 14
Next i

Xp/Vistaで文字表示の大きさが変化するのは、「可視なし」で解決しました。
あと、上記のコマンドですが、1行目のButton(19)とか、3,4行目のプログラムは
使えるのでしょうか?
私の環境は、windows2000+Ver6.3ですが、コンパイル時に”文法が正しくありません”となります。
楽せず、すべて個々に打ち込めば良い事ではあるのですが。。。

ご教授、よろしくお願いします。

465F橋:2008/01/03(木) 03:39:00
まままさん>
おめでとうございます。初参加ありがとうございます。

フォントの件ですが、MSゴシックでVistaでプログラムを作っていますが
XPと2000では(私の見た目では)同じ大きさに見えます
フォントサイズによって違いがあるみたいです。15ポイントでは問題ないように見えます
(3ポイント単位でずれたりずれなかったりした気がします)
Fixedsysも問題ありませんが、なぜかDELLだけ問題が出た気がします
これはVista、XP、2000のNT系(NTは試していませんがw)話であり、
95系(テストでは98を使用)では大きさが変わります。おそらくMeも変わると思われますのでご注意下さい
上記はVistaでコンパイルした場合です。XPや2000でコンパイルした場合は分かりません。

95系、NT系で同じフォントで同じサイズでは基本的にずれたと思います。詳しくはnisiiさんへ(笑
95系でもNT系でも同じ表示にする場合はプログラムでOSを判断して
95系ならフォントサイズ10ポイント、NT系ならフォントサイズ15ポイントなどの指定が必要のはずです

466TOKO:2008/01/03(木) 08:32:47
まままさん>
ゴメン(^^;)
前回は温泉行きの準備で焦っていたようです。「)」が多すぎました。
今,出先のPCで掲示板を見て気がつきました。
Button(i).Attach GetDlgItem("Button") & Trim$(Str$(i + 1)))

Button(i).Attach GetDlgItem("Button" & Trim$(Str$(i + 1)))

Buttonに限らずフォームに貼り付けた複数のEditBoxの中身をクリアしたい場合などは便利です。

Var Shared Edit(19) As Object


For i = 0 To 19
Edit(i).Attach GetDlgItem("Edit" & Trim$(Str$(i + 1)))
Next i

と書けば、

表示クリアは、
For i = 0 To 19
Edit(i).SetWindowText ""
Next i
のような感じでできますね。

大雪山国立公園 十勝岳温泉郷 吹上温泉保養センター白銀荘
雪の中の露天風呂は最高でした。(^^)

467ままま:2008/01/03(木) 13:08:43
F橋さん、TOKOさん、ありがとうございます。

F-BASIC V6.3は、windows2000で使用しており、
今回の件は、MSPゴシックでフォントサイズ11を使用しています。
ここでコンパイルしたものを、XpやVistaで実行すると、大きなフォントで
表示されます。

さて、相変わらず、解決できていなのですが。。。
Button(i).・・・の様に、(i)として変数は使えるのでしょうか?
コンパイル時に「文法が正しくありません」となります。

Button(i).Attach GetDlgItem("Button" & Trim$(Str$(i + 1)))
は、Buttonは(i)ですが、GetDlgItemは(i+1)ですが、これで良いですか?

Var Shared Edit(19) As Object
は、Edit1〜20をすべて選択してる事になるのでしょうか?
例えば、Edit10とEdit14を使用していないなど、連続していない場合は
どのように考えればよいでしょうか?

正月早々の質問ばかりで恐縮ですが、よろしくお願いします。

468TOKO:2008/01/03(木) 17:28:29
まままさん>こんばんは、無事札幌に帰ってきました。

>コンパイル時に「文法が正しくありません」となります。
プログラムの始めに
#include "Windows.bi"
が、入っていますか?

>Buttonは(i)ですが、GetDlgItemは(i+1)ですが、これで良いですか?
配列は「0」から始まります。コントロールIDの番号は「1」から始まります。
でもって、
Button(19)は、0〜19で20個になります。
コントロールID → 配列変数
Button1 → Button(0)
Button2 → Button(1)
中略
Button19 → Button(18)
Button20 → Button(19)

配列のButton(0)を無視するのであれば、
Var Shared Button(20) As Object(これは21個分用意してある)

For i = 1 to 20
Button(i).Attach GetDlgItem("Button" & Trim$(Str$(i)))
Next i
でも・・・

>例えば、Edit10とEdit14を使用していないなど、連続していない場合は
私は、コントロールの数がどんなに多くても連番にしていますが、10 と 14 だけ
どうしても生理的に受け付けない(^^;)というのであれば、その番号の時はAttachのところを
If文とか、Case文とかを使って通らないようにすると良いのではないでしょうか。

469ままま:2008/01/03(木) 20:11:04
TOKOさん、詳しいご説明で理解できました。
ありがとうございました。
Button(i)など、Var Shared Button(i) As Objectで指定すると、
後のプログラムの記述では、Button(1)をButton2としては
記述できないのですね。
(文法エラーになりました。(i)で記述したら問題なしでした。)

さて、番号が連続していない点については、Buttonを作ったり消したりしてるうちに、
無い番号ができてしまったためです。
Buttonの番号は変えられるものでしょうか?

470TOKO:2008/01/03(木) 20:27:56
>Buttonの番号は変えられるものでしょうか?
例えば、Button10の必要が無くなってButton9に変更する場合、プロパティで
コントロールID(I)のButton10をButton9に修正、更に表示内容(P)でイベントを選択し
Button10_onをButton9_onに修正します。

471ままま:2008/01/03(木) 21:45:38
TOKOさん、早々のお返事ありがとうございます。
コントロールIDの名称は、書き換えられるのですね。
こんな単純なことだったとは。。。 以前も、ずいぶん悩んで結局諦めた経緯があります。
ありがとうございました。

472F橋:2008/01/03(木) 23:40:38
横からすいません。解決済みかも知れませんが…

2000とXPで同じ大きさにするにはMS明朝やMSゴシックでは無くMS明朝やMSPゴシックにするとの事
ttp://support.microsoft.com/kb/417434/ja

6、7.5、9などの1.5の倍数を使うとずれないとのこと(話題ではMS明朝でした)
ttp://www.ailight.jp/blog/myamyu/archive/2005/03/03/4751.aspx

私が使っていたフォントは(固定長のMSゴシックですが)フォント15なのでずれないのかも知れません

プログラムでフォントサイズを切り替えればもちろん一番いいのですが正直手間ですよね(笑
ですのでプロパティのみでプログラムは変更しなくてもいい話をさせて頂きました。しつこくてすいません(笑

473ままま:2008/01/04(金) 00:42:38
F橋様

フォントの件、確認しました。
現在使用しているものは、MSPゴシックで、サイズが、11、12、14です。
XpやVistaでは、そのいずれもが、大きくなってしまいます。

確かに、プロパティのみの変更で済むと、手間いらずでよいのですが。。。
対応策は理解し、確認も済ませたのですが、変更箇所が多くあるため、
まだ、変更処置に踏み切れずにいます。。。

474F橋:2008/01/05(土) 01:33:30
>>473
フォントをFixedsysにした場合はどうなりますか?
尚、DELLにはFixedsysが無いのかうまく動かない場合がありますが
(はっきりとした理由分からないのですがDELLで動かすと(全てでは無いのですが)画面ずれたりしました)

478B.O.A.-ceo:2008/09/17(水) 11:13:25
やっと、時間的余裕ができ、30年前に造ったものを
移そうと思ったら、2行目でつまづき、困っています。
その昔、Width 40とWidth 80と書けば(もっとも、この2種しか
できない。)その通り、OKだけど。F-Basicでは、Errorとなり
先へ進めない。行番号の変更もDirectに出来ない。これでは

479nisii:2008/09/17(水) 23:42:26
>>478
F-BASICはコンパイル型ですので、頭を切り替えていただくしかありません。
プログラム実行中にのみ width文は動作します。

行番号はラベル程度の位置づけですので、新規に入力されるなら、
行番号の無いプログラミングスタイルをお勧めします。

if then/else/endif
whike/wend
select case/end select

などを使うことで、行番号は不要になります。

480nisii:2008/09/18(木) 18:22:13
>>479
誤)whike/wend

正)while/wend

481B.O.A.-ceo:2008/09/20(土) 09:21:08
プログラム実行中にのみ width文は動作します。←そのプログラム自体Errorと出るので使えません。困った。

482nisii:2008/09/20(土) 13:44:32
翻訳(コンパイル)のエラーですか?実行中のエラーですか?エラーの内容は?
あと、F-BASICのバージョンはV6.3で、アップデートU003を入れてありますか?

DOS時代のBASICと完全互換ではありませんから、
無い命令やパラメータの違う命令もあり、書き換えは必要です。
元リストファイルを読み込んで利用する場合、移行支援機能を活用してください。
[編集(E)]-[移行支援(V)]

疑わしい命令を確認する場合、2行に分けると特定しやすいでしょう。
行番号がなくても、記述順に実行されます。
10 width 40 : cls : paint( 0, 0 ), 5
20 end

10 width 40 : cls :
paint( 0, 0 ), 5    ' paintでエラーが起きているか確認しやすい
20 end

申し訳ありませんが、2行目でエラーになると言われても、何が書かれているか分かりません。
リストとエラーの掲示をお願いします。

483B.O.A.-ceo:2008/09/28(日) 10:02:53
A$="abc"
width 40
print A$
stop
end
「行番号は省略。」お蔭様でErrorは出なくなりました。しかし、実行すると
width40を80に変えても、文字の大きさは画面上同じでした。Versionは6.0です

484nisii:2008/09/28(日) 22:56:02
width文は、文字の最大桁数を指定します。

フォントサイズを変更したいと理解しましたが、よろしいでしょうか?
フォントサイズは、FONT構造体のSIZEで指定します。


#include "windows.bi"

var FFONT as FONT
FFONT.SIZE = 64
FFONT.BOLD = 0
FFONT.ITALIC = 0
FFONT.UNDERLINE = 0
FFONT.STRIKEOUT = 0
FFONT.FFNAME = "MS 明朝"

SETMAPMODE 2 ' 1/10mmモード
SETFONT FFONT
print "ABC"
print "日本語"

wait 500
end

485B.O.A.-ceo:2008/10/05(日) 10:02:54
フォントサイズを変更したいと←そうです。色々と有難う御座いました。
助かりました。

486puff_puff:2008/11/18(火) 22:52:44
超ご無沙汰してました。
皆さん、ご活躍中のようで(この掲示板が稼働中で)安心しました。
また、F-basicをしばらく使う事になりましたので、
また、時々寄ります。よろしくお願いします。

487puff_puff:2008/11/18(火) 22:54:01
書き込むところを間違えました。ごめんなさい。
雑談の所に書くつもりでした。
汚しちゃって、ごめんなさい。

488シマヅ:2009/03/06(金) 22:38:26
■Windows(R)7とF-BASICの互換性等
 次期OSと言われている、Windows(R)7とF-BASICの互換性等、何か情報をお持ちの方がおりましたら、宜しくお願い致します。

489JUN:2009/05/10(日) 10:00:21
みなさん、こんにちは。
Windows7(RC版)、インストールしてみましたので動作状況等
報告してみたいと思います。

M/B:M3A78 PRO (ASUS)
CPU:Athlon64 X2 4200+(2.2GHz)
メモリ:2GB

●動作確認できたアプリケーション
 F−BASIC V6.3 (U0003)
 Mifes V6.0
 一太郎2006(ATOK2006)
 とりあえず、F−BASIC開発に必要なもの。

●動作関連について
 インストールは、すんなりいきました。
 コンパイルも、無事終了しました。
 作成したプログラムは動作しました。
 日本語入力も自作ライブラリィで動作しました(確認はATOKのみ)。
 Btrieveファイルは、読み書きできました。

●気になる点など
 F−BASICのことではありませんが、エクスプーラで動作可能な
 モジュール(.COM .EXE等)の拡張子が表示しません。当方、Vistaを
 飛び越しているのでこれは仕様かなと思っています。情報お持ちの
 方はお教えください。

490makoto:2009/05/11(月) 13:16:45
こんにちは

>モジュール(.COM .EXE等)の拡張子が表示しません。

[スタート]-[コントロールパネル]-[ディスクトップのカスタマイズ]-
[フォルダーオプション]-[表示]の[]登録されている拡張子は表示しない
で当方の環境では表示されるようになりました。

>Windows(R)7とF-BASICの互換性等

FMV-D5340 Core2 6700 2GB 32ビット RCで問題なく動作しています。XPより快適ですw

491JUN:2009/05/11(月) 13:25:41
早速の書き込みありがとうございます。
帰宅して設定してみたいと思います。
それにしても、2000やXpと同じ機能ながら
設定する場所が違うのが結構あり探すのが
大変です。
ありがとうございました。

492名無しさん:2009/05/19(火) 17:57:42
こんばんは
F-BASICで作ったEXEファイルのショートカットに、別のファイルをマウスでドロップするとそのファイルの名称を習得するようなプログラムを書きたいのですがどうすればいいのでしょうか

493nisii:2009/05/19(火) 19:40:15
command$ で得られます。
通常の引数か判別するため、ISEXISTFILEでファイル名の存在を確認しましょう。

494名無しさん:2009/05/19(火) 22:22:44
回答をいただけてうれしいです。
ありがとうございました。

495シマヅ:2009/05/22(金) 16:31:57
皆様、貴重な情報を有難う御座います。なんとかプログラミングの寿命が伸びそうでホッとしています。《仕事の都合(出張等)などで返事が遅れて申し訳ありませんでした》

496追質問:2009/07/05(日) 23:04:14
名無しさんの質問に似てるのですが、ファイルをダブルクリックし、関連付けされた
ファイルとして、アプリケーションを起動させたとき、アプリケーションでカレントディレクトリが
ファイルの場所になりますが、アプリの本来のパスはどうしたら取得できますか?

497nisii:2009/07/06(月) 01:01:24
タイトル「F-BASIC掲示板(雑談歓迎)」をクリックして、メインページに戻り、
「いまさら聞けなかったAPI」の「ウィンドウの列挙とモジュール名の取得」を見てください。
自分自身のパスを得るサンプルがあります。

498追質問:2009/07/06(月) 20:01:54
ありがとうございます。うまくいきました。
なにぶんプログラム初心者なもので、、、
現在、ファイルを閲覧するプログラムを作っているのですが、いろんなところで、立ち止まっています。
マルチラインエディターのスクロールポジション取得やキーイベントなど、F-BASICにはありませんよね?、
(キーイベントに関しては、どこかで、どなたかが、記述していたような記憶があるのですが、、、、)

499YUTTA:2009/08/31(月) 10:05:06
ご無沙汰しております。<(_ _)>
今も尚F-BASICにお世話になっているYUTTAです。
お時間がございましたら下記につきましてご教示下さいませ<(_ _)>

vistaでも、なんとかF-BASICは動作し、相変わらずコンパイルに
いそいんでいる毎日ですが、「U003」へのアップデートができません。
ちなみにメインのPCがxpとvistaのデュアルブートなので、XPから、
vistaにF-BASICをフォルダ毎上書きコピーし、一応「U003」にしてなん
とか、問題もなく使用している状況です。"^_^"
vistaになってから、システム内の「expand.exe」との互換性に問題
が・・・・・・、などと疑っているところなんですが?
どなたかよい方法をお知り方、ご教示宜しくお願い致します。<(_ _)>

500nisii:2009/09/01(火) 13:18:27
ごぶさたです。
今、Vista SP2マシンに入れてみましたが、特に問題なくインストールは完了しました。
その環境固有の問題ではないでしょうか?

いったんXP側のF-BASICをアンインスール、該当フォルダも削除してから、
Vista側でインストールするとか。

501YUTTA:2009/09/09(水) 11:10:48
YUTTAです。
nisii先生ありがとうございました。<(_ _)>
まさにご指導の通り実行しましたら、U003にアップデートできました。
デュアルブートが原因だったんですね(^_^;)
VISTAにしてからずうっと悩んでいたんですが、
みごと解消です! 大変ありがとうございました。
VISTAにしてもうひとつ今ひっかかっていることがあります。
APIを使ってフォームの×ボタン無効化を行っていましたが、
VISTA・basicからVISTA・Ultimateにし、エアロをONにしたら、
この×ボタンの無効化で無効化可能なのだけれど、マウスにボタンが反応する?
(色など無効化前の状態のまま・・・)のです。
まあ、プログラムの実行上問題はありませんが、なんか気になります。
今また、Windows7で、更に悩みが増えそうでまたまたゲイ○氏には
頭にきますです。(^_^;)
このたびは誠にありがとうございました。 <(_ _)>

YUTTA

502FB使用人:2009/12/10(木) 00:42:10
どなたかご存知の方教えて下さい。
FBasicのメール機能を使って見ようと思いましたが、「続行不能エラー」で止まってしまいます。
MAILLOGON を実行出来きません。’98の時は確か出来ていたと思いますが、XPではダメなのでしょうか。
98の時は電話回線でしたが、ADSLにしてからは OUTLOOK に添付で、メール機能を使用していません。
どなたか詳しい方居られたら教えて下さい。(インターネット機能も実行できません)

503nisii:2009/12/10(木) 06:23:19
ヘルプより。
#電子メールの送受信をします。メールアカウントとMAPI対応のメールソフトが必要です。
#Microsoft Outlook Express 5.0以上を推奨します。

メールソフトの設定を事前にしておく必要があるのでは?
WindowsXP SP3 + Outlook Express6 + F-BASIC V6.3 U003 + YahooBB ADSL8Mで、
ヘルプにある下記サンプルの正常動作を確認しました。


#include "windows.bi"
#include "internet.bi"

MAILLOGON
TO$ ="xxx@yyy.co.jp" ' 受信者
CC$="":BCC$=""
SUBJECT$="メールのテスト" ' 件名
MSG$= "テストをおこなっています。"+chr$(13,10)
FILE$=""
MAILSEND SUBJECT$, MSG$, FILE$, TO$, CC$, BCC$
MAILLOGOFF
stop
end


インターネット機能については試していませんが、たぶん設定の問題でしょう。

504FB使用人:2009/12/11(金) 00:17:49
nisiさん
早速のご返答有難うございました。
PC環境は全く同じです。FBはしばらく(二年弱)使用してなかったので
感が戻りません。実行できるみたいなので、挑戦します。後日結果を投稿します。

505Gatefield:2010/03/20(土) 16:01:41
モード付きダイアログボックスのユーザー定義フォームにコントロール、
たとえばチェックボックスを張り付けて それを制御することって
できるんでしょうか?
張り付けることだけはできたのですが 反応してくれません。

506nisii:2010/03/21(日) 00:28:36
FORM2ではダメなのですか?
ShowwindowでON/OFFできますし、MAINFORMと同じように自由度が高いですよ。

507Gatefield:2010/03/21(日) 09:50:12
どうも ありがとうございました。
m(_._)m
いろいろやってみましたが ボタンだけ有効なんですね。

ところで FORM2表示で ダイアログみたいにタスクバーの
表示をさせない方法って あるもんでしょうか?

508nisii:2010/03/21(日) 20:05:28
フォーム表示中に、タスクバーへアイコンを表示させない方法があるかは知りません。
その間MAINFORMを非表示にするなど、工夫のしようはあると思いますが…。

509シマヅ:2010/05/24(月) 21:13:54
■印刷(ハードコピー)に関する不具合・解決方法のご相談

▼不具合内容
 メインフォームをハードコピー印刷するために「WINHARDC 3,0」を使っています。
しかし、これを実行するとメインフォームの上に一瞬「印刷スプーラにデータを送っています」のウインドウが表示され、それがメインフォームの上に被さった状態で印刷されてしまいます。

 これに関して、何か解決方法がありましたら、教えて頂けませんでしょうか?。

▼下記のような状況であることを追記しておきます。
(1)WindowsXPのパソコンではプリンターとUSB接続およびセントロニクスパラレル接続のどちらでも発生しません。(メインフォームの上に「印刷スプーラにデータを送っています」は一瞬表示されますが、印刷されません)

(2)Windows Vistaのパソコンで、印刷すると一瞬「印刷スプーラにデータを送っています」が表示されて、メインフォームの上に被さって印刷されてしまいます。
【パソコンにUSB端子しかないので、プリンターとはUSB接続しています】

(3)メインフォームをトップモーストウィンドウ MAINFORM.SETTOPMOSTWINDOW (-1) としておいても、全く効果がなく、メインフォームの上に「印刷スプーラにデータを送っています」のウインドウが一瞬表示されてしまいます。

  何か対応策がありましたら、教えて頂きたく宜しくお願い致します。

510nisii:2010/05/27(木) 03:10:32
検証していないので、確証はありませんが…。
・ディスプレイドライバのハードウェアアクセラレータを切ってみる。
・XP互換モードで実行させる。


当面の回避案として、画面キャプチャを撮って印刷する。

●API -クリップボードのビットマップをファイル化-
で、keybd_event VK_SNAPSHOT , 1 を用いれば、アクティブウィンドウの内容を得られます。

511シマヅ:2010/05/27(木) 14:47:50
 nisii 様、毎度お世話になっております、アドバイス・有難う御座います。

>ディスプレイドライバのハードウェアアクセラレータを切ってみる。
>XP互換モードで実行させる。

 効果があるかと思うのですが、知人に使って貰っているソフトに関しては、この操作をして貰うのは、難しいな〜と考えております。

>当面の回避案として、画面キャプチャを撮って印刷する

 知人に使って貰っているソフトに関してはこの方法もあることを連絡しておきました。

>API -クリップボードのビットマップをファイル化-
で、keybd_event VK_SNAPSHOT , 1 を用いれば、アクティブウィンドウの内容を得られます。

 この API を使ったことがないのですが、印刷上で「印刷スプーラにデータを送っています」を被らないようにするには、どうしたらよいかな〜と思案中です。

◆MAINFORMをウインドウの中央に表示させていたので、ウインドウの位置を移動させる MAINFORM.MOVEWINDOW 0,0 で、左上に移動させる試みもやってみたのですが、ウインドウの右下の部分に「印刷スプーラにデータを送っています」が被さってしまい、解決出来ませんでした。

 更に自分でも何か方法がないか?、考えて見ますが、根本的に解決する方法がありましたら、ご指導のほどよろしくお願い致します。有難う御座いました。

512ひろ:2010/07/27(火) 20:07:57
諸先輩方教えてください
サンプルで
var PP as PRINTPARAM
var PRINTER as object
PRINTEROBJECT PRINTER
if PRINTER.PRINTDLG(PP) then
SETMOUSEPOINTER 2
PRINTER.STARTDOC "文書"
PRINTER.STARTPAGE
PRINTER.DRAWGRP
PRINTER.ENDPAGE
PRINTER.ENDDOC
PRINTER.CLOSEPRINTER
SETMOUSEPOINTER 0
endif
で印刷するとき行間を指定したいのですが・・・・

513nisii:2010/07/29(木) 01:15:48
空白行を印刷して調整、ではダメですか?
フォントサイズを変えれば調整できると思うのですが。

514ひろ:2010/07/29(木) 22:07:57
nisiiさん ご教授ありがとうございました。
やはりその方法しかありませんかぁ!
LprintSetPitchみたいなものがあればいいのにと思います。
やりたいことは自動両面印刷をしたかったのですが、プリンタオブジェクトでだけしか
プリンタが正常動作しなかったものですから....
ありがとうございました。

515nisii:2010/07/30(金) 02:15:38
調整テストにいちいち印刷すると紙とインクがもったいない、ということであれば、
Bullzip PDF Printer
なんかでPDFファイルに出力してみてはどうですか。

516ひろ:2010/07/31(土) 09:52:42
nisiiさん 追加ご指導ありがとうございました
Bullzip PDF Printer は .NETがインストールされてないと
だめなんですねぇ(涙)

517nisii:2010/07/31(土) 22:15:33
.NET Framework も無料ですよ、念のため。
Windows updateのカスタム一覧からインストールできます。

518ken:2010/10/18(月) 12:49:42
はじめまして。
前任者が作成したf-basicプログラムで困っています。
これまで、中のデータは紙ベースでの印刷しかできなくなっていまして、・
それをcsvで抜き出したいのですが、その抜き出し方ってどうすればいいのでしょうか?
あいまいですみませんが、何か方法があれば、ヒントなどいただければ幸いです。

519nisii:2010/10/18(月) 20:23:08
F-BASICソース(リスト)を変更できますか?
文法はN88-BASIC(86)にそっくりです。

ソースを変更できるなら、print #文など、出力系の部分を探してください。
これをファイル出力に変更すればテキストファイルを得られます。
多少前後に準備文が必要ですが、難しいものではありません。

520nisii:2010/10/21(木) 04:21:11
元ソースを変更できないとしたら、PDF出力してテキストをコピペするとか。
全文手打ちするより、はるかに手間が省けると思います。

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に送らると思っていました。処理系によって違うのか不思議に思っています。それ以外にタイミングなどの問題があるのかもしれません。シリアル制御は奥が深そうです

621名無しさん:2015/10/24(土) 23:32:36
>※GW-BASICの",rs"オプションが気になりますが。
>(RS suppresses detection of RTS(Request To Send))
QuickBasicのマニュアルにも"RTSを抑制する"とありましたが、「抑制」とはどういう意味で使われているのでしょうね。いままでよくわからずに使っていました。

RTS信号をめぐる混乱
http://d.hatena.ne.jp/licheng/20130530/p1
http://www15.atpages.jp/limz80msx/program/rs232c.html

622名無しさん:2015/10/25(日) 04:32:44
>>620

行端(行末)コードで使われている制御コード(コントロールコード)
CRはキャリッジリターン、LFはラインフィード。

これらはテレタイプ端末(電動機械式タイプライタ)の時代にまで遡り、
TTY通信とか言ってましたっけ。

CR+LFで「復帰改行」。これはタイプライタ(プリンタ)の動きの制御のため、
キャリッジ(紙をはさんで左右に動く機構)を1行の先頭の方へ戻し、
次に紙を送り出す(紙を次の行へ進める)。

今の時代、画面での改行や単に1行分のデータの末端を示すのなら
コード1つで十分なので、CRかLFのみにすれば通信量(費用・時間)が節約できると。

そのため、通信ソフト類ではどの改行コードを使うか設定する機能を持つ。

その昔、CP/Mが改行コードに「CR+LF」採用したので結果的に、MS-DOSも
「CR+LF」になったらしい。
MS-DOS上のF-BASICも当然そうなったと。

623名無しさん:2015/10/25(日) 12:08:17
行末コードはよるトラブルの元になりますね。MACはCR,UnixはLF,MS-DOSはCR/LFですが、CP/MはPDPの影響でCR/LFを採用したんでしたっけ。

F-BASICもCOMポートをバイナリモードでopenして、fwriteとかfreadが使えると嬉しいのですが。

624名無しさん:2015/10/26(月) 10:00:09
おはようございます

さっそく、COM1の通信条件設定を調べるプログラムを実行してみました。


1.Windows 起動直後
2.(1回目)F-BASICで一回オープン"COM0:(S7N2N7NNN)"クローズした後
3.GW-BASICの受信サンプル実行で正常受信した後
4.(2回目)F-BASICで一回オープン"COM0:(S7N2N7NNN)"クローズした後
5.GW-BASICの受信サンプル実行で正常受信した後


あれれ、STOP BITが1になっていますね。


1回目

fBitFields(16進数)=1011
fOutxCtsFlow= 0
fOutxDsrFlow= 0
fDtrControl= 1 (DTR フロー制御タイプ:0..2)
fDsrSensitivity= 0
fErrorChar= 0 (エラー時文字置き換える)
fNull= 0 (NULL BYTES 受信を破棄する=1)
fRtsControl= 1 (RTS フロー制御:0..3)
fAbortOnError= 0
ByteSize= 7
StopBits= 0 (stopビット:0=1,1=1.5,2)
ErrorChar(16進)=0
EofChar(16進)=0
EvtChar(16進)=0
終了します。なにかキーを押してください。


2回目
fBitFields(16進数)=1011
fOutxCtsFlow= 0
fOutxDsrFlow= 0
fDtrControl= 1 (DTR フロー制御タイプ:0..2)
fDsrSensitivity= 0
fErrorChar= 0 (エラー時文字置き換える)
fNull= 0 (NULL BYTES 受信を破棄する=1)
fRtsControl= 1 (RTS フロー制御:0..3)
fAbortOnError= 0
ByteSize= 7
StopBits= 2 (stopビット:0=1,1=1.5,2)
ErrorChar(16進)=0
EofChar(16進)=0
EvtChar(16進)=0
終了します。なにかキーを押してください。

625名無しさん:2015/10/26(月) 10:00:50
3回目
fBitFields(16進数)=1
fOutxCtsFlow= 0
fOutxDsrFlow= 0
fDtrControl= 0 (DTR フロー制御タイプ:0..2)
fDsrSensitivity= 0
fErrorChar= 0 (エラー時文字置き換える)
fNull= 0 (NULL BYTES 受信を破棄する=1)
fRtsControl= 0 (RTS フロー制御:0..3)
fAbortOnError= 0
ByteSize= 5
StopBits= 0 (stopビット:0=1,1=1.5,2)
ErrorChar(16進)=0
EofChar(16進)=0
EvtChar(16進)=0
終了します。なにかキーを押してください。

4回目
fBitFields(16進数)=1011
fOutxCtsFlow= 0
fOutxDsrFlow= 0
fDtrControl= 1 (DTR フロー制御タイプ:0..2)
fDsrSensitivity= 0
fErrorChar= 0 (エラー時文字置き換える)
fNull= 0 (NULL BYTES 受信を破棄する=1)
fRtsControl= 1 (RTS フロー制御:0..3)
fAbortOnError= 0
ByteSize= 7
StopBits= 2 (stopビット:0=1,1=1.5,2)
ErrorChar(16進)=0
EofChar(16進)=0
EvtChar(16進)=0
終了します。なにかキーを押してください。



5回目
fBitFields(16進数)=1011
fOutxCtsFlow= 0
fOutxDsrFlow= 0
fDtrControl= 1 (DTR フロー制御タイプ:0..2)
fDsrSensitivity= 0
fErrorChar= 0 (エラー時文字置き換える)
fNull= 0 (NULL BYTES 受信を破棄する=1)
fRtsControl= 1 (RTS フロー制御:0..3)
fAbortOnError= 0
ByteSize= 7
StopBits= 0 (stopビット:0=1,1=1.5,2)
ErrorChar(16進)=0
EofChar(16進)=0
EvtChar(16進)=0
終了します。なにかキーを押してください。

626598:2015/10/26(月) 11:22:21
>>625
えーと、
3回目(GW-BASIC1回目)と5回目(GW-BASIC2回目)、なんか違ようですが
なぜなんだろう?。

fDtrControl= 0 (DTR フロー制御タイプ:0..2)
fRtsControl= 0 (RTS フロー制御:0..3)
ByteSize= 5

fDtrControl= 1 (DTR フロー制御タイプ:0..2)
fRtsControl= 1 (RTS フロー制御:0..3)
ByteSize= 7

1回目(起動直後)と5回目(GW-BASIC2回目)が同じなので、
これは初期状態に戻ったということかな・・。

次に、F-BASICと3回目(GW-BASIC1回目)との違い。

[FB]
fDtrControl= 1 (DTR フロー制御タイプ:0..2)
fRtsControl= 1 (RTS フロー制御:0..3)
ByteSize= 7
StopBits= 2 (stopビット:0=1,1=1.5,2)

[GW]
fDtrControl= 0 (DTR フロー制御タイプ:0..2)
fRtsControl= 0 (RTS フロー制御:0..3)
ByteSize= 5
StopBits= 0 (stopビット:0=1,1=1.5,2)


うーーーん、fRtsControlがカギなんだろうか。

このデジタルマルチメータ側のシリアル端子の動作を勘違いしていたのかも。
 PC側の状態を見ないのではなくて、PC側の状態で測定データを送信するか
どうかを決めるが、PC側には自分の状態を知らせないから無視してコマンド送信
しなさいということかもしれない。

するとRS-232C間を、半二重通信でやりとりしなさいということかもしれない。

627名無しさん:2015/10/26(月) 17:17:01
ありがとうございます。

もう一度やってみました。

最初ににポートのopen/closeをした後にGW-BSIACを実行し、シリアルポートの状態を調べ、その後にポートのopen/closeをした後にシリアルポートの状態を調べ、さらにGW-BSIACを実行した後にシリアルポートの状態を調べています。

ポートのopen/close

var CM$
baud 0,9600
CM$="COM0:(S7N2N7NNN)"
open CM$ for output as #2
open CM$ for input as #1
close
end

1回目
fBitFields(16進数)=1
fOutxCtsFlow= 0
fOutxDsrFlow= 0
fDtrControl= 0 (DTR フロー制御タイプ:0..2)
fDsrSensitivity= 0
fErrorChar= 0 (エラー時文字置き換える)
fNull= 0 (NULL BYTES 受信を破棄する=1)
fRtsControl= 0 (RTS フロー制御:0..3)
fAbortOnError= 0
ByteSize= 5
StopBits= 0 (stopビット:0=1,1=1.5,2)
ErrorChar(16進)=0
EofChar(16進)=0
EvtChar(16進)=0


2回目
fBitFields(16進数)=1011
fOutxCtsFlow= 0
fOutxDsrFlow= 0
fDtrControl= 1 (DTR フロー制御タイプ:0..2)
fDsrSensitivity= 0
fErrorChar= 0 (エラー時文字置き換える)
fNull= 0 (NULL BYTES 受信を破棄する=1)
fRtsControl= 1 (RTS フロー制御:0..3)
fAbortOnError= 0
ByteSize= 7
StopBits= 2 (stopビット:0=1,1=1.5,2)
ErrorChar(16進)=0
EofChar(16進)=0
EvtChar(16進)=0


3回目
fBitFields(16進数)=1011
fOutxCtsFlow= 0
fOutxDsrFlow= 0
fDtrControl= 1 (DTR フロー制御タイプ:0..2)
fDsrSensitivity= 0
fErrorChar= 0 (エラー時文字置き換える)
fNull= 0 (NULL BYTES 受信を破棄する=1)
fRtsControl= 1 (RTS フロー制御:0..3)
fAbortOnError= 0
ByteSize= 7
StopBits= 0 (stopビット:0=1,1=1.5,2)
ErrorChar(16進)=0
EofChar(16進)=0
EvtChar(16進)=0


fDtrControl= 0 (DTR フロー制御タイプ:0..2)
fDtrControl= 1 (DTR フロー制御タイプ:0..2)
fDtrControl= 1 (DTR フロー制御タイプ:0..2)

fRtsControl= 0 (RTS フロー制御:0..3)
fRtsControl= 1 (RTS フロー制御:0..3)
fRtsControl= 1 (RTS フロー制御:0..3)

ByteSize= 5
ByteSize= 7
ByteSize= 7

StopBits= 0 (stopビット:0=1,1=1.5,2)
StopBits= 2 (stopビット:0=1,1=1.5,2)
StopBits= 0 (stopビット:0=1,1=1.5,2)


うーん、なんでこんなに設定が変わるのかわかりません。
変わっていないのは、StopBitsが1になっていることだけです。

628名無しさん:2015/10/26(月) 19:28:10
こんばんは

元のGW-BASICに返ってみました

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

QuickBasicのマニュアルによる、これらのオプションの意味は下記の通り

rs:RTSの検知を抑制
cs:CTSのタイムアウトを抑制
ds:DSRのタイムアウトを抑制
cd:DCDのタイムアウトを抑制


この中で、csとcdのオプションは省いてもデータは読み取れました。

open "com1:9600,n,7,2,rs,ds" as #2

これをF-BASICにすると、


OPEN "COM0:(S7N2N7NN,CS0,DS0)" as #2

となると思うんですが、これでもまだ読めません。
うーん、近くまで来ていると思うのですが、また明日挑戦してみます

629598:2015/10/27(火) 04:22:26
>>628
F-BASICがopen時設定したCOMポートへの通信条件設定を強制変更する
プログラムです。fRtsControlの設定を変更しています。

注:これは >616 のプログラムの後ろに続きます。(つまり >617 を差し替える)

#define RTS_CONTROL_DISABLE &H0
#define RTS_CONTROL_TOGGLE &H3

private declare function ADDR(byref A as long) as long
function ADDR(A as long) as long
'print "test=";hex$(varadr(A))
ADDR=A
end function
declare function _PBGETDCBNO alias "_$PbGetDCBNo@4" (byval FILENO as long) as long
declare function _PBGETDCB alias "_$PbGetDCB@4" (byval FBDCBNO as long) as long
declare function FB63_GETFILEHANDLE bdecl (byval FILENO as integer) as long
function FB63_GETFILEHANDLE (byval FILENO as integer) as long
var FBDCBNO as long, FBDCBDATA as long
FB63_GETFILEHANDLE= INVALID_HANDLE_VALUE
select case FILENO
case 1 to 255
FBDCBNO= -1
FBDCBNO= _PBGETDCBNO(clng(FILENO))
if FBDCBNO = -1 then error 57:exit function
FBDCBDATA=0
FBDCBDATA=_PBGETDCB(FBDCBNO)
if FBDCBDATA = 0 then error 60:exit function
FB63_GETFILEHANDLE=FBDCBDATA
FBDCBDATA=FBDCBDATA+&H108 'オフセット
FB63_GETFILEHANDLE=ADDR(byval FBDCBDATA)
case else
error 50
end select
end function

declare sub TEST2_SETSTATE(byval FILENO%)
sub TEST2_SETSTATE(byval FILENO%)
var RES as long
var DCB as T_DCB, HFILE as long
var F as long, M as long

HFILE= FB63_GETFILEHANDLE(FILENO%)
if HFILE=0 or HFILE=-1 then HFILE=INVALID_HANDLE_VALUE

if HFILE= INVALID_HANDLE_VALUE then print "Error:open":exit sub
RES=GetCommState(hfile, DCB) 'ポートの設定取得
if res=0 then
print "Error:GetCommState"
else
if DCB.DCBLENGTH<>len(T_DCB) then print "!!DCBlength(hex)=";DCB.DCBLENGTH
print "fBitFields(16進数)変更前=";hex$(DCB.FBITFIELDS)

'**ここで設定を変更する**
F=DCB.FBITFIELDS '*bit毎設定必要
'----fRtsControl----
F=F and (not FRTSCONTROL) 'ビット消去
M=FRTSCONTROL :M=M and (M \ 2) '※下位ビットを残す
M=M * RTS_CONTROL_TOGGLE '設定値
F=F or M 'ビット設定
print "fRtsControl書換";RTS_CONTROL_TOGGLE ;" (RTS フロー制御:0..3)"
'--------
DCB.FBITFIELDS=F '設定
'****
print "fBitFields(16進数)変更後=";hex$(DCB.FBITFIELDS)

'設定を強制更新する
RES=SetCommState(hfile, DCB)
if res=0 then
print "Error:SetCommState"
endif
endif
end sub

'--------
var CM$, R$(4-1)
baud 0,9600
CM$="COM0:(S7N2N7NNN)"
open CM$ for output as #2 : open CM$ for input as #1
TEST2_SETSTATE 2 '←ファイル番号のCOM設定を強制変更する
WAIT 100

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

print"!!送信始!!"
print#2,"D";chr$(13);
wait 50
while eof(1) :print"*"; :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
stop:end

630名無しさん:2015/10/27(火) 09:14:21
ありがとうございました。
作成していただいたプログラムでデータを計測器から読み込むことができました。

これが実行結果です。

fRtsControl書換 3 (RTS フロー制御:0..3)
fBitFields(16進数)変更後=3011
!!受信バッファが空でない!
!!送信始!!
!!受信始!!
!!受信終!!
!!Frame-1入力
!!Frame-2入力
!!Frame-3入力
!!Frame-4入力
AC 096.01 V 13
13
FR 00.060 kHz 13
dB 041.86 dBm 13
中断しました com_cond2.bas[165行]
任意のキーを押してください

もし、可能でしたら、計測器と通信できなかった理由を教えていただけると勉強になります。


ここからは報告です。

連続したデータが欲しいので、FOR NEXTのループを作りました。
下記がその中の命令です。

>print#2,"D";chr$(13);
>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入力"

実行すると、一番最初に読み込んだデータ(R$(0))の先頭に00(NULL)が2バイト付いていました。

(00)(00)AC 096.01 V 13

R$(1)〜R$(3)は問題ありません。

そして、2番目ループ以降は00(NULL)が1バイトになりました。
(00)AC 096.01 V 13

R$(1)〜R$(3)は問題ありません。

プログラムで取ってしまえば問題ないのですが、このNULLが少し気になります。

今回はありがとうございました。
本当に助かりました。

631名無しさん:2015/10/28(水) 12:02:26
>>630  まずは原因の方から。
最初に推定するための情報を列挙します。
通信条件設定の表示テスト結果 >624-625 >626 から違いを見ると、
[fDtrControl]
0=DTR_CONTROL_DISABLE (DTRは常にOFF)←[GW-BASIC]
1=DTR_CONTROL_ENEBLE (DTRは常にON) ←[F-BASIC]
[fRtsControl]
0=RTS_CONTROL_DISABLE (RTSは常にOFF)←[GW-BASIC]
1=RTS_CONTROL_ENABLE (RTSは常にON) ←[F-BASIC]
そして >611 のデジタルマルチメータのデータ通信資料、(コネクタに無い信号線がある)
そして >621 のRS-232Cの関連情報、QuickBasicの通信条件オプション(,rs)

 次に通信条件設定の内容とテストの状況から、要因を探ります。

・F-BASICで受信時に「[27]システムに異常があります」原因不明エラーで受信不能。
ただ、ヌル(00h)が受信されていた。とりあえず受信不可能ではないらしい。
・ケーブルは普通にストレート。問題なし。
・ポートはマザーボードのものでUSB変換ではないし、GW-BASICで使えている。
・デジタルマルチメータ側端子には無い信号線がある。
・ハードウェアフロー制御はなし。→(通信量的に必要ないし無用な製品製造コスト)
・DSRの状態はPC側で無視している。
・CTSは?。PC側でCTS監視による送信フローはしない設定。→たぶんPC側ですべて無視。
・DTRはON/OFFどちらでも反応(受信)はする。→たぶん無視している。
・GW-BASICの通信条件オプション(,rs)→PC側でRTS関連のなにかを無視して通信している。
・RTSが常時OFFでもGW-BASICで正常通信できる。→無視しているのか?
・RTSが常時ONのF-BASICではデータ受信できない。→なぜ?。では完全無視ではない!。

可能性1-コマンド送信ができないまたは送信したが無視される。
$A-送信ができない。→DSRは無視、CTSは見ない。だから送信できないことはないだろう。
$B-送信したコマンドが無視される。→なぜ?。print# は変更しても変わらなかった。
$→それでは別の要因でABいずれかの問題が発生か?→要因は何か?設定違いはRTS、DTR。
可能性2-データ受信ができないまたは送って来ない。
$A-受信ができない。→RTS常時ONだから?。そもそも受信できないはずがない・・。
$B-データを送って来ない。→RTS常時ONだから?。なぜ?。
$C-送って来たデータをPC側が無視した?。→DSRは無視しているはずだし、Aに同じ。
$→要因は何か?設定違いはRTS、DTR。

 これらから原因を推測すると、
DTRの可能性は低そう。DTR常時OFFで動くし、フロー制御なし設定なのだから。
ただしDTRをONにしていると(PC側の機種の判断材料)動作が変更されるのなら話は別だが…。
RTSの可能性が濃厚。それにF-BASICには",rs"オプションに当てはまりそうなものは無い。

RTSの違いが原因だと仮定して、とりあえずRTSをGW-BASICと同じく常時OFFに設定すればよい。
RTSがONだと送信または受信に支障が出るとすると、
  送 受
OFF○ ○(これは成功)
ON × - 送信で失敗と仮定だと→コマンド送信失敗ではデータが来ない…。
ON ○ × 受信で失敗と仮定だと→ONでも送信できるが、受信は失敗。
ON × × 両方失敗と仮定→常時OFFでなければ失敗。

ただ、送信時と受信時でON/OFFが異なれば受信成功するという可能性もまだある。
そのような場合のRTS(Request To Send)の動きは半二重通信方式の場合が考えられる。
半二重通信では送信と受信を同時には行えず、送信する時にはONにする。
これに該当しそうな設定は、次のものらしい。
3=RTS_CONTROL_TOGGLE (トグル)
(有効な送信用Bytes(データ)があればRTSをONにする。バッファのデータを
すべて送信した後、RTSをOFFにする。)

 とりあえずの結論としては、RTS_CONTROL_TOGGLEに設定してみるか、
RTS_CONTROL_DISABLE (RTSは常にOFF)にできれば通信はできると予想。

632名無しさん:2015/10/29(木) 02:57:36
>>630
 今回の問題は、GW-BASICというよりIBM PC初期の時代に依存している
・RS-232Cの制御線をほとんど無視して使わない、簡略化した通信。
・IBM PCが世界のすべて。IBM PCの都合(制約)にあわせる。
(IBM PCのシリアルポートは「シリアルポート」であって厳密にはRS-232C準拠ではない。)
・機器側に省略された制御線があるので普通の全二重通信はできないし、
使う前提ともしていない。(RS-232C準拠と言えない)
・通信電文は短かく、ハードウェアフロー制御(全二重通信)はない。
・送出した通信電文が欠落などしないという前提。

・通信は必ずPC側から始まる。(だから全二重通信なんていらない)
・半二重通信もどきで十分だ。(さらに簡略化している)
・簡略化しているので相手の通信状態なんて原則無視。
・この簡略化した通信方法は低い製造コストでIBM PCと通信できるように最適化。
(その方法がバッドノウハウで長年継承されている。)

・F-BASICは半二重通信方式をサポートしない。
(たとえば半二重モデム側が問題吸収する必要がある)
・F-BASICはRS-232C準拠といえない通信手順は使用する前提としていない。


ゆえに通信条件設定をF-BASICから強制的に変更しなければならない。
[fRtsControl]
0=RTS_CONTROL_DISABLE (RTSは常にOFF)←[GW-BASIC]
1=RTS_CONTROL_ENABLE (RTSは常にON) ←[F-BASIC]

633598:2015/10/29(木) 03:43:08
>>630
>プログラムで取ってしまえば問題ないのですが、このNULLが少し気になります。

 00(NULL)についてですが、いくつか可能性を挙げてみると、

・RTSをONにすると送ってくる。(なにかの対策のための動作?)
・RTSの変化に応じて送ってくる。(制御線を使わないので、代替の応答としている。)
・測定データ送信時の先触れとして送っている。(データ受信取りこぼしを防ぐため?)
・PC側から送信したコマンドを受領した意味で応答している。
・なにかのタイミングで定期的に送っている。(制御線を使わないので、生存証明。)

 おそらくGW-BASICなどでは内部の処理で、受け取った00(NULL)を捨てているので、
表にあらわれないのではないかと推測します。

 対策として次の個所(TEST2_SETSTATEの中)にプログラムを追加してください。
#'**ここで設定を変更する**
#F=DCB.FBITFIELDS '*bit毎設定必要
#'----fRtsControl----
##(省略)#

$$←←←ここに挿入$$
DCB.FBITFIELDS=F '設定

$$
'----fNull----
M=fnULL '設定値
F=F or M 'ビット設定
print "fNull書換";" (NULL BYTES 受信を破棄する)"
$$

 つぎにデータ受信本体プログラムのこの行を変更。
(変更前)if not eof(1) then print "Error:受信バッファが空でない!"
(変更後)if not eof(1) then R$(0)=input$(LOF(1),#1):R$(0)="" '最初のNULL受信破棄

 つぎにclose命令の後にこの1行を追加。
#close
TEST1_SETSTATE_NULLCHAR CM$ 'COMポートのfNull設定解除する

 最後に、以下のプログラムを追加します。(TEST2_SETSTATE〜end subの後ろ、var CM$, R$(4-1)の前)

declare sub TEST1_SETSTATE_NULLCHAR(FDSCRP$, byval SW%= 0)
sub TEST1_SETSTATE_NULLCHAR(FDSCRP$, byval SW%)
var RES as long, DCB as T_DCB
var HFILE as long
var F as long, M as long
var DEVNAME$

if SW%<0 then SW%=0
if SW%> 1 then SW%=1
select case ucase$(left$(FDSCRP$,5))
case "COM0:"
DEVNAME$="COM1"
case "COM1:"
DEVNAME$="COM2"
case "COM2:"
DEVNAME$="COM3"
case "COM3:"
DEVNAME$="COM4"
case "COM4:"
DEVNAME$="COM5"
case else
error 55 :exit sub
end select

HFILE=INVALID_HANDLE_VALUE
HFILE = CREATEFILE(DEVNAME$, (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
if DCB.DCBLENGTH<>len(T_DCB) then print "!!DCBlength(hex)=";DCB.DCBLENGTH

'**ここで設定を変更する**
F=DCB.FBITFIELDS '*bit毎設定必要
'----fNull----
F=F and (not fnULL) 'ビット消去
M=fnULL
M=M * clng(SW%) '設定値
F=F or M 'ビット設定

if DCB.FBITFIELDS <> F then
print "fBitFields(16進数)変更前=";hex$(DCB.FBITFIELDS)
DCB.FBITFIELDS=F '設定
print "fBitFields(16進数)変更後=";hex$(DCB.FBITFIELDS)

'設定を更新する
RES=SetCommState(hfile, DCB)
if res=0 then
print "Error:SetCommState"
endif
endif
RES=CLOSEHANDLE(HFILE)
endif
end sub

634名無しさん:2015/10/29(木) 18:31:47
丁寧な説明ありがとうございます。

ちょっとバタバタしていて、ちゃんとした返信が返せません。
すぐに落ち着きますので、すこしの間失礼します。

635名無しさん:2015/10/30(金) 03:12:00
>>630
>>633
修正です。 >633 の説明の「TEST1_SETSTATE_NULLCHAR CM$」から最後までは
取り消します。替わりに再オープン/クローズしてください。

#close
open CM$ for output as #2 :close #2 ' 通信設定を再初期化

 むだに見えますが、fNull の設定は解除しておいたほうがよいので。

636名無しさん:2015/10/30(金) 16:36:49
遅くなって申し訳ありません。

#632のまとめがとても参考になりました。

つまり、この計測器は簡略化された半二重通信でPCと通信をする仕様になっているので、F-BASICから通信条件を変更する必要がある。

このプログラムを実行すると、

fRtsControl書換 3 (RTS フロー制御:0..3)

と表示されるので、

3=RTS_CONTROL_TOGGLE

ということで、RTSフロー制御にTOGGLEが指定されています。

このTOGGLEというモードは(恥ずかしながら)知らなかったので調べてみたところ、

http://www.geocities.jp/terukat/_geo_contents_/win/comm.html
トグルの場合、 受信バッファにデータがなければ RTS がOFFになり、 データがあればONになります。

とあります。つまり、ここでRTSをOFFにしているという理解でよろしいでしょうか。

月曜日に、新しくコーディングしていただいたプログラムを走らせてみます。

637598:2015/10/31(土) 03:56:11
>>636
>つまり、この計測器は簡略化された半二重通信でPCと通信をする仕様になっているので

 はい、そのいう状態だと判断しました。
通信用LSIチップとしては同時に送・受信バッファの処理はできるのでしょうけれど。

>このプログラムを実行すると、fRtsControl書換 3 (RTS フロー制御:0..3)

 はい、fRtsControlという項目を RTS_CONTROL_TOGGLE(値は3)に書き換えて
Windows API のSetCommState (kernel32.DLL内)を実行してWindows経由でシリアルドライバを
設定します。

 「RTS_CONTROL_TOGGLE(トグル)モード」については、わたしもまったく知りませんでした。

で、このモード、
Windows“では”サポートされているらしく、 >624 のテスト結果ご報告にあるように
GW-BASICでは、RTS_CONTROL_DISABLE(値はゼロ)つまり、RTSは常時OFFに設定しています。
GW-BASICやQBASICでも、トグルモードは持っていないと思われ、
RTS_CONTROL_DISABLEにしています。昔はOUT命令でI/Oポートをじかに叩く制御方法が
とられたこともあるようです。

 常時OFFでいいのなら、F-BASICで問題が起こらなくてもと思うのですが、実態は
計測器側が受け取ったRTSの状態を見て、通信を保留していると推察されます。
常時ONのときだめになるので、おそらくは測定データ送信時。
PCからコマンド送信は制御線無視してのいきなり送りつけOKだが
測定データ送信は制御線を(ちゃんと?)見てから送り返していると。

 ならば常時OFFで実用上問題ないと。通信規約上はおかしいけど。
 そのいう状態だと判断しました。


>トグルの場合、 受信バッファにデータがなければ RTS がOFFになり、

 それは参照先記載の誤りで「送信バッファ」だと解釈しました。
たぶん「ハンドシェイク」の説明文につられて書き間違えていると。
 ( >621 の参照Webページ参照)

 原文はつぎのとおりです。
RTS_CONTROL_TOGGLE (0x03): トグルモード
Specifies that the RTS line will be high if bytes are available for transmission.
After all buffered bytes have been sent, the RTS line will be low.


テストプログラム >633 (+ >635 訂正)では、設定にさらにfNullの項をONにするよう
追加します。ただ、設定前に受信したNULL(00h)はそのままでしょうから、
「!!受信バッファが・・」への対処は必要なままでしょう。

※「fn」で始まる変数名はF-BASICの言語仕様上、使用できません。この追加部分にある
fnULLは(変数でもFN関数(*に見えるが)でもない)、#define 文によって
プリプロセッサで処理されているため、成立しています。

638名無しさん:2015/10/31(土) 11:30:55
おはようございます
詳細な解説ありがとうございます。

私なりに今回の通信手順を考えてみたのですが、

PCはRTSをONにする
PCは計測機に"D"を送る

PCの送信バッファが空になるので、RTSはOFFになる
計測機は"D"を受け取った後にPCのRTSがOFFになっていれば計測値をPCに送る
PCは計測値を受け取る

PCはRTSをONにする
PCは計測機に"D"を送る(print "D")

以下、繰り返し

*最初(最後)の2つステップはPRINT "D"の際に連続して行われる

たしかに半二重通信になっているので、これがRTSを使った半二重通信ということになるんでしょうね。

今回は全二重通信を前提としたWindowsのRS-232で半二重通信を行うために、工夫していただいたと思うのですが、最初から、RS-485のインターフェイスを使えば、そのままcomポートにアクセスが可能なのでしょうか。

http://www.ratocsystems.com/products/subpage/usb70.html
http://www3.contec.co.jp/B2B/ConIWCatProductPage_B2B.process?Merchant_Id=1&amp;Section_Id=6&amp;Catalog_Id=6&amp;Product_Id=1429

639名無しさん:2015/10/31(土) 13:38:02
このサイトでは、このような通信手順を「ゲート制御」とよばれています。

http://webcache.googleusercontent.com/search?q=cache:nR9WV32YowQJ:https://social.msdn.microsoft.com/Forums/ja-JP/2922a81b-d439-4a70-aaa6-28c43a63833f/com%3Fforum%3Dvcgeneralja%2Bwindows+rts+rs-485+RTS_CONTROL_TOGGLE&amp;lr=lang_ja&amp;client=safari&amp;rls=en&amp;hl=ja&amp;tbs=lr:lang_1ja&amp;prmd=ivns&amp;strip=1&amp;vwsrc=0

たしかに、PCではなくマイコンで制御するならその方がシンプルですよね。パソコン(当時はPC-98)を使いはじめて、30年も経とうとしているのに知りませんでした。

640名無しさん:2015/10/31(土) 14:25:23
このサイトでは、このような通信手順を「ゲート制御」とよばれています。

http://webcache.googleusercontent.com/search?q=cache:nR9WV32YowQJ:https://social.msdn.microsoft.com/Forums/ja-JP/2922a81b-d439-4a70-aaa6-28c43a63833f/com%3Fforum%3Dvcgeneralja%2Bwindows+rts+rs-485+RTS_CONTROL_TOGGLE&amp;lr=lang_ja&amp;client=safari&amp;rls=en&amp;hl=ja&amp;tbs=lr:lang_1ja&amp;prmd=ivns&amp;strip=1&amp;vwsrc=0

たしかに、PCではなくマイコンで制御するならその方がシンプルですよね。パソコン(当時はPC-98)を使いはじめて、30年も経とうとしているのに知りませんでした。

641598:2015/11/01(日) 05:04:14
>>638
>WindowsのRS-232で半二重通信を行うために、工夫していただいたと思うのですが、
>RS-485のインターフェイスを使えば、そのままcomポートにアクセスが可能なのでしょうか。

 RS-485(EIA-485)は、二本線一組とする平衡型伝送路で差動式の信号でやりとりし、
電気的特性はまったく異なる。
コネクタ形状やピン配置は別規格に分かれて定義。

 通信規約(プロトコル)は、RS-232から流用したものが多いものの製品次第というところで
しょうか。

 また、半二重と全二重についてもどこを指しているのかによって意味合いが異なるので、
要注意です。(RS-232でもそうですが)

仮想COMポート側から見て全二重通信のハードウェアフロー制御ONでも使用可能であれば
普通に使えるということになるかと思います。

参考情報:(アイ・ビー・エス・ジャパン株式会社、サイト内)
http://www.ibsjapan.co.jp/tech/details/rs-422-485/rs-422-485-double.html


 ソフトウェアの条件としては、
・仮想COMドライバにより、アプリケーションからは通常のCOMポートのように見えること。
(専用デバイスドライバのプロパティまたは専用ユーテリティで、COMポート番号割り当てが
固定で設定できること。)
・Win32 APIのコミュニケーション関数系(SetCommStateなど)やCreateFile関数などで
使用できること。(あるいはVB6のコントロール(MSComm)対応ならたぶんOK)

・RTS_CONTROL_TOGGLEモードが使用可能かどうかは問い合わせ確認が必要だと思います。
(もし対応不可でかつRTS_CONTROL_TOGGLEモードが必要な場合は、RTS等をその都度個別に
ON/OFF制御する処理を行う必要があり、その場合のF-BASIC実行時の影響は不明です。)

・専用デバイスドライバ(仮想COMドライバ)や専用ユーティリティの対応OSをご確認ください。
・F-BASICで使用できるCOMポートは1から5まで。(F-BASIC中の指定は"COM0:"から"CON4:")
・通信ボーレートが普通のCOMポートを越える高速レートはF-BASICで使用できないかも
しれません。(未確認事項)


○REX-USB70
※機器側I/Fは、ハード実験用向けネジ式端子台(計7ピン)。
〜〜抜粋〜〜(注:2012年2月版より)
本製品は内部でRTS/CTS DTR/DSRが処理されており、ドライバ・レシーバのON/OFF制御に
RTSとDTRを次のように設定します。
RS-455(半二重):送信時 RTSをON。受信時 RTSをOFF、DTRをON。※「RTSモード」時の場合
RS-455(全二重):送信時 RTSをON。受信時 DTRをON。

〜〜抜粋〜〜
RS485の場合はDTRを常時OMにして通常自分が送信したデータを自分で受けて
送信したデータが正しいかを確認します。
〜〜〜〜〜〜

●2015年3月出荷分からの新機能
半二重使用時、トランスミッターの自動制御モードをサポート。
 半二重通信での送信設定は、トランスミッターをRTS信号により制御する「RTSモード」の
ほか、トランスミッターが自動で送信可能状態になる「自動制御モード」の選択も可能。
本体側面のDIPスイッチ3にてモードの切り替えをおこないます。(出荷時はOFF(RTSモード))


○COM-1PD(USB)H
9ピンD-SUBコネクタ(オス)の採用により、9ピンD-SUBコネクタ(メス)のケーブルに
接続できます。
データ伝送モード(全二重、半二重)は、スイッチ(DIP SW)を切り替えることで設定を
変更できます。

〜〜抜粋〜〜
半二重、全二重の切り替えや全二重時のRTS/CTSの切り替えは、データ伝送モード用
設定スイッチ(DIP SW)で設定できます。設定は、ビット1 - 6で設定します。

半二重:
 データラインはTxDだけとなり本製品のRTS信号により、送信/受信モードを
切り替えることができます。
全二重/RTS,CTSを自己ループさせる:
 接続機器にRTS, CTS信号が無い場合、この設定にすると本製品のRTS信号をアクティブに
することで、CTS信号がアクティブになります。
全二重/RTS,CTSを相手装置と接続する:
 接続機器のRTS, CTS信号と接続して使用します。

〜〜抜粋〜〜
RTS+, RTS-, CTS+, CTS-の制御線をソフトウェアで制御や監視が可能です。
〜〜〜〜〜〜

642名無しさん:2015/11/01(日) 05:30:43
>>639
「ゲート制御」ですか...

知らないことなのでわからないのですがEIA-485の向こう側、伝送路と言えばいいので
しょうか、そこのドライバ・レシーバの切り替え(送受信の切り替え)の制御のことを
指しているのではと愚考いたします。
送信の一組(TxD+,TxD-)のみで、送信も受信も行う場合の切り替えることかと。

643名無しさん:2015/11/01(日) 10:41:56
ありがとうございます。

実際に製品を借りるか買って試してみる必要がありそうですね。
しばらく、RTS_CONTROL_TOGGLEを使いこなせるか、F-BASICのプログラムをしてみます。この手法は、計測器で使うにはノイズにも強そうですね。

644名無しさん:2015/11/02(月) 11:32:50
おはようございます。

プログラムを実行してみました。

1回目に出てくる(null)(null)は(null)になりましたが、やはり1レコードの最初にくっついているnullはそのままです。これはいつも行頭についているので、trimで取れますので問題ありません。それからフローのタイミングが合わなくなるのか、時々、"!!送信始!!"の表示後にハングします。下記が新たに633書いていただいたコードです。

declare sub TEST2_SETSTATE(byval FILENO%)
sub TEST2_SETSTATE(byval FILENO%)
var RES as long
var DCB as T_DCB, HFILE as long
var F as long, M as long

HFILE= FB63_GETFILEHANDLE(FILENO%)
if HFILE=0 or HFILE=-1 then HFILE=INVALID_HANDLE_VALUE

if HFILE= INVALID_HANDLE_VALUE then print "Error:open":exit sub
RES=GetCommState(hfile, DCB) 'ポートの設定取得
if res=0 then
print "Error:GetCommState"
else
if DCB.DCBLENGTH<>len(T_DCB) then print "!!DCBlength(hex)=";DCB.DCBLENGTH
print "fBitFields(16進数)変更前=";hex$(DCB.FBITFIELDS)

'**ここで設定を変更する**
F=DCB.FBITFIELDS '*bit毎設定必要
'----fRtsControl----
F=F and (not FRTSCONTROL) 'ビット消去
M=FRTSCONTROL :M=M and (M \ 2) '※下位ビットを残す
M=M * RTS_CONTROL_TOGGLE '設定値
F=F or M 'ビット設定
print "fRtsControl書換";RTS_CONTROL_TOGGLE ;" (RTS フロー制御:0..3)"
'--------
DCB.FBITFIELDS=F '設定

'----fNull----
M=fnULL '設定値
F=F or M 'ビット設定
print "fNull書換";" (NULL BYTES 受信を破棄する)"

'****
print "fBitFields(16進数)変更後=";hex$(DCB.FBITFIELDS)

'設定を強制更新する
RES=SetCommState(hfile, DCB)
if res=0 then
print "Error:SetCommState"
endif
endif
end sub

645名無しさん:2015/11/03(火) 01:43:50
>>644
えっ? プログラム「'----fNull----」〜〜 の挿入位置が違っているのでは。

#DCB.FBITFIELDS=F '設定  ←この行の手前(上側)です。

設定すべき値は、「fBitFields(16進数)変更後」の表示値が3811になります。


ハングアップについては、
先頭のNUL(00h)読み飛ばしの後にWAIT 50をいれてみてください。

直らない場合は、一旦、先頭のNUL(00h)読み飛ばしをやめてみてください。
(元に戻す)if not eof(1) then print "Error:受信バッファが空でない!"


TRIM$関数系では00hは排除できないと思うのですが。

646名無しさん:2015/11/03(火) 10:23:16
おはようございます。

>プログラム「'----fNull----」〜〜 の挿入位置が違っているのでは。
すみません、「$$←←←ここに挿入$$」の意味を読み切れませんでした。
明日、そこを直してみます。

こんな感じでprint文を使って送受信バッファの内容を見ているんですが、問題はないようです。WAITは入れています。

print eof(1), eof(2)
print #2,"D"
print eof(1), eof(2)
line input#1,R$(0)
print eof(1), eof(2)

ハングアップはこの2行の間です。
(eofは両方とも-1を返す)

print eof(1), eof(2)
line input#1,R$(0)

> TRIM$関数系では00hは排除できないと思うのですが。
そうでしたか。TRIM$は20hだけでしたか。

647名無しさん:2015/11/03(火) 12:05:03
>>646
 あ、“$”が「この間、省略」に見えたんですね、すみません。

>print eof(1), eof(2)
 確認がとれていないのですが、EOF関数・LOF関数はたぶん受信バッファしか取れないはず。

 TRIM$関数系は日本語対応で、半角空白および全角空白に作用します。

それで、ハングアップについてですが、可能性についていくつか。
・EOF(1)で真が返される間(空)はLINE INPUT#1 の実行は避けなければならない。
(とりあえずは受信タイムアウトの設定をしない限り)
・PRINT#2,"D" で処理後、ただちにデータが送り返されるわけではない。
(測定値確定と送信用測定データ作成、送受信切り替えのタイムラグ)
・コマンド"D"[CR]とコマンド"D"[CR/LF]とで、計測機側の動作の影響が不明。
・コマンド送信後、すべてのデータ受信を完了しないうちに次のコマンドを送ると問題の可能性。
・もし、コマンド送信-データ受信を一度に複数回おこなっている場合は、
計測機側の処理限界を超えた可能性。
・コマンド送信後、測定対象物や計測機側の問題で「欠測」した場合。この動作は不明。

・「コマンド送信 〜 データ受信完了」の一連のサイクルを高速で繰り返してはならない。
資料( >611 )より、
Caution:
For exact measurement and good communication with PC, use “data request” signal
once per one second.
Data Conversion time:
Data Conversion time is based on conversion time of ADC included in DMM and is 2 or
3 times per one second.
[翻訳]
注意:正確な測定とPCとの良好な通信のためには、1秒に1度「データ要求」信号を使用する。
データ変換時間:データ変換時間は、DMM内蔵ADC(訳注:アナログ-デジタル変換)の変換時間を
基本として、1秒あたり2〜3回である。
[了]


 最後に文字列先頭のNUL(00h)を除去する関数プログラム例を。(空白は除去しません)
(使用例): R$(0)=LTRIMCTRL$(R$(0))


declare function LTRIMCTRL bdecl (S as string) as string
function LTRIMCTRL$ (S$)
'機能:引数で指定された文字列の左側の制御コード等を取り除きます。
var I as long ,P as long ,N as long
LTRIMCTRL$=S$
N=len(S$)
if N=0 then exit function
P=0 :I=0
do
I=I+1
select case asc(mid$(S$,I,1))
case is < &H20
case &H7F,&HFF
case else
exit do
end select
P=P+1
loop while I < N
if P > 0 then LTRIMCTRL$=mid$(S$,P+1)
end function

648名無しさん:2015/11/04(水) 13:18:39
いつもありがとうございます。

そっそく、プログラムを修正しました。

NULLも取れ、ハングアップも少なくなりました
wait 50 --> wait 100 にすればもっとよくなりそうです。
長い間、お世話になりました。

ところで、マルチメーターの箱の中にFDを見つけました。これは計測をするためのGUIソフト(DMM_4660)が入っていて、これを使った後のシリアルの状態をみてみました。fBitFieldsの値(0811)をみると、fRtsControlはしていないみたいです。気づくのが遅れてすみません。


新プログラム実行後
fBitFields(16進数)=3811
fOutxCtsFlow= 0
fOutxDsrFlow= 0
fDtrControl= 1 (DTR フロー制御タイプ:0..2)
fDsrSensitivity= 0
fErrorChar= 0 (エラー時文字置き換える)
fNull= 1 (NULL BYTES 受信を破棄する=1)
fRtsControl= 3 (RTS フロー制御:0..3)
fAbortOnError= 0
ByteSize= 7
StopBits= 2 (stopビット:0=1,1=1.5,2)
ErrorChar(16進)=0
EofChar(16進)=0
EvtChar(16進)=0
終了します。なにかキーを押してください。


DMM_4660実行後
fBitFields(16進数)=811
fOutxCtsFlow= 0
fOutxDsrFlow= 0
fDtrControl= 1 (DTR フロー制御タイプ:0..2)
fDsrSensitivity= 0
fErrorChar= 0 (エラー時文字置き換える)
fNull= 1 (NULL BYTES 受信を破棄する=1)
fRtsControl= 0 (RTS フロー制御:0..3)
fAbortOnError= 0
ByteSize= 7
StopBits= 2 (stopビット:0=1,1=1.5,2)
ErrorChar(16進)=0
EofChar(16進)=0
EvtChar(16進)=0
終了します。なにかキーを押してください。

649名無しさん:2015/11/04(水) 21:44:18
今日、他の計測器を使っていて気づいたことなのですが、計測器からデータを読み出す時に、line input#でやるとハングアップする(待ち状態が続く)のですが、INPUT$でやると問題なく読み出せました。

その時も、INPUT$で指定したバイト数が、受信データと同じか少なければ読み出せるのですが、多いとline input#と同じになりました。

明日、もう一度、チェックしてみます。

650名無しさん:2015/11/05(木) 01:11:10
>>648
>これを使った後のシリアルの状態をみてみました。fBitFieldsの値(0811)をみると、fRtsControlはしていないみたいです。

 GUIソフト(DMM_4660)、これはfRtsControlはDisable(RTS常時OFF)です。
GW-BASICの場合と同じです。違いはfNullが有効になっていますね。
あ、fDtrControl=1も違いますね。

GW-BASICではMS-DOS環境が対象であり、DMM_4660はWindows環境が対象であることが、
違いに出ています。

純正品といってもよいサンプルGUIソフト(DMM_4660)の設定がこうなっているということは
fRtsControlの設定が何であれ、NUL(00h)は送られてくるという証左かもしれません。


 fNullを有効にした場合は、使用後無効にするようにしてください。
これは他のソフトの安全のためです。
F-BASICの場合はとりあえずOPEN/CLOSEを再度行えば無効に再設定されます。


>>649
 それは正常な動作です。通信相手の区別はありません。
LINE INPUT#は。改行コードを得る(かたぶんEOFコードを得る)まで処理が戻ってきません。
ゆえにもしも通信時改行コードが文字化けした場合は、永久的に処理が戻ってこなくなります。
INPUT$関数は通信時指定された文字数(バイト数またはオクテット数)を得るまで処理が
戻ってきません。

通信においてはいつ相手が残り(続き)のデータを送信してくるかは事前にわからないため
そのような動作になっています。

651名無しさん:2015/11/05(木) 15:49:54
いつもありがとうございます。

>GW-BASICではMS-DOS環境が対象であり、DMM_4660はWindows環境が対象
うーん、考察が深いです。そこまで考えませんでした。

>LINE INPUT#は。改行コードを得る(かたぶんEOFコードを得る)まで処理が戻ってきません。
>INPUT$関数は通信時指定された文字数(バイト数またはオクテット数)を得るまで処理が戻ってきません。
恥ずかしながら、これまで、INPUT$、LINE INPUT#、INPUT#の違いはあまり考えておりませんでした。

いろいろとお世話になって、とりあえずデータのロギングは問題なくなりました。
ハングアップもほとんどなくなりました。
ありがとうございました。
もう一つ相談したいことがあるのですが、それは別にします。
今後とも、よろしくお願いします。

652名無しさん:2015/11/06(金) 03:34:39
>>651
 こちらこそテスト調査に協力いただきありがとうごさいます。
おかげでRS-232C問題の回避策を実証できました。

653名無しさん:2015/11/06(金) 08:37:38
こちらこそ、勉強になりました。

ここも参考にさせていただきました。
http://infoseek_rip.g.ribbon.to/spectrum123.at.infoseek.co.jp/vb/vb_2/vb_2.htm

EscapeCommFunctionを使うと直接RTSのON/OFFができるみたいです。

ここのP.32にF-BAISCのサンプルもあったので、時間が取れたらやってみようと思います。
http://www.fmworld.net/product/soft/fbasic/faq/faq.pdf

654名無しさん:2015/11/06(金) 09:26:45
F-BASICを使って、1秒とか、0.5秒間隔で計測器からデータを読み出しています。
今はwaitを使っているのですが、もう少し精度(1/100〜1/1000程度)が欲しい。
GPSを接続して、PPSをもらうという方法もあるのですが、いつも衛星にアクセスする必要があります。
何か簡単に使える方法をご存知でしたら、教えてください。

655598:2015/11/06(金) 09:48:04
>>653
あら、FILEATTR関数があったのね。車輪の再発明しちゃいました。

656名無しさん:2015/11/06(金) 11:03:33
>>654
WindowsやPC/AT機に時刻正確性を求められても・・

WAIT命令は100分の1秒単位ですが、

とりあえずはAPIのSleepEx関数を使うとか。一応は1ミリ秒単位の指定ですが。
https://msdn.microsoft.com/ja-jp/library/cc429359.aspx


計測間隔をできるだけ正確にということであれば、次のような感じでどうでしょう

・まず、プログラム変更
1.受信バッファを大きくする。
CM$="COM0:(S7N2N7NNN,RB4096)"
open CM$ for output as #2 : open CM$ for input as #1

2.送信コマンドをWAIT命令をはさんで一定間隔で連続で送る。
最低限の送受信時間からコマンド送信間隔を試算すると、
スタートビット(1)+データ長(7)+ストップビット(2)=計10bit
受信データ14*4フレーム+送信コマンド(2)=計58キャラクタ
580÷9600bps=約6〜7/100秒
※実際は計測器側の測定データ作成時間も必要なので、当然これよりは
時間がかかる。

for I%=1 to 50
print#2,"D";chr$(13);
wait 10
next I%

3.あとで一括して受信バッファから取得する。
for I%=1 to 50
line input#1,R$(0, I%)
line input#1,R$(1, I%)
line input#1,R$(2, I%)
line input#1,R$(3, I%)
next I%

・次に実行時
1.プログラムを起動する。ただし、まだ計測開始しない。
(このとき、F-BASIC開発環境経由ではなく、実行プログラムを直接起動すること)

2.タスクマネージャを呼び出して、[プロセス]のタブから当該実行プログラムを
探して、右クリック-[優先度の設定]-[高(H)]とか[リアルタイム(R)]に設定。
※少しでも正確性をあげるため。

3.計測開始を指示。

657名無しさん:2015/11/06(金) 11:20:29
>>654
>>656
http://www.tokineko.net/realtime/page1.html

658名無しさん:2015/11/06(金) 21:14:59

>受信バッファを大きくする
あ、これいいですね。
さっそく試してみます。

>送信コマンドをWAIT命令をはさんで一定間隔で連続で送る。
これもやってみます。

今は、waitで微調整しています。

計測データは時系列なので内挿してもいいかなと思っています。
そうなると、times$の分解能が1/100秒くらいならいいんですが。
と思って、ヘルプを見たらMILLITIMEという関数があるんですね。
これを使ったら何とかなるかもしれません。

659名無しさん:2015/11/07(土) 05:07:31
MILLITIMEはミリ秒単位に再計算しているので場合によるけど
直接GetLocalTimeで要るとこだけ記録したほうが無駄がないかも。

660名無しさん:2015/11/09(月) 04:56:41
waitで調整するより「タイマーコントロール」使う方法も考えてみては

661名無しさん:2015/11/09(月) 14:44:25
ご教授、ありがとうございます。

>直接GetLocalTimeで要るとこだけ記録したほうが無駄がないかも。
すいません、Windows APIはほとんど使ったことがないのですが、マニュアルを読んでみます。

>waitで調整するより「タイマーコントロール」使う方法も考えてみては
これも初耳なのですが、ヘルプに「タイマーコントロールへの操作」という項がありますので、これを使えばいいのかな。これはGUIでしか使えないのでしょうか?もうちょっと情報を調べてみます。

662名無しさん:2015/11/10(火) 03:37:28
>>661
F-BASIC/Winの場合はGUIと非GUIというような単純な区分けではありません。
WindowsのGUIの上で、従来互換のテキスト・グラフィック画面をエミュレートする
「テキストモード」と互換性をなくすかわりにWindowsの基本機能に近い形で従来命令を
使うモードとに分かれます。

F-BASICでは従来の「手続き型」とGUIで使う「イベント駆動型」のどちらの書き方も
できます。
極端なことをすれば混在させることもある程度はできます。
テキスト画面にGUIの「ボタン」があるなんてことも。
従来の手続き型のみで似たようなことをするとON MOUSE命令やMOUSE関数やINKEY$関数を
駆使してあれこれプログラムをすることになってしまいます。

本題に戻りまして、
「タイマーコントロール」ですが、『コントロール』とはいってもそれは便宜上の
ことで、Windowsの側から発生するタイマー通知の経路をウィンドウメッセージとして
受けているためです。
F-BASIC実行環境がタイマー通知を受けるための環境作りを裏方として準備してくれる
わけです。

従来BASICでいえば、インターバル割り込み命令(INTERVAL ON命令・ON INTERVAL GOSUB命令、
INTERVAL命令)とWAIT’I’命令を使う方法と基本的な考え方は同じです。

タイマーコントロールを使うにはまず「空の」フォームを作らないといけません。
(もし、すでに作って使っているならそれ(のコピー)を使えばいいです。)
そのフォームの中のどこでもいいのでタイマーコントロールを置きます。

次にフォームに置いた(見た目そっけない)タイマーコントロールをダブルクリックする
と中身が空のプログラム(イベントプロシージャ)が作成されます。
それを丸ごとコピーして、自分のプログラムに挿入します。元のイベントプロシージャは
不要なので保存せずに閉じてください。

これが言わば「ON INTERVAL GOSUB」の飛び先の中身に相当します。

とりあずフォームを作るための参考資料
http://www.fmworld.net/product/soft/fbasic/gpib/
 ワンポイントレッスン集  第一回「実行画面を大きくしよう」

663名無しさん:2015/11/10(火) 17:15:04
ありがとうございます。

フォームは作ったことがないので一から勉強してみます。
たしかにこれができると、世界が広がりそうですね。
マニュアルはあるんですが、CD付きの参考書が見当たらないので、これを探してみます。

>そのフォームの中のどこでもいいのでタイマーコントロールを置きます。
フォームは作れそうなんですが、ここから勉強のはじまりです。

664598:2015/11/11(水) 06:54:30
サンプルです。動くかどうかは謎ですが。実行時間26秒
(TEST2_SETSTATEサンプル必須)
なお、処理時間最優先のため、実行経過の表示はありません。
#include "windows.bi"

var FRUN as long,FEND as long
var TT&(50), RR$(4-1, 50) as string * 13 'データ保管領域確保
var TIMER1 as object
var CM$, R$(4-1), CNT1&, CNT2&, I&
TIMER1.ATTACH GETDLGITEM("TIMER1")
TIMER1.SETINTERVAL 50 ' (10ms単位)

baud 0,9600
CM$="COM0:(S7N2N7NNN)"
open CM$ for output as #2 : open CM$ for input as #1
TEST2_SETSTATE 2 '←ファイル番号の対応COM設定を強制変更する
wait 100
if not eof(1) then R$(0)=input$(lof(1),#1):R$(0)="" '最初の(00h)を捨てる
while CHECKEVENT :CALLEVENT :wend
TIMER1.ENABLE -1 'タイマー通知開始

*LOOP1
'イベント発生して処理されるまで待つ(かつ変数FRUNでタイマーイベントを待つ)
while FRUN=0 :WAITEVENT :wend
if FEND then *ENDING '中止して終了する
CNT1&=CNT1&+1
print#2,"D";chr$(13);
TT&(CNT1&)=millitime ' 00:00:00からの通算時間の値(1ms単位)

if CHECKEVENT then CALLEVENT
wait 10 '受信データ作成待ち
while eof(1) and FEND=0 :CALLEVENT :wend ' 受信開始までループ
if FEND then *ENDING

if lof(1) < 14 and FEND=0 then wait 5 :CALLEVENT ' 1行受信までもう少し待つ
if CHECKEVENT then CALLEVENT
if lof(1) < 14 then
print "!!データ受信エラー!!";lof(1)
R$(0)="":if lof(1) <> 0 then R$(0)=input$(lof(1),#1)
R$(1)="":R$(2)="":R$(3)=""
else
line input#1,R$(0) :if CHECKEVENT then CALLEVENT
line input#1,R$(1) :line input#1,R$(2) :line input#1,R$(3)
endif
RR$(0,CNT1&)=R$(0):RR$(1,CNT1&)=R$(1):RR$(2,CNT1&)=R$(2):RR$(3,CNT1&)=R$(3)
CNT2&=CNT2&+1

while CHECKEVENT :CALLEVENT :wend '未処理イベントの処理
FRUN=0 '次のタイマー通知へ
if CNT1& < 50 then *LOOP1 '繰り返し

*ENDING
if CHECKOBJECT(TIMER1) then TIMER1.ENABLE 0 'タイマー停止
if CHECKEVENT then CALLEVENT
if CHECKOBJECT(TIMER1) then TIMER1.DETACH 'オブジェクトと切り離し
close

gosub *SAVEDATA 'データ保存の作業
erase TT&, RR$ :CNT1&=0:CNT2&=0
while CHECKEVENT :CALLEVENT :wend
stop:end

*SAVEDATA
'**このサブルーチンでデータを保存 例:バイナリ形式で
'**for I&=1 to CNT2&:fwrite #3,TT&(I&)
'**fwrite #3,RR$(0,I&)
'**fwrite #3,RR$(1,I&):fwrite #3,RR$(2,I&):fwrite #3,RR$(3,I&):next

'これはテスト:データ画面表示
for I&=1 to 50:print TT&(I&),RR$(0,I&);RR$(1,I&);RR$(2,I&);RR$(3,I&):next
return

'================================================================
' タイマーイベント プロシージャ
declare sub TIMER1_TIMER edecl ()
sub TIMER1_TIMER()
shared FRUN as long, FEND as long
shared TIMER1 as object
var RES as long
'print "Test:タイマー";time$
if FRUN then
TIMER1.ENABLE 0 'タイマー停止
FRUN=-1:FEND=-1 '終了
RES=MESSAGEBOX("TIMER1","処理時間があふれました!",0,0)
exit sub
end if
FRUN=-1 'タイマー通知があった
end sub
'================================================================
' メインフォーム が閉じられようとしている
declare sub MAINFORM_QUERYCLOSE edecl ( CANCEL%, byval MODE% )
sub MAINFORM_QUERYCLOSE( CANCEL%, byval MODE% )
shared FRUN as long, FEND as long
FRUN=-1
FEND=-1 '処理終了させる
end sub

665名無しさん:2015/11/11(水) 10:22:32
ありがとうございます。

いきなり本題に入るのは敷居が高いので、作成していただいたプログラムに入る前に準備をしてみたいと思い、下記を参考にしてフォームを作ってみました。これはOK.
http://www.fmworld.net/product/soft/fbasic/gpib/

次に時計マークのアイコン(タイマーコントロール)を選択してフォームに貼りつけ。
[TIMER]と書かれたアイコンがフォームに表示されます。
これをダブルクリックすると、ウィンドウが開いて、プログラムが書けるようになりました。
ここに print "hello" としても画面に表示されない。
ちょっとマニュアルを探して勉強してみます。早く参考書も探さなくては。

666名無しさん:2015/11/12(木) 04:31:17
>>665
>ここに print "hello" としても画面に表示されない。

 ヘルプの「タイマーコントロールへの操作」にあるようにATTACHやENABLEをしているなら
たぶんイベントチェックのループを実行していないから。
 いちから作成する場合は、プロジェクト ウィザードで作成すると一通り新規作成されます。
(メニュー:プロジェクト(P)-ウィザード(W)) 注:既存の.BASファイルとかつぶさないように。
ヘルプで「イベント駆動処理プログラムの作成手順」を検索して参照。

#include "windows.bi"

while 1:WAITEVENT:wend

これが作成されたイベントチェックするループです。これを見て疑問に思うでしょう。
『あれ、無限にループしているのにこれを実行するとタイマーが動くの?』
WAITEVENTは、WAIT“I”命令(割り込み処理発生まで停止する)に似ています。

 イベントチェックのループ(メッセージ処理)とは何か、たとえ話をすると、

 あなたはWindowsさんからのはがき(タイマー通知)が郵便配達されてくるのを待っています。
でもいつ到着するかなんてわかりません。郵便受けの前で待ちつづけるわけには・・。
 そこである人(イベントチェックするループ)に依頼します。
「郵便受けで待って届いたら持ってきて。」その人は根気よく待ちました。
やがて配達人がきてあちこちの郵便受けに、はがきを一枚づつ投函していきます。
 自分の郵便受け(自分が作成したプログラム)の中にはがきの束を見つけたので、
その人はその束を持って戻り、はがきの到着した順番に宛て名を見て、皆に配り始めました。
(*順番にとはいっても「至急」とスタンプされたものは優先し、「新装開店」だとか
後まわしでいいようなものは最後にしたり、「同じ割引券のはがき」は一つにまとめたりと、
この人、できる秘書さんかも)
「これはAさん..これはBさん、これはまたAさん宛てです・・」やがてあなたの前にきて、
「はがき(タイマー通知)が届いてました、速やかに処理してください。」あなたははがきを
待ってはいたのですが、いろいろとほかにやることがあるのでその後で見ようとしました。
 ですが、この人はあなたの前から一歩も動こうとしません。不思議に思い理由を問うと
『あなた様がはがきを読んだことをしかと確認し、必要であればご返事をいただくまでが
私の役目です。速やかに処理してください。』と言われてしまいした。
その強い意思に射抜かれあわてる、あなた。
モタモタしていると、向こうの方からCさんやDさんたちの声が漏れてきました。
「まだはがきがあるじゃないか、おれたち宛てのものはあるのないの、どうなってるの!?」

667名無しさん:2015/11/16(月) 08:32:19
こんにちは

返信が遅くなって申し訳ありません。
そして、わかりやすいイベントチェックのループのたとえ話ありがとうございます。

>いちから作成する場合は、プロジェクト ウィザードで作成すると一通り新規作成されます。
これでやってみます。

とりあえず、少しまとまった時間が取れれば。ダイアログにタイマーの設定時間:1/100単位と実行回数を書き換えられるようにして、実行ボタンを押せばtime$を画面に表示するプログラムを作ろうと思います。

668名無しさん:2015/11/16(月) 09:20:25
>>667
タイマー間隔をシビアにした場合、画面に表示することが、
時間間隔の乱れの要因になることがあるかもしれません。
フォームを作成したF-BASIC/Winのテキスト表示は遅い
ということもありますし。
(画面表示速度改善については586番,592番あたり参照)

669名無しさん:2015/11/17(火) 02:09:42
ハード・ソフト両面で環境の差の影響が大きいのですが、参考値として
PRINT命令でMILLITIME関数で取得する数値に影響する度合いを
試してみました。条件はフォームを作成してフォント変更・サイズを大きくします。
80桁24行の互換モードで画面のグラフイックの機能設定はONのまま。
PRINT命令で4文字出力(改行なし)を連続実行してどの程度で
MILLITIME関数の値が変わるかテスト。
なおテストした環境でのMILLITIME関数の計測分解能は10msでした。

テスト結果、最大でも、PRINT命令 70回程度。平均としてはその半分程度。

なお、テキストのスクロールを発生させた場合は、即影響が出ます。

670k5:2016/01/06(水) 11:51:33
こんにちは

昨年はたいへんお世話になりました。

ずっと他の仕事に追いまくられて、F=BASICのイベント型プログラムに取り掛かれません。
もちろん、頭の切り替えができないという情けない現状もあります。

少しだけ時間ができたので、「ON INTERVAL GOSUB」を使ってみました。
INTERVALを5秒くらいにして実行させてみると、1時間で5〜10秒ほどずれました。

cls

interval 5.0 '60秒毎に割り込みます.
on interval gosub *KAKE
interval on
do
loop
interval off
stop
end
'

*KAKE

print date$,time$

return

これでもいいのですが、もう少し何とかならないだろうかと、こんな簡単なプログラムにしました。
(とても稚拙でお恥ずかしい)


cls

KANKAKU=5.0

OWARI = (date*86400+millitime/1000.0)+KANKAKU

do

NOW =(date*86400)+(millitime/1000.0)

if NOW >= OWARI then print date$,time$,millitime:OWARI=NOW+KANKAKU

loop

input AAA$

stop
end

これで実行すると、前よりはましみたいです。
もう少し、頑張ってみますので、
今年もよろしくお願いします。

671名無しさん:2016/01/08(金) 12:49:18
>>670
>INTERVALを5秒くらいにして実行させてみると、1時間で5〜10秒ほどずれました。

確かにずれていきますね。TIME割り込み命令の方で毎回つぎの5秒後を設定する方法にして
みましたが同じ結果でした。

> NOW =(date*86400)+(millitime/1000.0)

これは単精度変数だと有効桁数が足りないので、数ヵ月後には数値が狂うのでは?
millitimeも秒未満の桁が削れていく?

そこは、こんな感じでしょうか。年越しもできるし。

OWARI =(millitime/1000.0)
do
NOW =(millitime/1000.0):if NOW < OWARI then NOW=NOW+86400
if NOW >= OWARI+KANKAKU then print date$,time$,millitime :OWARI=NOW
loop


5秒で数百万回時計を見にいくというのも・・・ CPU100% ...。

672名無しさん:2016/01/08(金) 13:16:19
>>670
長くなってしまいましたが..。millitimeの時刻読み取りを減らして見ました。
---それでも数万回、時刻読み取りするけど。
(例えるとゴルフでパターを刻んでいくようなもの)
1. interval割り込みで、4秒(以内)待ち。
2. WAITで0.1秒単位待ち。
3. 回数限定無限ループで時間つぶし。(for MUGEN_CC=・・)←※外した方が定時性はあがる。
4. 豪腕でループぶん回してmillitimeを読み続けて時刻合わせ。


deflng A-Z 'ここから暗黙の型を32bit整数型にします。
var KANKAKU, OWARI, NOW
var MUGEN_CC, MUGEN_NN, MUGEN_NN2
var KAISU%

cls
gosub *MUGENSENS

KANKAKU=5
print time$, millitime/1000#
gosub *JUSTTIME
print time$, millitime/1000#

KAISU%=0 :do while KAISU% < 720 '実行回数
gosub *JUSTTIME '時刻合わせ
print date$,time$,millitime

'*** input AAA$

KAISU%=KAISU%+1 :loop
'
stop:end
*KAKE: print date$,time$ :return
'
*JUSTTIME2:return
*JUSTTIME
OWARI=KANKAKU-(time mod KANKAKU)
if OWARI >= 2 then '差が2秒以上あるならば、
interval OWARI-1 '秒単位の割り込み。ただし1秒残す。
on interval gosub *JUSTTIME2
interval on
waiti '設定している割り込みが発生するまで停止します。
interval off
end if
OWARI=1000-(millitime mod 1000)
if OWARI >= 100 then
wait (OWARI \ 100)*10 '1/100秒単位:0.1秒粗く待つ
endif
OWARI=1000-(millitime mod 1000)
if MUGEN_NN then for MUGEN_CC=(MUGEN_NN / 1000)*(OWARI \ 10)*10 to 0 step -1:MUGEN_NN=MUGEN_NN:next

if KANKAKU-((millitime \ 1000) mod KANKAKU)>= 2 then print "Time Over!!"
OWARI=1000-(millitime mod 1000)
MUGEN_CC=0
do 'ループしてmillitimeを秒単位チェック待ち
MUGEN_CC=MUGEN_CC+1
NOW=(millitime \ 1000) mod KANKAKU
loop until NOW=0
return
'
*MUGENSENS2 :MUGEN_NN=MUGEN_CC :return
*MUGENSENS
interval 1
on interval gosub *MUGENSENS2
MUGEN_CC=0:MUGEN_NN=0
interval on
waiti '1回目発生待ち
for KAISU%=1 to 3
do '2回目以降でループ回数カウント
MUGEN_CC=MUGEN_CC+1
loop until MUGEN_NN
if MUGEN_NN < MUGEN_NN2 or MUGEN_NN2=0 then MUGEN_NN2=MUGEN_NN
MUGEN_NN=0:MUGEN_CC=0
next KAISU%
MUGEN_NN=MUGEN_NN2
interval off
return
end

673k5:2016/01/09(土) 19:59:19
こんにちは

今年もよろしくおねがいします。

>これは単精度変数だと有効桁数が足りないので、
書き込んだ後で、倍精度に直しました。
そうすると、大体1/250秒ほどの精度で時間を取れるようです。

if NOW >= OWARI+KANKAKU
この方法の場合、計測間隔の精度はいいのですが、時間的確度はだんだん正の方にずれて行ってしまいます。やはり、millitimeを基本に計測間隔±0.005秒とかの設定にした方がいいみたいです。ただし、この方法では一度ずれてしまうと、戻らなくなる可能性があります。

考え付くのは、最初に計測間隔と計測のトータル時間を決め、millitimeのリストを作って、±閾値で決めて行く方がいいのかな。あるいは、

if NOW >= OWARI+KANKAKU

のあとで、差分を求めて、その差分を次の間隔から差し引くということです。
つまり、5.1秒だったなら、次は4.9秒にするということです。

>millitimeの時刻読み取りを減らして見ました。
これ頂きます。waitだけ使うともっと簡単になりますね。

>(例えるとゴルフでパターを刻んでいくようなもの)
あ、いい例えですね。

それにしてもBASICは素晴らしい。
これで、USBシリアル変換のケーブルが使えれば、もっといいんですけど。

674671:2016/01/10(日) 04:27:34
>>673
>millitimeを基本に計測間隔±0.005秒とかの設定にした方がいいみたいです

そのようですね。PCの時計は使用状況(連続稼動時間・休止時間)によりますが、
だいたい月差30秒程度だと思うので。

時刻精度はOS・ハード構成によって違うでしょうから。Windows Vista以降だと
ハードウェアで「高精度イベントタイマー」を使えますが。

>millitimeのリストを作って、±閾値で決めて行く ・・・

>if NOW >= OWARI+KANKAKU のあとで、差分を求めて、その差分を次の間隔から差し引く

方法はどちらでもいいと思いますが、
「時刻(定刻)」、「時間(間隔)」のどちらを重視するかということですね。
基準となる時刻はなにを採り、どうやって取得するのか、
取れないのならどうやって近似値を作り出すか。


毎5秒として、つぎのようなパターンは許容できるのか?
・04.99秒・09.99秒(つまりマイナス方向、-0.01)の振れは許容できるのか
(見た目の1秒差:時刻05秒のはずが04秒に)。
・04.99秒・10.01秒(つまりプラスマイナス両振れ、間隔としては0.01の2倍の差)は。
・たとえば日本標準時から「平均的にほぼ一定」で時刻が進んでいくまたは遅れていく。
・仮定として、他の計測データとのなんらかの照合をすると時刻・時間の基準が違うが。
・millitimeを補正した場合、PC上の日付時刻と、補正日付時刻と、二重に日付時刻が生じるが
何らかの証跡として問題ないか。

差分補正はどう処置するのが問題に。
・04.99秒なので次は+0.01補正したのに、09.95秒だった。次は+0.05か+0.06か+0.04補正か。
・04.97秒なので補正していったら09.98秒、15.99秒、次はいきなり20.50秒になった。
-0.50補正を行うのか。
・04.90秒なので補正したらなぜか11.00秒になった。異常値として破棄するのか

○差分補正の欠点は誤差が蓄積されて長時間はもたないこと。誤差をさらに差分補正…。


>USBシリアル変換のケーブルが使えれば
仮想COMポート(COM1からCOM5まで)で割り当てができてハイパーターミナルから使えるもの
なら使えるかもしれない。

675k5:2016/01/10(日) 10:00:10
>「時刻(定刻)」、「時間(間隔)」のどちらを重視するかということですね。
定刻を基本に、間隔が揃っているのが好ましいです。

たとえば、初期値として「時間(間隔)」と計測期間(回数)を与えると、計測するべき時刻(定刻)」は自ずから決まってくるので、それをmillitimeで見ればいいかなと。この場合、時間の触れが+方向に限定されるのが少し気になるところ。

millitimeを一日まわして気づいたのですが、時間によってmillitimeの揺らぎ精度が違うみたいです。1/100になったり、1/1000になったり。割り込みやデーモンとの関係があるんでしょうね。やはり、目標値を1/100秒程度がいいところなのかも知れません。あくまでもmillitimeとtime$は同じハードから時刻を得ているというのが前提ですが。

仮想COMポートとしては認識しているんですが、相手側のシリアルコントローラと相性が悪いのか。使えないことがおおいです。電圧値が違うからなんでしょうか。間にレベルコンバーターなどを入れれば動くのかな。

676671:2016/01/11(月) 03:20:15
>>675
>それをmillitimeで見ればいいかなと。この場合、時間の触れが+方向に限定されるのが少し気になる

millitimeを見張って『仮に時刻ぴったり』にできたとしても、
結局それは「過ぎ去りし時間」で+方向にだけぶれるのはいたしかないこと。
マイナス方向もありということは、時刻ぴったりの『少し前』に合わせるようなもの。
では『少し前』とはどうやって定義して決めるのかが課題。


>あくまでもmillitimeとtime$は同じハードから時刻を得ているというのが前提ですが。

millitimeとtimeは取得元は同じです。

WindowsではPCのRTCは精度が悪いので起動後、別のハード機構からの情報で
カウントして算出しているそうです。
タイマ割り込みより、millitimeの方が若干精度が高いということ。

タイマ割り込みはWindowsの互換性維持のため、精度は低いままです。


>millitimeを一日まわして気づいたのですが、時間によってmillitimeの揺らぎ精度が違うみたいです。

非リアルタイム系OSの宿命です。そもそもmillitimeを取得する行為そのもの、そして結果を
画面等に出力すること自体が「ゆらぎ」の発生源のひとつなのですから。

>やはり、目標値を1/100秒程度がいいところなのかも知れません

いかに無限ループでmillitimeを観測しようと、プリエンティブなマルチタスクOSなので、
どこかで実行権を剥奪されるので、タスク切り換え単位以下の精度を維持しつづけることは
できないので、計測時間範囲で平均値を維持するのがやっとのはずです。
まあ極論、OSをWindows Ver.3.1、F-BASIC for Windows (V3.1)にすればということですが。


>割り込みやデーモンとの関係があるんでしょうね
そういうことですね、高精度を維持したければ、
割り込みがかかる不要なハードはすべてドライバ無効化(USBなんぞ禁止)、
不要な「サービス」はすべて停止、スクリーンセーバ等禁止、省電力機能禁止、
ウイルス対策ソフトなど常駐モノは完全にキル。
NTPによる時刻同期も当然禁止。ネットワークもハード(NIC)ごと停止。
メモリ(RAM)が大量にあるならば仮想記憶のスワップファイルをゼロに。

計測中は一切画面に経過表示せず、計測データはディスクに書かずメモリに保持、
「ペンキ塗りたて」ならぬ「マウス・キーボード触るな」
張り紙が必要な精度ですね。

>電圧値が違うからなんでしょうか。間にレベルコンバーターなどを入れれば動くのかな。
うーん、USB変換ケーブルタイプはそんな感じなんですか...
電圧に関して規定がゆるいですからね。
PC/AT機のシリアルポートはケープル長が2m〜3mが限界だとかいう虚弱ぶり。
そんなのをみならっているんでしょうかね。

RS-232なら規格限界値15mだったっけ?

677k5:2016/01/11(月) 11:12:39
LinuxでGPSを使ったNTPサーバーを運用する場合、大まかな時間(1秒)はntpであわせて、それ以下はGPSから来るPPSであわせるので、これが簡単でいいところななのかと思っています。

いろいろと考えてみると、計測間隔は1/100〜1/10程度の精度で時刻は1秒以内という辺りがよさそうです。つまり、3日間連続で計測していても、定刻は秒レベルではあっている。time$で確度、millitimeで精度を確保すると。明日にでもやってみます。

>うーん、USB変換ケーブルタイプはそんな感じなんですか...
>電圧に関して規定がゆるいですからね。
USB変換チップとドライバとシリアル機器側のコントローラの組み合わせみたいですが、F-BASICを使うとほとんど動かないみたいです。実験する時は、古いシリアルポート付のノートPCを使っています。

678名無しさん:2016/01/14(木) 09:03:45
こんにちは

昨日は、times$が更新(10秒ごと)された直後のmillitimeを見てみました。
こんな簡単なプログラムです。

cls

do
if right$(time$,1)="0" then gosub *KAKE
if right$(time$,1)<>"0" then flg=1
loop
stop
end
'

*KAKE

if FLG=1 then print time$,millitime:FLG=0

return

8時間ほど走らせた結果、millitimeの末尾4桁はほとんど0000でした。

14:50:50 53450000
14:51:00 53460000
14:51:10 53470000
14:51:20 53480000
14:51:30 53490000
14:51:40 53500000
14:51:50 53510000
14:52:00 53520000
14:52:10 53530000
14:52:20 53540000
14:52:30 53550000
14:52:40 53560000
14:52:50 53570000
14:53:00 53580000
14:53:10 53590000
14:53:20 53600000
14:53:30 53610000

あくまでもPCのタイマーの表示ですが。F-Basicのmillitimeは貴重な命令ですね。

679名無しさん:2016/01/15(金) 01:56:54
>>678
>8時間ほど走らせた結果、millitimeの末尾4桁はほとんど0000でした。


 millitimeとtimeは取得元は同じで、直近上方に丸めることはないと思いますので、
millitimeの末尾3〜4桁(おそらく最後の1/1000の位は除き)がゼロでないというのは
無いはずです。

この場合、注目すべき点は、 ほ・と・ん・ど が0000であること。
ということは、0000でないものが存在しえたということ。

それは単純に豪腕ループでtime$を常時監視続けただけでは回避できないということ。


timeの時刻精度では1〜2時間でGPS取得との差異が許容誤差範囲を超えるのでは?

680名無しさん:2016/01/15(金) 03:01:18
本当に出会える出会い系ランキング
http://bit.ly/1MVgwpz

681名無しさん:2016/01/15(金) 04:13:42
>>680 :名無しさん :2016/01/15(金) 03:01:18
過疎板には貼っても無意味

682名無しさん:2016/01/15(金) 09:04:48
ちなみにprint文の前にwait100を入れると、末尾4桁は0100になりました。
millitimeでやっても同じみたいです。
if millitime mod 10000 = 0 then gosub *KAKE

ただ、print文を入れるとかなり揺らぐみたいです。
あまり深くは考えずに、間隔はtimeでやって、時刻はRTCとNTPに任せます。

>timeの時刻精度では1〜2時間でGPS取得との差異が許容誤差範囲を超えるのでは?
一日で1秒以内とすると、1/10万程度の精度になるんですね。GPS受信機の内蔵時計の精度が30ns程度と言われていますので、これだと1年で1秒くらいですか。たしかに、GPS受信機の大部分が位置情報ではなく時間同期に使われているというのは納得です。

最近は高精度のクロックが売られるようになったので、これでも使ってみるかな(冗談です)
http://www.microsemi.com/products/timing-synchronization-systems/time-frequency-references/chip-scale-atomic-clock

683名無しさん:2016/01/16(土) 04:24:08
>>682
末尾4桁(0000)とは正確なハード環境みたいですね。

>ただ、print文を入れるとかなり揺らぐみたいです。

テキスト画面のスクロールが発生するとかなりのペナルティをくらいます。(>669)

経過表示を入れるのならスクロールをしないように先頭行に戻して上書きで表示する
方法をとる必要があるでしょう。


>GPS受信機の大部分が位置情報ではなく時間同期に使われているというのは納得です。

GPSは基準時刻との時差そのものがカギ。相対性理論による補正を必要とする世界。
位置情報は新鮮な地図(高低差)と補正がカギ。

684k5:2016/01/16(土) 10:12:44
>末尾4桁(0000)とは正確なハード環境みたいですね。
DELLのワークステーションです。

>経過表示を入れるのならスクロールをしないように先頭行に戻して
>上書きで表示する方法をとる必要があるでしょう。
そうします。

>GPSは基準時刻との時差そのものがカギ。相対性理論による補正を必要とする世界。
特殊と一般、両方使われていますね。私のフィールドでは時差も使いますが、位相差も使います。2台のGPSで同じ信号を受信してその位相差で相対位置を求めます。

Linuxでもbasicが動かないかと調べていたら、freeBasicという処理系があるようです。これはQBコンパチみたいなので、少し期待しています。

685名無しさん:2016/01/16(土) 10:50:20
>>684
>2台のGPSで同じ信号を受信してその位相差で相対位置を求めます。

そういう使いかたがあるんですね。

Linuxの方がタイムスライスの粒度が細かいので、向いているでしょうね。

686k5:2016/03/20(日) 13:03:40
また、相談させてください。

GPSから1秒ごとに出力されるデータを読み込んでPCのディスクに書き込んでいます。
データは文字で90バイトほどの固定長です。
プログラムはこんな感じです。


baud 0,9600
open "COM0:" for input as #1
open "nmea.txt" for create as #2

do

line input #1,GPGGA$
open "nmea.txt" for create as #2
print #2,GPGGA$

loop

しばらく(10分ほど)は動くのですが、読み出すタイミングが悪いのか、やがてプログラムがハングアップしてしまいます。フロー制御も、OFF、xon/off、ハードと試してみたのですが同じです。仕方がないので、teratermのログとして保存していますが、やはりプログラムから直接読めた方が便利です。

計測機器から一定時間で流れてくるデータを読む方法って、やはりイベント駆動型にした方がいいんでしょうか。

687名無しさん:2016/03/20(日) 19:31:46
女に年収バレた結果www
http://bit.ly/1R5A6lq

688名無しさん:2016/03/23(水) 04:14:49
>>686
対症療法としては10分たつ前にCOM0: をcloseして再オープンしてみるとか。


ハングアップするならline input# でしょうから、こんなかんじだとどうでしょうか。
(*改行コード含め90バイトとして。)

CHK_TIME%=((time mod 60)+2) mod 60 'リミットをおよそ2秒後に設定
do while lof(1) < 90
if (time mod 60) = CHK_TIME% then print "**受信エラー**" :exit do
loop
if lof(1) < 90 then GPGGA$=input$(lof(1), #1) else GPGGA$=input$(90, #1)

if right$(GPGGA$,1)=chr$(13) then GPGGA$=left$(GPGGA$, len(GPGGA$) - 1)

689k5:2016/03/23(水) 10:24:09
ありがとうございます。教えていただいたコードを組み込んで実行したところ、30分を経過してもまだ止まっていません。今日一日、ログをとり続けてみます。またご報告します。

690k5:2016/03/23(水) 19:44:23
こんばんは

8時間たっても動いています。
このコードは大切に使わせていただきます。
ありがとうございました。

691名無しさん:2016/03/26(土) 03:05:55
【キャリア】40歳になってようやくわかる8つのこと。
http://bit.ly/22ru7TF

692名無しさん:2016/03/27(日) 04:29:54
プログラム(>672)は
KANKAKUを1秒に設定にすると正常に動作しないので、サブルーチンを修正しておきます。
それから*MUGENSENSおよび*MUGENSENS2サブルーチンは削除します。
処理内容は変更しました。
1. interval割り込みで、2秒未満まで待ち。
2. WAITで0.1秒単位待ち。
3. 指定時刻まで残り時間が0.1秒近くある場合は一回WAITで待って、完了とする。
4. 3の処理をしない場合に限り、豪腕でループぶん回してmillitimeを読み続けて時刻合わせ。

ソフト・ハード両環境によるが、次の1行を順次変更することで精度を上げられるかもしれません。
→→ if OWARI>=30 and OWARI < 100 then wait (1+(OWARI \ 10)) :return
1. if OWARI>=30 and OWARI < 100 then wait (0+(OWARI \ 10)) :return
2. if OWARI>=30 and OWARI < 100 then wait (0+(OWARI \ 10))
3.コメントアウトしてプログラムから外す。
※2、3の変更案は、負荷がかかります。


*JUSTTIME2:return
*JUSTTIME
OWARI=millitime
if (OWARI mod 1000)>=900 and KANKAKU>=2 then
OWARI=1000-(OWARI mod 1000)
wait 1+(OWARI \ 10) 'ここは越えるようにする
endif
OWARI=KANKAKU-((millitime \ 1000) mod KANKAKU)
if OWARI >= 2 then '差が2秒以上あるならば、
interval OWARI-1 '秒単位の割り込み。ただし1秒残す。
on interval gosub *JUSTTIME2
interval on
waiti '設定している割り込みが発生するまで停止します。
interval off
end if
OWARI=1000-(millitime mod 1000)
if OWARI >= 100 then
wait (OWARI \ 100)*10 '1/100秒単位:0.1秒粗く待つ
endif

OWARI=1000-(millitime mod 1000)
if OWARI>= 100 then MUGEN_CC=-1:return '←TIME OVER!!
OWARI=millitime
if KANKAKU-((OWARI \ 1000) mod KANKAKU)>= 2 then
MUGEN_CC=-1 :return '←TIME OVER!!
OWARI=1000-(OWARI mod 1000)
else
OWARI=1000-(OWARI mod 1000)
endif

OWARI=1000-(millitime mod 1000)
MUGEN_CC=0
if OWARI >= 100 then return
if OWARI>=30 and OWARI < 100 then wait (1+(OWARI \ 10)) :return
if KANKAKU < 2 then
do 'ループしてmillitimeを秒未満チェック待ち
MUGEN_CC=MUGEN_CC+1
NOW=(millitime mod 1000)
loop until NOW<900
else
do 'ループしてmillitimeを秒単位チェック待ち
MUGEN_CC=MUGEN_CC+1
NOW=(millitime \ 1000) mod KANKAKU
loop until NOW=0
endif
return

693k5:2016/03/30(水) 09:29:23
さっそく、このコードで試してみました、
この精度(確度)で十分です。
ありがとうございました。


deflng A-Z 'ここから暗黙の型を32bit整数型にします。
var KANKAKU, OWARI, NOW
var MUGEN_CC, MUGEN_NN, MUGEN_NN2
var KAISU%

cls
'gosub *MUGENSENS

KANKAKU=5
print time$, millitime/1000#
gosub *JUSTTIME
print time$, millitime/1000#

KAISU%=0 :do while KAISU% < 720 '実行回数
gosub *JUSTTIME '時刻合わせ
print date$,time$,millitime

'*** input AAA$

KAISU%=KAISU%+1 :loop
'
stop:end
*KAKE: print date$,time$ :return
'
*JUSTTIME2:return
*JUSTTIME
OWARI=millitime
if (OWARI mod 1000)>=900 and KANKAKU>=2 then
OWARI=1000-(OWARI mod 1000)
wait 1+(OWARI \ 10) 'ここは越えるようにする
endif
OWARI=KANKAKU-((millitime \ 1000) mod KANKAKU)
if OWARI >= 2 then '差が2秒以上あるならば、
interval OWARI-1 '秒単位の割り込み。ただし1秒残す。
on interval gosub *JUSTTIME2
interval on
waiti '設定している割り込みが発生するまで停止します。
interval off
end if
OWARI=1000-(millitime mod 1000)
if OWARI >= 100 then
wait (OWARI \ 100)*10 '1/100秒単位:0.1秒粗く待つ
endif

OWARI=1000-(millitime mod 1000)
if OWARI>= 100 then MUGEN_CC=-1:return '←TIME OVER!!
OWARI=millitime
if KANKAKU-((OWARI \ 1000) mod KANKAKU)>= 2 then
MUGEN_CC=-1 :return '←TIME OVER!!
OWARI=1000-(OWARI mod 1000)
else
OWARI=1000-(OWARI mod 1000)
endif

OWARI=1000-(millitime mod 1000)
MUGEN_CC=0
if OWARI >= 100 then return
if OWARI>=30 and OWARI < 100 then wait (1+(OWARI \ 10)) :return
if KANKAKU < 2 then
do 'ループしてmillitimeを秒未満チェック待ち
MUGEN_CC=MUGEN_CC+1
NOW=(millitime mod 1000)
loop until NOW<900
else
do 'ループしてmillitimeを秒単位チェック待ち
MUGEN_CC=MUGEN_CC+1
NOW=(millitime \ 1000) mod KANKAKU
loop until NOW=0
endif
return

694k5:2016/03/30(水) 09:44:54
最近の計測器でbluetoothで接続するタイプが増えているみたいです。たしかに配線が楽ですからね。windowsの場合はCOMポート接続ができるようです。このCOMポートをF-BASICからアクセスすることができるか、とても興味があります。

誰か、使ったことはありますか?

週末にでもbluetoothが使えるノートPCとbluetooth I/Fの簡単な温度計が借りられるので、F-BASICで使えるかテストしてみます。

695名無しさん:2016/03/30(水) 23:36:54
帰りにロジテックのBluetoothアダプタを買ってきて使ったところ、問題なくcomポートをF-BASICで使うことができました。これはとっても快適です。

購入したBluetoothアダプタはロジテックのLBT-UAN04C2という製品です。
http://bbs.kakaku.com/bbs/K0000373744/

RS-232CをBluetoothで無線化するアダプターが少々高いですが、コードの引き回しや延長距離などを考えると、これはいいです。興味のある方は、ぜひぜひ使ってみて下さい。

696名無しさん:2016/03/31(木) 06:03:14
>>694,695
試用レポート、ありがとうございます。

無線化すると便利だけれどプログラム上は通信エラーの対応処理の省略が
しづらい。

697名無しさん:2016/03/31(木) 09:42:49
そうなんですか、USBシリアル変換ケーブルが全滅状態で、RS232ポートがついているパソコンも少なくなっている時勢に、シリアル通信が出来るのはとても嬉しいです。

あとは、シリアルをBluetoothで無線化するアダプターがもっと安くなればいいなと。今は2万ほどしますからね。安いのは1万ほどであるみたいです。

Linuxを使ってCとかシェルスクリプトでも書いてみたんですが、やはりBASICは慣れているので、細かいところまで融通が利きます。これでまだしばらく、F-BASICが使えそうです。

698名無しさん:2016/04/01(金) 03:30:42
会社クビになって奨学金返済できなくなったんだが契約書にヤバイ文章が見つかった
http://bit.ly/1R5zV9T

699名無しさん:2016/04/01(金) 03:55:31
>>697
まあ、実際は電波を遮る物体が通るとかしなければ、
シリアル通信の速度程度では障害にはならないでしょうから
通信エラーは無視できるリスクでしょう。

物理的なシリアルポートに接続する無線化アダプターでは、
ケーブルなしの直結(ゼロ距離)なので、結果的に
USB-シリアル変換タイプより問題がおきにくいのかもしれません。

ソフトウェア上はBluetoothのシリアル通信のプロファイル(SPP)で
仮想的なシリアルポートとしてやりとりします。

700名無しさん:2016/04/01(金) 08:46:40
Bluetoothは2.4G帯を使うので、電子レンジとかとの干渉はないかと思っているんですが、今のところ大丈夫みたいです。

ただ、Bluetoothのドライバーが作り出す仮想シリアルポートはよくわからなくて、F-BASICではcom5にしないとアクセスできなかったりします。com3とかにすると、その入力装置は使えないというメッセージが出ます。OSやドライバーを作っている会社などの相性があるのも知れません。この辺りは、しばらく手探りが続いてゆきそうです。

701名無しさん:2016/04/02(土) 04:30:59
周波数ホッピングとか軍採用技術が使われているので速度低下ですむかと。

com1からcom4ポートはBIOS設定の関連もあると思います。
オンボードのポートが1つで(Fax)モデムカード等がないなら、
com2, 4ポートが使えるかも。
F-BASICではcom5ポート("COM4:")までしか対応していません。
ps. 仮想COMポートをオープンするのに "\\.\com9" 形式があるらしいの
ですが、オープンはできてもcomポートとしては使えないだろうし。

702名無しさん:2016/04/03(日) 00:16:16
>周波数ホッピングとか軍採用技術が使われているので速度低下ですむかと。
拡散スペクトラムですね。その昔は、話しに聞いているだけでした。身近なところではGPSが一番最初でしたか。CDMAより早かったと思います。

>com1からcom4ポートはBIOS設定の関連もあると思います。
>オンボードのポートが1つで(Fax)モデムカード等がないなら、
>com2, 4ポートが使えるかも。
うーん、この辺り不は不明です。

さきほど、同じプログラムをWindows10(64bit)で動作させましたが、他のポートでも問題なく動いています。このノートPCはbluetoothが標準装備されているので、純正ドライバーによる仮想comポートによる通信が安定しているみたいです。3rdパーティのドライバーとの相性がよくないのかも知れません。本を取り寄せて、bluetoothのお勉強をしなくては。

703名無しさん:2016/04/09(土) 17:17:33
友人関係全部切った結果
http://bit.ly/1Sepcun

704名無しさん:2016/04/11(月) 00:29:31
本当に出会える出会い系ランキング
http://bit.ly/1OgYRt7

705名無しさん:2016/04/11(月) 09:16:26
>688

CHK_TIME%=((time mod 60)+2) mod 60 'リミットをおよそ2秒後に設定
do while lof(1) < 90
if (time mod 60) = CHK_TIME% then print "**受信エラー**" :exit do
loop
if lof(1) < 90 then GPGGA$=input$(lof(1), #1) else GPGGA$=input$(90, #1)

if right$(GPGGA$,1)=chr$(13) then GPGGA$=left$(GPGGA$, len(GPGGA$) - 1)


いつもお世話になります。
せっかくなんで、このコードの意味を解説していただけると勉強になります。
恥ずかしながら、自分なりに読んでみました。

*ここから始まり

CHK_TIME%=((time mod 60)+2) mod 60 'リミットをおよそ2秒後に設定
*現在の通算秒数を分に換算して、そのあまり秒に2秒を足してを待機する上限時間を求める。最後の(mod 60)の意味がよくわかりません。

do while lof(1) < 90
if (time mod 60) = CHK_TIME% then print "**受信エラー**" :exit do
loop

受信バッファが90バイトに達するまで読み込む。
もし、その間に上限時間を超えたらdoープを抜ける

if lof(1) < 90 then GPGGA$=input$(lof(1), #1) else GPGGA$=input$(90, #1)
もし、受信バッファが90バイトに達していなければGPGGA$に入っているだけ代入する。
そうでなければ、、受信バッファから90バイトをGPGGA$に代入する

if right$(GPGGA$,1)=chr$(13) then GPGGA$=left$(GPGGA$, len(GPGGA$) - 1)
GPGGA$の行末コードを削除する

よろしくお願いします。

706688:2016/04/12(火) 02:57:29
問題の有るコードではあるのですが――。疑問点に回答します。

>>705
>最後の(mod 60)の意味がよくわかりません。

これは通算秒数から剰余計算で秒部分(0〜59秒)を取り出した後、
現在時刻が58〜59秒だった場合、2を加算して2秒後を求めただけだと60秒以上になるため。
ラウンドアップへの対処。

>受信バッファが90バイトに達するまで読み込む。

処理1件分のデータが受信バッファにたまるまで『あえて読まずに』待つ。
2秒程度の時間切れ条件判断はもしもの場合の保険。

>もし、受信バッファが90バイトに達していなければGPGGA$に入っているだけ代入する。

補足説明すると、受信データが90バイト固定長以外のデータが受信された場合や途中までしか
送られてこなかったような場合など、とりあえず処理継続することを優先する意図があります。

本来はIF文で場合分けする必要はない(GPGGA$=input$(lof(1), #1)のみですむ)のですが、
問題原因がデータの形式にあった場合などのための対処への意図を含めた結果です。


実際にデータを読み込む処理をしているこの2行についてですが、

>if lof(1) < 90 then GPGGA$=input$(lof(1), #1) else GPGGA$=input$(90, #1)
>
>if right$(GPGGA$,1)=chr$(13) then GPGGA$=left$(GPGGA$, len(GPGGA$) - 1)
>GPGGA$の行末コードを削除する

90バイトそろっているのであれば、
ごく普通にLINE INPUT#1,GPGGA$ ひとつで済ませてもよいとは思いますが、
問題を確実に回避することを優先して、LINE INPUT# を使わないという選択肢をとりました。

707名無しさん:2016/04/12(火) 09:11:22

丁寧な解説、ありがとうございます。

(mod 60)の意味、そうだったんですね。
理解できました。

シリアル通信がbluetoothなどで仮想化されたり、計測器もコントローラーとセンサー部分が無線モデムを使ったシリアル通信をしていると、パケットの衝突などが起きて、データが一定時間流れてこない状況が時たま発生します。伝統的な実物のシリアルケーブルならLINE INPUT#で苦なく読めたデータもこのように工夫しないといけないのですね。教えていただいてとても勉強になりました。今後ともよろしくお願いします。

708688:2016/04/13(水) 02:44:42
>>707
>計測器もコントローラーとセンサー部分が無線モデムを使ったシリアル通信をしていると、
>パケットの衝突などが起きて、データが一定時間流れてこない状況が時たま発生します。

なるほど、昨今そういった状況になっているのですね。

 ただ、「(ある/一定)時間流れてこない」といった状況でLINE INPUT# が使えない
わけではないはずです。COMポートに対してのLINE INPUT#は、改行コードが流れてくるまで、
「F-BASIC内部でいろいろ処理しながら」待ち続けるのが仕様です。
(ただしopen命令でタイムアウト指定をしない場合)
改行コードが文字化けしない限りは問題ないはずなのです。

問題の発生要因は、RS/CSなどの制御線の制御タイミングが関わっていると見るのが妥当です。

シリアル通信プロファイル(SPP)による通信のエミュレートや、計測器側の動作も含め、
相性問題もあるかもしれません。

709名無しさん:2016/04/13(水) 17:40:05

>なるほど、昨今そういった状況になっているのですね。
PCからはシリアルポートがなくなりつつありますが、周辺機器ではまだまだ現役ですからね。

>シリアル通信プロファイル(SPP)による通信のエミュレートや、
>計測器側の動作も含め、相性問題もあるかもしれません。
SPPの品質はスタックの出来次第らしいです。東芝やモトローラーのが評判いいです。もう東芝は外販していないみたいですが、bluetooth付のdynabookは安定していると聞いています。またもうディスコンになった東芝のusbドングルもプレミアがついて驚くほどの高値です。

710名無しさん:2016/04/15(金) 16:54:56
本当に出会える出会い系ランキング
http://bit.ly/1OgYRt7

711名無しさん:2016/04/20(水) 15:28:30
本当に出会える出会い系ランキング
http://bit.ly/1OgYRt7

712名無し:2017/02/24(金) 23:18:46
何方か教えて下さい、長く使用してなかったのですが、思い付きでfbasicをWidows7に入れてみたら結構動くのが解って、
今いろいろ試して楽しんでいます、使ったことの無い Choosefont(****,0,0) 命令の書き方が解りません。
**** の部分にはガイドでは「フォント」と書いてありますが、何方か詳しく教えて頂けませんか、フォント名の変更に
苦労してます。

713名無しさん:2017/02/27(月) 05:38:49
CHOOSEFONTの 「フォント」にはFONT構造体型の変数を指定します。
フォント選択ダイアログで選択されたフォントの情報がFONT構造体に格納されます。

#include "WINDOWS.BI" '-- FONT構造体の定義が読み込まれます。
var FFONT as FONT '---- 変数名FFONTの「FONT構造体」を宣言

 ヘルプ「プログラミングガイド」の [ダイアログボックス] - [コモンダイアログボックス]の
頁の[フォント選択ダイアログボックス]の説明にプログラム例があります。

SETFONT命令などでフォントの設定をしてから描画命令を実行します。

FONT構造体型の内容です(※ヘルプのどこかの頁には誤記があったような気が)。
type FONT

size as single 'フォントサイズ
bold as integer 'ボールド(太字)指定の有無
italic as integer 'イタリック(斜体)指定の有無
underline as integer 'アンダーライン(下線)指定の有無
strikeout as integer '消し線指定の有無
ffname as string * 32 'フォント名

end type

 なお、このFONT構造体はF-BASIC専用です。Windows APIのFONT構造体等とは違いますので、
F-BASICの組込命令を使用せずにフォント選択ダイアログを呼び出したり、
Windows APIでフォント操作をする場合には適用できません。

714名無し:2017/03/10(金) 21:50:57
ご指導有難う御座いました、不在にしてたので遅くなりました。「プログラミングガイド」に
少し記載がありました。いろいろ試してみます。今でもXPで使用してる古いソフトをリニュウアル
してみようと思っています。また解らないことがあったら投稿します。有難う御座いました。

715keinin55:2017/11/21(火) 08:48:57
F-BASICのBinにあるエラー解析ツールFBANZ63.EXEについてご教授ください。
プログラムでエラーが発生した時、解析ツールのレジストリー読込みで表示されるエラー状況の中に
APIエラーという項目がありますが、この値はどこを参照しているのでしょうか
レジストリーの場所?が解れば教えてください。

716名無しさん:2017/11/22(水) 08:13:29
>715 keinin55 様
FBANZ63.EXEのメニュー[レジリストリ(R) - 読み込み(R)]で表示される内容の参照元は
レジストリ“HKCU\Software\FUJITSU\F-BASIC V6.3\RUNTIME\ERROR”キーらしい。

APIERR [DWORD値] - たぶん「APIエラー」の参照元
CODE [DWORD値] - たぶん「エラーコード」のコード値(F-BASICのERR関数の値)
FUNC [DWORD値] - たぶん「内部関数名」を示すコード値、おそらく3Bytes長範囲値
INFO [DWORD値] - たぶん「補足情報値」おそらく1Byte長範囲値

おそらくはFUNC+INFOとランタイムバージョンとで、F-BASICランタイム内部でエラー
トラップした個所が推定できる。

717k5:2018/09/06(木) 17:35:13
こんにちは

相変わらず頑張ってF-BASICを使っています。

今回はWindows10で動くバッチファイルの中でforループから抜け出す判断をF-BASICで作ったプログラムで行おうと思っています。たとれば、このようなバッチファイルの中でhoge.exeというプログラムをF-BASICで作った場合、コマンドの実行結果としての戻り値(終了コード)を出すような関数はF-BASICに用意されていますでしょうか。

setlocal enabledelayedexpansion
for %%f in (*.txt) do (
call hoge.exe %%f
if !ERRORLEVEL! == 1 @echo %%f:ダメです。>> log.log
if !ERRORLEVEL! == 0 @echo %%f:OKです。>> log.log
)
endlocal

https://qiita.com/OutOfServiceExeption/items/031f9b55f35489624a3b

718k5:2018/09/06(木) 17:55:30
すいません、自己解決しました。

endを使えばでいいんですね。

echo off

setlocal enabledelayedexpansion
for /l %%a in (1, 1, 10) do (
call print_env.exe
if !ERRORLEVEL! == 1 @echo 1です。
if !ERRORLEVEL! == 0 @echo 0です。
)
endlocal

print_env.bas

print "hello"
end 1

719k5:2021/02/16(火) 08:36:51
こんにちは、まだF-BASICで頑張っています。

テキストファイルをシーケンシャルモードでopenして何行か読んだ後に、また少し戻って読み直すのって出来ましたでしょうか。

例えば、

open "test.txt" for input as #1

input #1,line1$
input #1,line2$
input #1,line3$
input #1,line4$
input #1,line5$

とした後に、また3行目のline3$を読みたい場合、現在のファイルポイントから3行前に戻るという命令はなかったでしょうか。

720名無しさん:2021/02/21(日) 04:17:41
いくつか方法はあると思いますが、
1.バイナリモードでオープンすればseek命令/関数が使えますが、FREADで読みこむことになります。
2.open for inputを同時に複数オープンしておき、読込処理行数をカウントしながら読み、
戻る必要がある分についてはもう一方のオープンしたほうで遅れて読み進めることで代替。
3.戻る可能性のある行数分の配列変数を用意しておき、配列に格納しながら読み進めることで代替。


新着レスの表示


名前: E-mail(省略可)

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

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

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

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