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

F橋私的メモ

1F橋:2003/08/19(火) 00:27
以下スレッドタイトル案…

次期F-BASIC案
F-BASIC総合
F-BASICとWindowsXP
N88BASIC
PC-9801/9821
愚痴歓迎雑談専用
ホームページのご意見ご感想等
初めての方。足跡どうぞ

2F橋:2003/10/14(火) 20:13
続API情報を更新(追加)予定です

…8/18に送って頂き未だ更新していないなんて口が裂けても言えない(笑
(↑言ってない(笑)書いただけです(笑))

3F橋:2004/06/30(水) 21:12
F橋私的メモ(といいながらも回避策ご存じの方。もしくはご想像つく方。ご指導お願いします)

エディットボックスでのエンター移動
http://www.geocities.co.jp/SiliconValley-Sunnyvale/8635/fbg002.htm

実際の業務でこれをメインに使おうとしておりましたがいくつか問題点があり…
現在回避できないかを考え中です

1)警告音が鳴る
  おそらく1行のみの入力にエンターを押したので警告音が出てしまうのかと…
  (Windowsの設定で警告音を出さない設定も可能だがその場合は全ての警告で無音に…)

↓ここからはエンター移動にはちょっと関係無いのですが…
' while GETASYNCKEYSTATE(&H26) :FC=100 :wend ' &H70 ↑
' while GETASYNCKEYSTATE(&H28) :FC= 0 :wend ' &H71 ↓

2)私が加えている上記の行。外すと↑で上へ↓で下へ行くは行くんですが…
文字が入っているとカーソルの位置が変わる
(エディットボックス内の操作で↑は左へ。↓は右へ勝手に動く)

3)エンターも含むのですが。押しっぱなしだと次の項目へ移らない
(「キーを離したとき」に次の項目に行こうとしておりますので…)

-----

キー入力を GETASYNCKEYSTATE()で判断しております
どこにフォーカスがあってもキー入力がとれる点ではinkey$より長所です
ただし「押されているかどうか」だけなのでエディットボックスにもキー入力が反映されます

↓キーを押した時。GETASYNCKEYSTATE()でキー入力を検知しフォーカスの移動まではOK。
その後エディットボックスで↓キーが押された事になりカーソルが右へ一つ移動してしまいます

離した時の判断は…ソースを触って初めて分かったのですが
GETASYNCKEYSTATE…キーが押されているかどうかでinkeyじゃないんすよね…
ちょっと押しただけでも最低2〜3回はこの命令に引っかかってしまいます
アクションゲームのジョイスティックならいいんですが…
通常のキー入力の様に「た.たたたたた」と入力されない…って分かります?
(inkey$で←キーや→キーでアクションゲームを作ろうとした方ならすぐ分かるかもですが…)

Windows2000まではエディットボックスを使わず in$=input$(1) で
文字を1つずつ判断する独自の入力処理を使っておりましたが
XPだけでなく次期OSまで考えると何とかエディットボックスで実現出来ないだろうか?と考えております

…諦めようかな…そしてActive(略)に乗り換え…(マテマテマテマテマテ

-----

WindowsのPOSだから当然Enterや↑↓キー使えないっすよ!TABでの移動が常識っしすよ!
…と…(言いたいんだけど)お客様には言えない…

4F橋:2004/06/30(水) 21:27
なんとかこの GETASYNCKEYSTATE() 関連で解決出来ないかなぁ…

・このルーチン奧だけでエディットボックスの設定はほとんど触らずに済む
・↑↓のみならずF1〜F12等全てのキーを横取り可能

このルーチン完成出来れば開発も早く済むしイベントに苦手な人にも説明しやすいし…

話変わりますがエンター移動を GETASYNCKEYSTATE() で実現出来たgobouさん凄いっすよね
目の付け所が違うというか…良くこれを探して利用出来たなぁ。と思います

ん?今の欠点が分かっているのならF-BASICの命令をよ〜く見ればあるのかな…
例えば特定のキー入力中はエディットボックスを一時的に無効にするとか…
キーを押しっぱなしの時に「たたたたた」では無く「た。たたたたた…」というのは
前回と同じキーならどうする。ってので擬似的には出来ているんだ…
エディットボックスの辺りに何か面白い命令ないかなぁ…

じゃあ音は?…音?…いざとなったらWindowsの設定だ!(笑
いやいや。「うちのPOSはエンターで音が鳴るようにしているんですよ!」…それでもいい!(笑

…マニュアルとにらめっこしながら何か良い案が無いか探してみます

(ちなみに。このエンター移動と格闘しながら既に2週間…進まない…)

5F橋:2004/06/30(水) 21:33
そうだよ!それだよ!一時的にフォーカスなくせばいいはずだ!
だから…キー押されている最中の時にフォーカスはずせれれば…よ〜し!!

6F橋:2004/06/30(水) 21:45
あれ?まだ駄目だ…
Windowsの設定のキーボードで表示までの待ち時間を一番長く。表示感覚も一番遅く。
にすると GETASYNCKEYSTATE()での擬似的な「た。たたたたた」が早ければ
されなりにうまく行くんだけど…
(キーを押しっぱなしで 40msec(WAIT 40)で2回目のキー入力。
 2回目移行は10msecでそれ移行のキー入力とし擬似的に「た。たたたたた」をしてます)

う〜ん。やっぱり何かヒントがあるはずだ…

7F橋:2004/06/30(水) 22:01
諦めた。また後日触ります。↓現在のソース

1/2
#include "windows.bi"
declare sub MAINFORM_START edecl ()
declare sub MAINFORM_SETFOCUS edecl ()

declare function MY_IME_KAISI& lib "imm32" alias "ImmGetContext"(byval HWND&)
declare function MY_IME_OWARI& lib "imm32" alias "ImmReleaseContext"(byval HWND&,byval HIMC&)
declare function MY_IME_SIRABE& lib "imm32" alias "ImmGetCompositionStringA"(byval HIMC&,byval INFOTYPE&,byval BUF$,byval BUFSIZE&)
#define GCS_COMPSTR &H8
BUF$=string$(100,0)


SETMAPMODE 1
'
var shared CNOMAX,CNO 'editコントロールノカズ CNO・・・ニュウリョクバンゴウ
CNOMAX=8 :CNO=0
var shared CWH&(8) 'ウィンドウハンドルチェックヨウ
var shared ECON$(8) 'コントロールノジュンバン
ECON$(1)="EDIT1"
ECON$(2)="EDIT2"
ECON$(3)="EDIT3"
ECON$(4)="EDIT4"
ECON$(5)="EDIT5"
ECON$(6)="EDIT6"
ECON$(7)="EDIT7"
ECON$(8)="EDIT8"
var shared EOBJ(8) as object 'コントロールノオブジェクト
for I=1 to CNOMAX
EOBJ(I).ATTACH GETDLGITEM(ECON$(I))
next I


CALLEVENT
do
gosub *KEYCHECK 'FC,CNOケッテイ
if FC<>-1 then
select case FC
case 0,1
CNO=CNO+1
if CNO>CNOMAX then CNO=1 'CNOMAX
case 12,100
CNO=CNO-1
if CNO<1 then CNO=1
end select
EOBJ(CNO).SETFOCUS
EOBJ(CNO).SETSELTEXT 0,0,0 'カーソル位置を先頭に
'EOBJ(CNO).SETSELTEXT 0,-1,0 'むしろ全て選択にするとか…
IF XKEY=0 THEN XKEY=1
IF GETASYNCKEYSTATE(xkey)=(-1) THEN SETACTIVEWINDOW
endif
if CHECKEVENT=TRUE then CALLEVENT
loop
end

8F橋:2004/06/30(水) 22:02
2/2
*KEYCHECK
'キーチェック FC・・・ファンクションキー CNO・・・コントロールNo

if xkey=0 then xkey=1
'while GETASYNCKEYSTATE(xkey)=-1: wend
IF GETASYNCKEYSTATE(xkey)=-1 THEN
WHILE ( GETASYNCKEYSTATE(xkey)=-1 AND XKEYCC<4 )
WAIT 8 '1/100秒単位
XKEYCC=XKEYCC+1
WEND
IF GETASYNCKEYSTATE(xkey)=-1 THEN WAIT 10
'FC=-1: GOTO *KEYCHK.RET
ELSE
XKEYCC=0
ENDIF


FC=-1
'
WH&=GETFOCUS
W=0 'フォーカスチェック,CNOケッテイ
for I=1 to CNOMAX
if WH&=CWH&(I) then W=I :exit for
next I
if W>0 then
CNO=W
'--- カンジヘンカンチュウノチェック
WI&=MY_IME_KAISI(WH&) 'コンテキストハンドル
WWW&=MY_IME_SIRABE(WI&,GCS_COMPSTR,BUF$,0)
WW&=MY_IME_OWARI(WH&,WI&)
if WWW&<>0 then
while GETASYNCKEYSTATE(&HD) :wend
endif
'
while GETASYNCKEYSTATE(&H10) and GETASYNCKEYSTATE(&HD) :FC=100 :wend 'シフトエンター
while GETASYNCKEYSTATE(&H70) :FC= 1 :wend ' &H70 F1
while GETASYNCKEYSTATE(&H71) :FC= 2 :wend ' &H71 F2
while GETASYNCKEYSTATE(&H72) :FC= 3 :wend ' &H72 F3
'・・・・
while GETASYNCKEYSTATE(&H7B) :FC=12 :wend ' &H7B F12

'while GETASYNCKEYSTATE(&HD) :FC= 0 :wend ' &HD Enter
'while GETASYNCKEYSTATE(&H26) :FC=100 :wend ' &H70 ↑
'while GETASYNCKEYSTATE(&H28) :FC= 0 :wend ' &H71 ↓

IF GETASYNCKEYSTATE(&HD) THEN FC= 0:XKEY=&HD ' &HD Enter
IF GETASYNCKEYSTATE(&H26) then FC=100:XKEY=&H26 ' &H26 ↑
IF GETASYNCKEYSTATE(&H28) then FC= 0:XKEY=&H28 ' &H28 ↓



endif
return

sub MAINFORM_START()
EOBJ(1).SETFOCUS
' ウィンドウハンドル決定
for I=1 to CNOMAX
CWH&(I)=EOBJ(I).GETHWND
next I
'
end sub
'
sub MAINFORM_SETFOCUS()
'if CNO>0 then EOBJ(CNO).SETFOCUS
end sub

9ニャン子:2004/07/01(木) 16:41
ニャン子です。
ENTERキーによるフォーカスの移動に限ってですが、
FbHack.lzhを更新しました。

http://www.geocities.co.jp/SiliconValley/1223/FbHack.lzh

FbHack.DLLはコールバックを行いますのでENTERが押下されたかを監視
していますが、これに加えプログラムを簡単にする為「ATTACH」と「DETACH」
の拡張関数を用意し、F-Basicプログラム側から一切制御せずにENTERに
よる改行を可能にしています。よろしければご利用ください。(再配布可)

事前にプログラムのヘッダ部に「#include "FbHack.bi"」を記述し、開発環境
(プロジェクトフォルダ内)に「FbHack.DLL」と「FbHack.bi」をコピーして
おいてください。

「ATTACH方法」

EditObj1.AttachEx GetDlgItem("EDIT1")
EditObj2.AttachEx GetDlgItem("EDIT2")
EditObj3.AttachEx GetDlgItem("EDIT3")
  ・・・・

「DETACH方法」

EditObj1.DetachEx
EditObj2.DetachEx
EditObj3.DetachEx
  ・・・・

10F橋:2004/07/01(木) 20:33
>>9
ニャン子さんありがとうございます!
早速試してみます

>(再配布可)
あ。ありがとうございます!

11F橋:2004/07/01(木) 21:14
ダウンロードし早速使って見ようと思ったのですが…
え?え?って感じだったので

http://www.geocities.co.jp/SiliconValley/1223/fb19.html
こちらを参考に(というかそのままコピーして)実行してみました

理由はなんとなくしか分からないのですが。とりあえず成功しました
で。理由がなんとなくしか分からないので現在この辺りを調べております
(↑キーと↓キーや[f1]〜[F12]キーの取得も必須なので…)

http://www.geocities.co.jp/SiliconValley/1223/fb19.html
こちらを見ているのですが…
多分MAIN.BASのみを触るだけでキー操作が出来る…気が…

>第二の悩み「特殊イベントが発生しない」
>通常はキーボードの処理以外にイベントを横取りする必要はあまり無いと思われますが、
>左記の様なロジックを組む事でMain.Bas側でWindowsメッセージを取得する事が出来ます。

MAIN.BASのみの変更で(あとは >>7 >>8の応用で)多分出来ますよね?

えーと。だから…
fbhack.biを使うとエディットボックスでのキーの入力の判定が MAIN.BASで可能
→つーことは MAIN.BASで SETFOCUSを使えば移動可能

…あってますよね?(汗

とりあえず今からこれの実験をしてみます

12F橋:2004/07/01(木) 21:29
あれ?

>http://www.geocities.co.jp/SiliconValley/1223/fb19.html
>
>第二の悩み「特殊イベントが発生しない」
>イベント横取り処理

ここに main.bas と mainform.sub のサンプル例が書いてあるのですが…

ここの mainform.sub 側…

>sub MAINFORM_KEYDOWN(ScanCode As Long)
>
> < キー押下判定処理 >
>
>end sub

ここを変更するだけで自分のしたい事全て出来る気が…
多分 ScanCode に キーの何かのコードが入るから
それを取得して↑だったらどうする
(例えばエディットボックスを配列にしておいて1つ減らす。とか)
[F・1]キーならどうする(例えば終了する。とか)というのが出来る気が…

ScanCodeにどういう風に入るかはGoogleで検索すれば見つかりますよね

-----

現在のハードルは…もっと下だったりする…

1)main.bas mainform.sub の変数の受け渡しとか共通の変数とかの定義と…
2)declare sub 〜 sub xxxx 〜 end sub がどういう感じで変数を受け渡すか…

…すいません。その程度なんです
(HPの熟読より…F-BASICのマニュアル熟読のが先ですね(汗

13F橋:2004/07/01(木) 22:01
>sub MAINFORM_KEYDOWN(ScanCode As Long)
>
> < キー押下判定処理 >
>
>end sub

ここの処理を何も考えずに(declareとかsubとか分からずに)

>declare sub MAINFORM_KEYDOWN edecl (ScanCode As Long)
>sub MAINFORM_KEYDOWN(ScanCode As Long)
>
> if scancode = &h70 then EDIT1.SETFOCUS
> if scancode = &h71 then EDIT2.SETFOCUS
> if scancode = &h72 then EDIT3.SETFOCUS
>
>end sub

こんな感じにしたら…動きますね…

う〜ん。ナイス感!>自分(w

main.basでのエディットボックスでのキーの判定を

> Select Case uMsg
> Case WM_KEYDOWN
> Select Case hWnd
> Case Edit1.GetHwnd
> MAINFORM_KEYDOWN( wParam )
> End Select
> End Select

ここでしているので…EDIT1 EDIT2とかではなくEDIT()の様に配列にして…
で。MAINFORM_KEYDOWN( wParam ) を MAINFORM_KEYDOWN( wParam, EDITNO) の様に
どこのエデットボックスからなのかを分かるようにすれば
mainform.sub側で ↑キーだから 1つ上のエディットボックスへというのが出来るはず…


よし!完璧!頑張るぞ!…と思ってた矢先にゴキブリと目があったので帰ります(笑

14F橋:2004/07/01(木) 22:06
2週間以上悩んでいたのが2〜3日で解決できそうです
ニャン子さんありがとうございました

------

このエディットボックスの件ですが…
一通り満足行く出来になったらこのHPで公開させて頂きたいのですが…
(責任は持たないけど他のHPへの転載や商用利用等、お好きな様にどうぞ。の様な感じで)

15ニャン子:2004/07/02(金) 00:03
ニャン子です。

> 理由はなんとなくしか分からないのですが。とりあえず成功しました
> で。理由がなんとなくしか分からないので現在この辺りを調べております
> (↑キーと↓キーや[f1]〜[F12]キーの取得も必須なので…)

GetWndProcで取得した第二引数「uMsg」はイベントそのものを表します。
uMsgが「WM_KEYDOWN」及び「WM_KEYUP」の場合、第三引数「wParam」の値は
F-Basicの「GetASyncKeyState」と同じ値で判断します。一方「WM_CHAR」の
場合は「Asc(Input$(1))」と同じ値(つまりアスキーコード)で判断します。

これはWindows上の仕様なので変える事が出来ません。

> こちらを見ているのですが…
> 多分MAIN.BASのみを触るだけでキー操作が出来る…気が…

出来ます(^^)
・・・が、なぜmain.basからmainform.subの「MAINFORM_KEYDOWN」関数を
呼び出しているかと言えば、単純にVBの言語仕様に合わせただけです。

> ここでしているので…EDIT1 EDIT2とかではなくEDIT()の様に配列にして…
> で。MAINFORM_KEYDOWN( wParam ) を MAINFORM_KEYDOWN( wParam, EDITNO) の様に
> どこのエデットボックスからなのかを分かるようにすれば
> mainform.sub側で ↑キーだから 1つ上のエディットボックスへというのが出来るはず…

出来ますが、このままでは↑や↓などのキーを押すとBEEP音(チャイム音?)
・・・いわゆる「チーン」という音が鳴ります。
これを回避する方法としては「もう一つのメッセージ取得」をご参照頂き、
xxxx_MOUSEMOVEイベントでキー操作に対する処理を行った後に「FbReturnCode 0」を
設定する必要があります。一方、目的のキー以外が発生した場合は「FbTrueCallBack」
を呼び出す必要があります。

http://www.geocities.co.jp/SiliconValley/1223/fb19.html

> このエディットボックスの件ですが…
> 一通り満足行く出来になったらこのHPで公開させて頂きたいのですが…
> (責任は持たないけど他のHPへの転載や商用利用等、お好きな様にどうぞ。の様な感じで)

OKです(^^)

16ニャン子:2004/07/02(金) 00:37
ニャン子です。

訂正・・・
>> ここでしているので…EDIT1 EDIT2とかではなくEDIT()の様に配列にして…
>> で。MAINFORM_KEYDOWN( wParam ) を MAINFORM_KEYDOWN( wParam, EDITNO) の様に
>> どこのエデットボックスからなのかを分かるようにすれば
>> mainform.sub側で ↑キーだから 1つ上のエディットボックスへというのが出来るはず…

> 出来ますが、このままでは↑や↓などのキーを押すとBEEP音(チャイム音?)
> ・・・いわゆる「チーン」という音が鳴ります。
> これを回避する方法としては「もう一つのメッセージ取得」をご参照頂き、
> xxxx_MOUSEMOVEイベントでキー操作に対する処理を行った後に「FbReturnCode 0」を
> 設定する必要があります。一方、目的のキー以外が発生した場合は「FbTrueCallBack」
> を呼び出す必要があります。

テストしてみた所、↑や↓を押した時にBEEP音(チーンという音)は鳴りません
でした。なので、F橋さんの提案通りmain.basで直接「wParam」を判断し、
処理に応じたSETFOCUSが行えます。

17ニャン子:2004/07/02(金) 09:28
ニャン子です。

> で。理由がなんとなくしか分からないので現在この辺りを調べております
> (↑キーと↓キーや[f1]〜[F12]キーの取得も必須なので…)

とりあえずですが、F橋さんのやりたい事というのは下記の様なプログラム動作を
作成されたいと考えてよろしいのでしょうか?

http://hp.vector.co.jp/authors/VA025808/SK09.lzh
(約910KB)

試しにダウンロード/ファイル展開後、SK09.exeを実行してみてください。
(あくまで動作イメージの例なので詳細は省かせて頂きます)

このプログラムもF−Basicで作成していますが、標準のF−Basicと
違い画面処理を独自の画面ライブラリで処理している為、MS−DOSの様な
処理を実現しています。

ただ、F−Basic(というよりWindows標準)の画面処理を作成する場合も
難しい事では無いと思います。私の場合、業務ではVBを使っていますがVBでも
同じ様な事ができる以上、F−Basicでも無理では無いと思います。

私がF-Basicで業務ソフトを作るとしても、やはりWindows標準の画面処理は
免れないと思いますので、1画面毎にプロジェクトを作成し全体を遷移出来る
様にShellで各プログラムを呼び出す方法でを取ると思います。

FbHack.DLLを使った場合、EditBox入力中にF1〜F12などのキーが押されると
GetWndProcでキーの押下情報を取得する事が出来ますが、ボタン系(チェック
ボックス、ラジオボタン、プッシュボタン)やリストボックスなどに対しても
ウィンドウメッセージの横取りを設定しなければGetWndProcによる特殊キーの
取得が出来ません。

このあたりは悩む所ですが、GetASyncKeyStateによるキー取得と操作も考える
必要がありそうです。

18F橋:2004/07/02(金) 22:37
>>15
ニャン子さん>
>多分MAIN.BASのみを触るだけでキー操作が出来る…気が…
>呼び出しているかと言えば、単純にVBの言語仕様に合わせただけです。
こちらのが分かりやすいのかな…私にはまだまだ不慣れでして…
もうちょっと慣れるようにします

>> (責任は持たないけど他のHPへの転載や商用利用等、お好きな様にどうぞ。の様な感じで)
>OKです(^^)
ありがとうございます!
この辺り解決出来れば業務POSなどの開発者は非常にお役に立つと思います
(少なくとも私はF-BASICを手放さなくて良くなる(笑))

ありがとうございます!

>>16
>テストしてみた所、↑や↓を押した時にBEEP音(チーンという音)は鳴りません
わざわざテストして頂いたんですね。ありがとうございます
なんか続々と嬉しい情報が…本当に助かります。ありがとうございます

>>17
>とりあえずですが、F橋さんのやりたい事というのは下記の様なプログラム動作を
>作成されたいと考えてよろしいのでしょうか?
>http://hp.vector.co.jp/authors/VA025808/SK09.lzh

か…完璧です…
私が悩んでいた全てが…エンターで移動。↑↓で移動。
ESCやファンクションキー取得…それに黒いカーソルも…
ここまで出来るんだ…と震えてきたというか…

あ。1つ疑問が…
エディットボックスってもしかして独自ルーチンを使用されてますか?
というのも漢字の入力時に標準のエディットボックスの動きでは無く
INPUT文の様な動きをしておりまして…
要はXPやそれ以降のOSで不安になっているのですが…
(出来なければDLLを作る!というニャン子さん程の知識は全くないので…)

>違い画面処理を独自の画面ライブラリで処理している為、MS−DOSの様な
>処理を実現しています。

あ。ここでお話されてますね。見落としてました。すいません。

でも私が目指しているものはまさにそれです
(もちろん多少の項目などの違いなどはありますが…中身は全然問題無いです)

>FbHack.DLLを使った場合、EditBox入力中にF1〜F12などのキーが押されると
>GetWndProcでキーの押下情報を取得する事が出来ますが、ボタン系(チェック
>ボックス、ラジオボタン、プッシュボタン)やリストボックスなどに対しても
>ウィンドウメッセージの横取りを設定しなければGetWndProcによる特殊キーの
>取得が出来ません。

現在考えているのはエディットボックスとボタンのみで少なくとも今は考えに入ってません
理想はラジオボタンやリストボックスもなんですが…
そこまで時間がとれるかどうかが微妙なので
「ラジオボタンやリストボックスをサポートするので納期に間に合いませんでした」ではなく
「簡略化し納期に間に合わせました!」の方向にしたく思います

現在のGetWndProcのみで何とか間に合う…気がします

ありがとうございました

19F橋:2004/07/12(月) 21:35
整理前ではありますが。とりあえず目的達成出来ました
キーの動き(反応?レスポンス?)も(Windows95+V200上で)全く問題ないです

「FBHACK.BIを使ってエディットボックスで[↑]キー[↓]キーでのカーソル移動とりあえず動いた版」
(あ…しまった…ENTERキーでの移動を付けてない…。まぁここまで来ればすぐに出来ますね)

まぁ…仮仮暫定バージョンというか…もう少し整理して後日も1度公開します
(ニャン子さん。gobouさんありがとうございました!)

-------------------------------[MAIN.BAS]
#include "windows.bi"
#include "FbHack.bi"

#define WM_KEYDOWN &h0100

declare sub MAINFORM_KEYDOWN edecl (ScanCode As Long)

common shared MainForm As Object

EOBJMAX%=8
COMMON SHARED EOBJ(8) AS OBJECT
COMMON SHARED CWH&(8) 'ウィンドウハンドルチェックヨウ

VAR EOBJI AS LONG

FOR EOBJI=1 TO EOBJMAX%
EITEM$="EDIT"+MID$(STR$(EOBJI),2)
EOBJ(EOBJI).ATTACH GETDLGITEM(EITEM$)
CWH&(EOBJI)=EOBJ(EOBJI).GETHWND
NEXT EOBJI

var hWnd As Long
var uMsg As Long
var wParam As Long
var lParam As Long
var dwRet As Long

EOBJ(1).SETFOCUS

'
while 1
do while CheckEvent()
CallEvent
loop

do while FbCheckQueMessage()
GetWndProc hWnd, uMsg, wParam, lParam

Select Case uMsg
Case WM_KEYDOWN
EOBJI=0
FOR II%=1 TO EOBJMAX%
IF EOBJ(II%).GETHWND=HWND THEN EOBJI=II%
NEXT II%
''IF EOBJI>0 THEN MAINFORM_KEYDOWN( wParam ,EOBJI )
IF EOBJI>0 THEN MAINFORM_KEYDOWN( wParam )
End Select
loop
wend

-------------------------------[MAINFORM.SUB]
#include "windows.bi"
#include "FbHack.bi"

common shared MainForm As Object

COMMON SHARED EOBJ(8) AS OBJECT
COMMON SHARED CWH&(8) 'ウィンドウハンドルチェックヨウ

declare sub MAINFORM_START edecl ()
sub MAINFORM_START()
MainForm.Attach GetHwnd()
FOR J%=1 TO 8
DUMMY = FbInsertHackWnd(EOBJ(J%).GetHwnd, 0)
NEXT J%
end sub

declare sub MAINFORM_KEYDOWN edecl (ScanCode As Long)
sub MAINFORM_KEYDOWN(ScanCode As Long)

WH&=GETFOCUS
W=0
for I=1 to 8
if WH&=CWH&(I) then W=I
next I
IF W>0 THEN
IF SCANCODE=&H26 THEN
W=W-1 : IF W<1 THEN W=1
EOBJ(W).SETFOCUS
EOBJ(W).SETSELTEXT 0,0,0 'カーソル位置を先頭に
ELSE IF SCANCODE=&H28 THEN
W=W+1 : IF W>8 THEN W=8
EOBJ(W).SETFOCUS
EOBJ(W).SETSELTEXT 0,0,0 'カーソル位置を先頭に
ENDIF
ENDIF

if scancode = &h70 then EOBJ(1).SETFOCUS
if scancode = &h71 then EOBJ(2).SETFOCUS
if scancode = &h72 then EOBJ(3).SETFOCUS

end sub

20F橋:2004/07/12(月) 21:46
↑言い忘れ。エデットボックスを8つフォームに用意して下さい

-----

で。これから何をするかの予定。
ニャン子さんのC言語流の書き方とgobouさんのBASIC流の書き方と
私の「とりあえず動かして後で整理しよう!」の書き方が混在してます
(つーことは私が一番ソースを汚くしている。と…いや。今から整理するから〜)

○達成できた課題
・↑↓でエディットボックスのカーソルの移動が「普通に」可能
 この「普通」が出来なかった…
 ENTERキーで移動を忘れておりますがすぐ出来ますよね〜
 またENTERキーのみでなく特殊キーも問題無く獲得出来るので
 [F1]〜[F12]、ESC,STOP,HOME等の特殊キーの追加も簡単でしょう
 ※FBHACK.BIを用意して頂いたニャン子様。ありがとうございます
 ※エディットボックスのフォーカスの取得などの技はgobou様のおかげです。ありがとうございます

○今後の課題など
ソースが汚すぎる!(私が汚しました!(w
エディットボックスの数を簡単に変えれる様にソースをもう少し綺麗に

XPで動くのかをテスト

他のコントロールは?例えばボタン等は?

gobouさんのソースではエディットボックスの数の変更、順序の変更が楽だったのでその様に変更


ニャン子さん。gobouさん。ありがとうございました
ソースを綺麗にする。と言っても我流になるのであんまり綺麗にはならないでしょうが
可能な限り使いやすい様もう少し丁寧に変更してみます

ありがとうございました!

21F橋:2004/07/12(月) 21:51
漢字の変換中に↑キーや↓キーを押した時のチェックを今慌ててしました

「も。問題無いっすね〜」(感激

…あ。いや。XPで成功してからで無いと喜ぶのはまだですね

F-BASICのHPの管理者らしい事をほとんどしてなかったからなぁ〜
何とかこれを成功させて1つくらいは管理者らしい事をしたいっす
頑張ります!

22ニャン子:2004/07/12(月) 23:16
ニャン子です。

ENTERキーの移動ですが、MAINFORM_STARTで定義している

DUMMY = FbInsertHackWnd(EOBJ(J%).GetHwnd, 0)

の第二パラメータ「0」を「1」にする事でENTER移動が自動的に行われます。

このFbInsertHackWndが予約する処理はC言語のコールバックでキー監視を
行う事を主な目的としており、第二パラメータが「1」の場合はENTERが押される
と、あたかもTABが押されたかの様な処理に変換している為、ENTERキー動作は
TABキー動作と全く同じ動きを行います。

その部分がC言語の「LRESULT CALLBACK FbHackWndProc」にある下記のロジック
で実現されています。

if (FbHack[i].EnterKey == 0x01) {
  if (uMsg == WM_KEYDOWN && wParam == 0x0d) {
    keybd_event(0x09, 0, 0, 0);
    keybd_event(0x09, 0, KEYEVENTF_KEYUP, 0);
    return( 0L );
  }
  ・・・・
}

23F橋:2004/07/13(火) 21:00
>>22
>第二パラメータ「0」を「1」にする事でENTER移動が自動的に行われます。
すいません。以前説明して頂いてましたよね。申し訳ございませんでした

このエンターキー移動の動作は現在悩み中です
TABと全く同じ操作にするのか。それとも指定した所だけ動く様にするのか…

うまく説明出来ないのですが…特定のエディットボックスのみカーソル移動を考えており
無視したいエディットボックスも出てくると思いますので敢えてFBHACK.BIの機能は
使わない方向で考えております

[edit1][edit2]
[edit3]

[111-1111] [北海道なんたらかんたら]
[なんたら町hogehoge]

↑edit1の郵便番号入力とedit3の続きの住所はカーソル移動したいけど
edit2はカーソル移動させたく無い(郵便番号を入れると自動でedit2の住所を表示)場合も
あるかと思いますので…

せっかくご教授頂いたのに申し訳ございませんでした。
ありがとうございました

24F橋:2004/07/13(火) 21:40
ひとりごとです。もちろん調べながらやってますので。(多分)解決出来ます。
(出来ない時はまた教えて頂くかもですのでよろしくです)

↓こんな事を言いながら現在格闘中ってだけですので(笑

あれ?構造体のSHAREDはどうするんだ?あれ?MAINFORM.SUBではどういう定義なんだ?
MAINFORM.SUBで構造体の定義っているのか?
あれ構造体の文字列って普通に代入や比較出来るのか?


…こんな程度の奴がここのHPの管理人だというのをご理解下さいです(笑

25F橋:2004/07/13(火) 22:01
同じくひとりごとです

構造体変数を他で使うのにこんな格闘をしてました

common shared MainForm As Object

つーことは…これでいいのか?
COMMON SHARED VAR EIDO(ENTERIDO_MAX) AS ENTERIDO
F-BASIC「文法が正しくありません」

ん?(マニュアル読みながら)よー分からんけど…SHARED外してみるか…
COMMON VAR EIDO(ENTERIDO_MAX) AS ENTERIDO
F-BASIC「文法が正しくありません」

まだだめか…逆にSHAREDのみにしたらどうなるんだろう?
SHARED VAR EIDO(ENTERIDO_MAX) AS ENTERIDO
F-BASIC「ここでは宣言または実行できません」

F-BASIC!手強いぞ!(笑
よし!よく分からんがVARもとってみよう!
SHARED EIDO(ENTERIDO_MAX) AS ENTERIDO
F-BASIC「ここでは宣言または実行できません」

なかなかやるじゃないか!じゃあ次はCOMMONだけでコンパイル!
COMMON EIDO(ENTERIDO_MAX) AS ENTERIDO

…あ。(コンパイルは)通った(笑

という所で時間切れになってしまったので終了。
また後日マニュアル見ながら格闘します(笑

26F橋:2004/07/16(金) 21:17
構造体分からないです。挫折しました(笑
配列でやろっと。

…あ。あきらめが早いんじゃないんすよ?
切り替えが早いというか…効率を良くするためにというか…ねぇ(笑

27上村:2004/07/22(木) 20:51
お久しぶりです
挫折されてしまったあとで遅いかもしれませんが

var,common,sharedの使い方
まずvarはローカル変数を定義するためのもので

有効範囲は関数内だけです

var sharedはファイルの先頭で定義しておくと
そのファイル内のどこからでも参照できます

commonはファイルをまたいで参照する場合に使用し
common 変数名 as 型名 で使用します
ただし関数内では宣言できないのでファイルの先頭で宣言してください
commonで定義した変数を使用するにはその変数を使用する関数内で
shared 変数名 as 型名 を宣言します

これがめんどくさい場合はファイルの先頭で
common shared 変数名 as 型名
と宣言すればそのモジュール内すべてで有効になります



変数の有効範囲

1.bas

var v
var shared vs
common c
common shared cs

'ここでは v,vs,c,csが有効

sub tmp1()
' ここでは vs,csが有効
end sub

sub tmp2()
  shared v
' ここでは v,vs,csが有効
end sub


2.sub

var v '1.basとは別物の変数
var shared vs '1.basとは別物の変数
common c '共有変数
common shared cs '共有変数

sub tmp3()
' ここでは v,vs,csが有効
end sub

sub tmp4()
shared c
' ここでは v,vs,c,csが有効
end sub

説明下手ですみません

28F橋:2004/07/23(金) 22:14
>>27
非常に分かりやすいご解説ありがとうございます!
サンプル付きで教えて頂いたので var shared common の違いが非常に分かりやすいです

あの。ひとつお願いなんですが…
上記の例に加えて構造体の var shared common と配列の var shared common もご説明する気は…(おい!

いや…あの…して頂けると私が嬉しかったりしたりするですが…(マテ!

ご説明ありがとうございました

29上村:2004/07/23(金) 23:22
構造体も配列も宣言は単純変数と同じで

var 変数名 as 型名
var share 変数名 as 型名
common 変数名 as 型名
common shared 変数名 as 型名

となります
構造体の場合はこれらの宣言の前に
このように構造体を定義してください

type 構造体名
変数名 as 型名
'いくつか続く

end type


(例)
type RECT_STRUCT
left as long
top as long
right as long
bottom as long
end type

var RECT as RECT_STRUCT

'構造体の使い方は説明しなくていいですよね?

配列についても同様で

common shared LISTBOX(5) as object

LISTBOX(1).setwindowtext "TEXT"

このようにして使用できます

ちなみに構造体の配列なども確保できます
var RECT(10) as RECT_STRUCT

説明下手ですみません

30F橋:2004/07/24(土) 12:52
>>29
すいません上村さん。なんか私が催促してしまったみたいで…(してるやん!(すんません

あれ?そんなに簡単でしたっけ?
構造体は何とか分かるつもりなんですが構造体の配列の変数のうんたらが >>25
何度もやり直していたのですが…

>ちなみに構造体の配列なども確保できます
>var RECT(10) as RECT_STRUCT

えーと…>>27>>29の話を総合すれば

common shared RECT(10) as RECT_STRUCT
とすればモジュール間の全てで有効のはず…であってます?


bas
common shared RECT(10) as RECT_STRUCT

sub
common shared RECT(10) as RECT_STRUCT


としておけば .bas .subのどちらでも RECT()は同じで使える…はず…なんですよね?

…すいません。もう一度試してみます


ありがとうございました

31ロプロス:2005/02/16(水) 19:46:29
パスワードの通過方法について教えてください。
ヘルプの例文を参考にしたのですが、うまく
いきません。どなたか方法ごぞんじありませんか。
user: pass:の認証のないWebページのデータは正常にGETできます。
-----------------------------
HTTPサーバからのファイルの獲得(GET)

HTTPサーバからファイルを獲得します。定期的に更新され
るファイルをダウンロードすることができます。

#include "windows.bi"
#include "internet.bi"

input LOGINNAME$,PASSWORD$
HTTPOPEN 1, "www.fmworld.ne.jp"
HTTPGET 1, "index.html", "index.html"
HTTPCLOSE 1
stop
end

32上村:2005/02/16(水) 20:52:50
>>ロプロスさん
こちらで実験してみたのですがどのようにしても
パスワードのかかったHTTPサーバからのデータ取得はできませんでした。


サンプルに書いてある
input LOGINNAME$,PASSWORD$
については、ヘルプのFTPサーバのファイル操作にあるHTMLファイルをFTP転送する
の作成時のコピーミスだと思います。
こちらにはLOGINNAME$,PASSWORD$が参照されているのですが
入力部分が存在しません。

しかし、できませんで終わってしまうと悲しいので
wgetと言うツールを紹介しておきます。
これはサーバからファイルを取得するソフトでかなり高機能です。
やろうと思っていることはこれで実現できるかと思われます。

33F橋:2005/02/16(水) 23:03:37
>>31
うろ覚えですいません。アドレスにIDとパスワードを入れる事が出来たと思うのですが・・・

アドレスが www.fmworld.ne.jp で IDがABCDE、パスワードが12345の時に

www.fmworld.ne.jp#ABCDE#12345
の様な形で入力(IEの場合はこれをお気に入りに登録)すると
www.fmworld.ne.jpを開いてからID ABCDE、パスワード 12345を入力し開く。機能があったかと・・・
ただアドレスの後ろに入れるのが#だったか&だったか別の文字だったか・・・またどういう順番だったかが思い出せません

尚、このIDとパスワードを入力してくれる機能がIEのみだったらすいません。
(F-BASICはIEを呼び出して使ってる気がするので使える可能性もあるかと・・・)

34上村:2005/02/17(木) 10:37:31
>>F橋さん
USERNAME:PASSWORD@URL
という形式でブラウザではアクセスすることが可能ですが
昨日実験してみた限りではその形式は使用できないようです。

35F橋@役立たず管理人:2005/02/17(木) 12:06:50
>>34
F-BASICからはこれでは駄目なんですね
実験して頂きありがとうございました

相変わらず役立たずですいませんです

36ロプロス:2005/02/19(土) 04:26:32
上村さん、F橋さんありがとうございます。
ネットカメラ(PCI)のデータを読みたいのですが、パスワード認証があるので、
困っていたのです。でもIEのほうで認証通過して、更新をいくつかすると
HTTPGETで画像データをとれていたので、これでいいかな。と
思ったのもつかのま、とれてるデータは皆同じで、動画にならんな
と、なかなか簡単にはいかない次第です。IEのキャッシュを読んでいるのか、
IEの更新ボタンを自動で押す工夫がうかばないのと、それがHTTPGETに
うまく渡っているのかわからないので、思案中です。
正規購入したのですが、ヨドバシで、登録してないので質問できず
おばかさんなわたしです。うーん。遠藤周作、こりゃあかんわ。(笑)

37F橋:2005/02/22(火) 02:01:11
>>36
ネットワークカメラによっては静止画をftpで送る(例えば1秒に1回サーバーに転送する。等)ものがあるのですが・・
カメラ買い換えなければならないから難しいですよね(汗

38ロプロス:2005/02/28(月) 00:36:58
ありがとうございます。ネットカメラをかえて、FTPで
サーバにデータを送ることにしました。テストプログラム
で画像をみようと下のものを作ったのですが、BMPを
繰り返し見ることができません。
BITMAP1.DELETEOBJECT  で、デリートしたから次
読んでいいような気がするのですが。
どなたかおわかりになる方、ご教授よろしくおねがいします。

#include "windows.bi"
#include "internet.bi"
#include "image.bi"

N=0:N=val(mid$(time$,7,2))

*START
HTTPOPEN 1, "221.242.235.154"
A1$=mid$(str$(N),2):if N<10 then A1$="0"+A1$
A0$="rio"+A1$+"."
A1$=A0$+"jpg"
A2$=A0$+"bmp"
HTTPGET 1,A1$, A1$
HTTPCLOSE 1
? A1$,A2$
rem gosub 2000
JPEG2BMP A1$, A2$

var BITMAP1 as object
BITMAPOBJECT BITMAP1
BITMAP1.LOADFILE A2$
DRAWBITMAP BITMAP1, 0, 0
BITMAP1.DELETEOBJECT

gosub 3000
N=N+1

39ロプロス:2005/02/28(月) 02:12:35
上の追伸です。一度めは描画するのですが、二度目につぎのエラーがでます。

[20行]:エラー[1001]
既に利用中のオブジェクトに対して別のオブジェクトを
割り当てようとした。

20 BITMAPOBJECT BITMAP3

40ロプロス:2005/02/28(月) 02:16:30
追々伸
 たびたびすみません。BITMAP3 は1でした。失礼。
 いろいろ試したのですが。

41nisii:2005/02/28(月) 19:00:55
ビットマップオブジェクトは、DELETEBITMAPを使っただけでは、
初期化されません。

案1. ビットマップの表示処理をサブプロシージャ化する。
(end sub でその都度開放される)

案2. ビットマップオブジェクトを直接初期化する。

案1は難しくないので解説は省略。
以下は案2の例。

----------------------------------------------------
#include "windows.bi"

' 指定されたメモリブロックを初期化するAPI
declare sub API_ZEROMEMORY lib "KERNEL32" alias "RtlZeroMemory" ( byref DESTINATION as any ,

byval LENGTH& )
var shared RC as long

var BITMAP1 as object
BITMAPOBJECT BITMAP1
BITMAP1.LOADFILE "c:\test1.bmp"
BITMAP1.DELETEOBJECT

' BITMAP1 を 初期化する
API_ZEROMEMORY BITMAP1 , len( BITMAP1 )

BITMAPOBJECT BITMAP1
BITMAP1.LOADFILE "c:\test2.bmp"
BITMAP1.DELETEOBJECT

stop : end

42ロプロス:2005/03/01(火) 07:02:34
ありがとうございます。案1.でうまくいきました。恐縮ですが、もう
ひとつ教えてください。
独立型で翻訳しようとすると次がでます。設定不足なのでしょうか?
hlook1.obj : error LNK2001: 外部シンボル "_FB$HTTPOPEN@8" は未解決です
hlook1.obj : error LNK2001: 外部シンボル "_FB$HTTPGET@16" は未解決です
hlook1.obj : error LNK2001: 外部シンボル "_FB$HTTPCLOSE@4" は未解決です
hlook1.obj : error LNK2001: 外部シンボル "_JPEG2BMP@8" は未解決です
hlook1.exe : fatal error LNK1120: 外部参照 4 が未解決です。

43nisii:2005/03/01(火) 10:49:23
以下を使うと、独立型の翻訳はできません。

#include "internet.bi"
#include "image.bi"

そのプロジェクトで独立型が可能かどうかは、
「プロジェクト」…「環境」で確認できます。

44ロプロス:2005/03/04(金) 16:44:27
43<うーん、残念。ありがとうございます。
ネットカメラですが、データをFTPで転送するとき、時間で名前を
つけてくれます。
nantoka西暦月日時分秒ミリ秒.jpg のように。つまり
nanto20050304145630253.jpg
このミリ秒のところをリアルタイムに、削除して、リネームするか
copyして古いの削除するか、moveする方法ごぞんじありませんか。
翌日に、前日のものをバッチ処理して解決するのはできました。
できればリアルタイムで処理したい。httpgetでみたいのです。
 また、一日のデータは最低でも毎秒一件なので、一日ぶんだと
何万件もあり、ファイル名dirするとえらいことになります。数分かえって
こない。よい方法ありましたら、よろしくお願いします。_(_ _)_

45nisii:2005/03/08(火) 11:39:24
>>44

1つのディレクトリに溜まった大量のファイルを、
別々のディレクトリへ分類するのに、
ファイルコピー&元削除では時間がかかりすぎる、
ということでしょうか?


案1.Windowsが行っているように、プログレスバーを見せたい場合。
http://www.geocities.co.jp/SiliconValley-Sunnyvale/8635/api19.txt


案2.ファイル名の変更・移動だけを行うAPI。(宣言のみ)

'  既存のファイル名・ディレクトリ名を変更する
declare function API_MOVEFILE& lib "KERNEL32" alias "MoveFileA" ( byval OLDNAME$ , byval NEWNAME$ )
'
'  OLDNAME$ 既存のファイル名・ディレクトリ名
'  NEWNAME$ 新しいファイル名・ディレクトリ名
'  戻り値  正常終了のとき 0
'       エラーのとき 0以外


新着レスの表示


名前: E-mail(省略可)

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

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

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

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