5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

【QBASIC互換!?】FreeBasic【GPL】 2 [無断転載禁止]©2ch.net

1 :デフォルトの名無しさん:2016/12/24(土) 12:22:27.77 ID:CVYSyiU+
FreeBasic
ttp://www.freebasic.net/

建てたいって人がいたので勝手に建てた
後はご自由にどうぞ
俺は知らん
過去スレ
http://echo.2ch.net/test/read.cgi/tech/1139379786/

103 :デフォルトの名無しさん:2017/03/04(土) 19:20:41.20 ID:MZsCuszb
'declare function LCMapStringA (byval Locale as LCID, byval dwMapFlags as DWORD, byval lpSrcStr as LPCSTR, byval cchSrc as long, byval lpDestStr as LPSTR, byval cchDest as long) as long
関係。宣言は
Const MaxStringLen = 1025
Dim dwMapFlags as DWORD
Dim AZstring As ZString * MaxStringLen
Dim BZstring As ZString * MaxStringLen
Dim cchSrc as Long, cchDest as Long
Dim As Long IAA, IBB, SetFigLong()
Dim As BOOLEAN ABool, BBool, DBool
実行部は
AZstring = iAstring
cchSrc = Len(AZstring)
cchDest = MaxStringLen
IAA = LCMapString(LOCALE_USER_DEFAULT, dwMapFlags, @AZstring, cchSrc, @BZstring, cchDest)
TakaComvString = BZstring
http://msdn.microsoft.com/ja-jp/library/cc448052.aspx の日本語文が難解だから気を付けてほしい。

104 :デフォルトの名無しさん:2017/03/04(土) 19:23:36.71 ID:MZsCuszb
declare function CompareString alias "CompareStringA"(byval Locale as LCID, byval dwCmpFlags as DWORD, byval lpString1 as PCNZCH, byval cchCount1 as long, byval lpString2 as PCNZCH, byval cchCount2 as long) as long
関係。宣言は、
Const MaxStringLen = 1025
Const MaxStringLenN1 = MaxStringLen - 1
Dim dwCmpFlags as DWORD
Dim AZstring As ZString * MaxStringLen
Dim BZstring As ZString * MaxStringLen
Dim As Long IAA, IBB
実行部は
IAA = CompareString(LOCALE_USER_DEFAULT, dwCmpFlags, @AZstring, -1,@BZstring, -1)
参考は
http://www.s34.co.jp/cpptechdoc/article/comparestring/

以上2つともコンパイラーむが通っただけ。
中身のチェックなどはしていない。

105 :デフォルトの名無しさん:2017/03/05(日) 10:25:39.08 ID:rfEgkW/x
DBSC、QBでは、INT21 - 53(非公開、MS-DOSの東アジア向けバージョンにのみ搭載)だったかな、で取得できる ASCZZ文字列の取得方法がわかった。
宣言は
Dim CodePageInfo1 as _cpinfo
Dim CodePageInfo2 as _cpinfoexA
Dim dwFlags as DWORD
Dim Astring As String, Bstring As String
Dim As Long IAA
実行部は
MSReturnCode = GetCPInfo(CP_ACP, @CodePageInfo1)
MSReturnCode = GetCPInfo(CP_MACCP, @CodePageInfo1)
MSReturnCode=GetCPInfo(CP_OEMCP,@CodePageInfo1)
MSReturnCode = GetCPInfoEx(CP_ACP, dwFlags, @CodePageInfo2)
MSReturnCode=GetCPInfoEx(CP_MACCP,dwFlags,@CodePageInfo2)
MSReturnCode = GetCPInfoEx(CP_OEMCP, dwFlags, @CodePageInfo2)
参考は
'https://msdn.microsoft.com/ja-jp/library/cc422078.aspx
'declare function GetCPInfo(byval CodePage as UINT, byval lpCPInfo as LPCPINFO) as WINBOOL
'https://msdn.microsoft.com/ja-jp/library/cc422080.aspx
'declare function GetCPInfoExA(byval CodePage as UINT, byval dwFlags as DWORD, byval lpCPInfoEx as LPCPINFOEXA) as WINBOOL

106 :デフォルトの名無しさん:2017/03/05(日) 10:36:36.80 ID:rfEgkW/x
.LeadByte()に、ASCZZ文字のASCダンプでDBCSが入っている。
dwFlags は、MSの指示で0を指定する。
CP_ACP等は、MSを参照。
その他関係システムコールは
https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd317794%28v=vs.85%29.aspx
の後ろの方、「Your applications use DBCS Windows」以下参照。

107 :デフォルトの名無しさん:2017/03/05(日) 10:44:56.24 ID:rfEgkW/x
https://ja.wikipedia.org/wiki/MS-DOS
に「アジアバージョン」とかかれているのがDBCSをさぽとーしたMS-DOS。
英語版を無理に使うと日本語ファイる名がディレクトリーになったりして、散々な目にあった方々がいた。

108 :デフォルトの名無しさん:2017/03/08(水) 20:31:55.47 ID:Wan8ns7S
ついに、サブルーチンの移植総数が1000個を超えた。
大域サブルーチン 901個、局所サブルーチン 99個、作成中 3個。
Overload も全体で114個、27種類のルーチン名でまとめた。
引数の型違いのルーチンが増えれば、より多くなるだろう。

http://makoto-watanabe.main.jp/freebasic/CatPgString.html
で、KLEN、KMIDの2つしかないので、いろいろ作成中。
Dim CodePage as UINT
Dim As Long IAA, IBB, InALong
Dim TestChar as UBYTE

'https://msdn.microsoft.com/ja-jp/library/cc448045.aspx
'declare function IsDBCSLeadByte(byval TestChar as UBYTE) as WINBOOL
'https://msdn.microsoft.com/ja-jp/library/cc448047.aspx
'declare function IsDBCSLeadByteEx(byval CodePage as UINT, byval TestChar as UBYTE) as WINBOOL

For IAA = 1 To InALong
TestChar = asc(Mid$(InAstring, IAA, 1))
IBB = IsDBCSLeadByte(TestChar)
If (IBB = 0) Then
Else
EndIf
Next IAA
又は
IBB = IsDBCSLeadByteEx(CodePage, TestChar)
で振り回して、先頭から処理していけば比較的簡単に作れるだろう。

109 :デフォルトの名無しさん:2017/03/08(水) 20:35:59.45 ID:Wan8ns7S
ただし、Right$()は
If (IBB = 0) Then
StateLong(IAA) = 0
Else
StateLong(IAA) = 1
IAA = IAA + 1
StateLong(IAA) = 2
EndIf
と、SBCS(0)かDBCS(1文字目が1, 2文字目が2)と記録して
後ろから文字数を数える必要がある。
Instr() は手を付けていない。
ASC1文字検索の時だけDBCS2文字目の場合にはねるだけだから、比較的簡単に作れると思う。

110 :デフォルトの名無しさん:2017/03/11(土) 09:33:14.20 ID:U4jxaOIA
http://makoto-watanabe.main.jp/program.html#binary_editor
に紹介のあった Stirling の実行形式のパスを取得するルーチンを作成した。
宣言は
Dim RootKey as HKEY
Dim As string SubKeyString, kNameString
Dim As string AAString, BBString, CCString, FileString
Dim FileTypeString as String
TakaDammyReturnCode = RegistryRead01(RootKey, SubKeyString, kNameString, AAString)
でレジストリーを読み取って、管理ファイル名(たぶん)から実行形式に変換
TakaDammyReturnCode = FileTypeCat(AAString, FileTypeString, 0): 'AAString から識別子(.以降)を取り除く
StirlingPathString = AAString + ".exe"
'使用例
'BinLineString = StirlingPathString(0&)
'If (Len(BinLineString) > 0&) Then TakaDammyReturnCode = Exec(BinLineString, FileString): '同期する
関数名などは省略。

111 :デフォルトの名無しさん:2017/03/11(土) 09:55:02.25 ID:U4jxaOIA
Function RegistryRead01() は、旧 Fun GetRkey01() の名称を書き換えたもの。
旧 Fun GetRkey01()は、前スレを探してくれ。

>>109 つづき。
Instr() を作ろうとして、整理していったらば、
StateLong() 配列の解釈に間違いがあったことまでつかんだ。

気がめいったので一時中止。Instr( start, str, substring )
のstartの値、strや substringの長さより、場合分けが必要で
混乱に混乱を重ねて、一括ダンプルーチンを2回作り直した時点で、気がめいった。
StateLong() 配列作成の時点で場合分け用値を定義するか、返した値から定義するか、で迷っている。

ここにMID$()関数の問題が入った。
Mid$(A$, 10, -5)なんて使い方用のルーチンもあったのよ。
これは、N88を使いだす前、A$が255文字制限のあったころ、ペット用Basicを使っていたころの名残。
忘れていたわ、こんなルーチンを作っていたなんて。

112 :デフォルトの名無しさん:2017/03/12(日) 18:13:41.20 ID:a1qa7agM
以前書いた、BEEP系の内容の続き。
Win系関係ルーチンで発見できたものを記載する。
'declare 文は、C:\tool\FreeBASIC 内 *.BIファイルを検索してくれ。
大域宣言
#Include Once "win/mmsystem.bi"
Dim Shared MSerrorCodeMM as MMRESULT : 'MS音声処理関係処理のリターンコード

'declare function Beep_ alias "Beep"(byval dwFreq as DWORD, byval dwDuration as DWORD) as WINBOOL
MSReturnCode = Beep_(Frequency, BeepTime) : '命令語
'https://msdn.microsoft.com/ja-jp/library/cc428923.aspx

'https://msdn.microsoft.com/ja-jp/library/cc429002.aspx
'Declare function MessageBeep(byval uType as UINT) as WINBOOL
MSReturnCode = MessageBeep(-1)
MSReturnCode =MessageBeep(MB_ICONASTERISK)
MSReturnCode = MessageBeep(MB_ICONEXCLAMATION)
MSReturnCode= MessageBeep(MB_ICONHAND)
MSReturnCode = MessageBeep(MB_ICONQUESTION)
MSReturnCode =MessageBeep(MB_OK)

113 :デフォルトの名無しさん:2017/03/12(日) 18:17:37.48 ID:a1qa7agM
'http://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200707/07070177.txt
にあったMIDI利用 BEEP は何とか成功した。

Dim lngmidHndVal As HMIDIOUT__
Dim lngmidHndPtr As HMIDIOUT
Dim lngmidHndPtrPtr As LPHMIDIOUT
で宣言して、
'declare function midiOutOpen(byval phmo as LPHMIDIOUT, byval uDeviceID as UINT, byval dwCallback as DWORD_PTR, byval dwInstance as DWORD_PTR, byval fdwOpen as DWORD) as MMRESULT
MSerrorCodeMM = midiOutOpen(@lngmidHndPtr, MIDI_MAPPER, 0, 0, CALLBACK_NULL)
If (MSerrorCodeMM = MMSYSERR_NOERROR) Then BeepMidiOut (lngmidHndPtr, MdiMsg)
Sleep mTime
midiOutClose (lngmidHndPtr)
とならす。

Private Function BeepMidiOut(lngmidHndPtr As HMIDIOUT, DataString As String) As Wata
Dim MLMsg() As Byte
Dim As Long IAA, IBB
Dim lpMidiOutHdr As MIDIHDR
と、宣言して、
ReDim MLMsg(0& To Len(DataString) \ 2& - 1&)
For IAA = 1& To Len(DataString) Step 2&
MLMsg((IAA - 1&) \ 2&) = Val("&H" & Mid(DataString, IAA, 2&))
Next
lpMidiOutHdr.lpData = VarPtr(MLMsg(0))
lpMidiOutHdr.dwBufferLength = UBound(MLMsg) + 1&
lpMidiOutHdr.dwFlags = 0&
'declare function midiOutPrepareHeader(byval hmo as HMIDIOUT, byval pmh as LPMIDIHDR, byval cbmh as UINT) as MMRESULT
MSerrorCodeMM = midiOutPrepareHeader (lngmidHndPtr, @lpMidiOutHdr, Len(lpMidiOutHdr))
'declare function midiOutLongMsg(byval hmo as HMIDIOUT, byval pmh as LPMIDIHDR, byval cbmh as UINT) as MMRESULT
MSerrorCodeMM = midiOutLongMsg (lngmidHndPtr, @lpMidiOutHdr, Len(lpMidiOutHdr))
と鳴らす。

114 :デフォルトの名無しさん:2017/03/12(日) 18:21:32.40 ID:a1qa7agM
音が聞こえなかったのは、Sleep mTime の解釈が原因だと思う。
BeepMidi("02", "60", 2000)
'BeepMidi("57", "60", 2000) 'C7:2093Hz
のように、演奏時間を2000としたら、何秒か聞こえた。
遅延が、2-3秒ぐらいあり、その期間無答となるので、ゲームサウンドには使えない。

115 :デフォルトの名無しさん:2017/03/12(日) 19:21:01.74 ID:a1qa7agM
さっぱりわからんけど
https://blogs.windows.com/buildingapps/2016/09/21/midi-enhancements-in-windows-10/#HWygA7trSYw9sboJ.97
なんてものを見つけた。
Windows 10でMIDIを強化するというが、2秒ぐらいの遅延が発生していることからみれば
対応を取らなければ、MIDI関係ルーチンが使い物にならないわけで
主要用途である、ゲームのバックグラウンドサウンドにうまく適応で切るような、低負荷ルーチンの存在が必要となってくる。
Win 10では、1/4を超えるCPU占有をTSSで他のタスクに割り振るために認めていない。
より負荷を軽くすることが要求される。
しかし、負荷を軽くする内容については記載がない。

116 :デフォルトの名無しさん:2017/03/12(日) 19:38:38.32 ID:a1qa7agM
いくらやっても見つからないと思ったらば、こんなの見つけた。
https://www.slideshare.net/garicchi/windows10api
37. バックグラウンドタスク
38. BackgroundTask • UWPは基本的にアプリを閉じるとタスクを実行できなくなる • BackgroundTaskに登録しておくとTriggerが発動したときに別
のプロセスとして処理を実行できる App System System Trigger BackgroundTask 別プロセス BackgroundTask登録
39. Background Task Triggerの例 • Time Trigger • 一定時間でTaskを実行 • 最短15分間隔 • System Trigger • システムのあらゆるイベント時にTask実行
• 例 Internet Available , Power State Changed • Push Notification Trigger • プッシュ通知が来た時にTask実行

MIDI 再生専用のタスクを作って、何かしかの指示を送って実行、
という処理が必要なのかな?。

117 :デフォルトの名無しさん:2017/03/13(月) 22:50:24.29 ID:71lamdyx
http://www.utp.or.jp/bd/978-4-13-064067-1.html
機会があったらば読んでほしいのだけれども。

細かい計算や理論は除外して、
SALSの運用の話を見てほしい。

全部のソースリストが記載されているものがあって、
記載内容を修正した後でソースリスト(2万枚のパンチカード?)を修正する
という旨の内容が書いてあったはず。
いつ、どのような修正をしたのか、修正の前後の内容を保存している
ということをしないと、障害の巣窟になってしまう、なんて内容が書いてあったはず。

これは、デカコンを使っていたころ読んだ本なので、手元にない。版元では品切 の模様。
どこが、どのようにおかしいから、どのように変更した、
ことを記載しておくこと。
現実としては、作業記録として専用に作るのは面倒だから、
ライブを定期的に、あるいは大規模な修正を行う前に、一括して圧縮保存。
修正作業に入って、修正した日時と修正の原因をコメント行としてソースに残しておく、
ということで、済ましている。

FreeBasicの癖がよくわからないので、>>111 の様な事をやっていて、
本格的な移植作業には入っていない。
ライブの移植が終わるころには、癖がつかめてくるのではないかと思われる。

118 :デフォルトの名無しさん:2017/03/13(月) 22:59:35.57 ID:71lamdyx
MIDIファイル再生に関して、こんなものを見つけた。
http://officetanaka.net/excel/vba/tips/tips22.htm
以下のファイルが関係している。
C:\tool\FreeBASIC\inc\win\mmsystem.bi
C:\tool\FreeBASIC\inc\win\ddk\mmddk.bi
ここまでしかやっていない。

119 :デフォルトの名無しさん:2017/03/13(月) 23:49:42.95 ID:71lamdyx
>>114 こんなの見つけたので知らせておく
http://www.cactussoft.co.jp/Sarbo/divMIDISeqLongMsg.html
そのためmidiOutLongMsg()関数は、非同期式で動作する仕様になっています。
非同期式とは、関数が実行された段階でデバイスドライバーは、
「はい、ロングメッセージの送信ですね、受け付けました。」と言うだけで制御を戻します。

と待ち時間に関係なしに制御が戻って、勝手に演奏してくれないと、パックグラウンド゜サウンドに使えない。

ズンチャカやっていて、それ以外の処理系が止まってしまうのは、使えない。

120 :デフォルトの名無しさん:2017/03/14(火) 22:02:38.43 ID:1/oLMu3p
>>118 非同期の起動に成功した。
http://eternalwindows .jp/winmm/mci/mci02.html
http://www13.plala .or.jp/kymats/study/MULTIMEDIA/mciCommand_callback.html
https://msdn.microsoft.com/ja-jp/library/cc410496.aspx

121 :デフォルトの名無しさん:2017/03/14(火) 22:03:19.95 ID:1/oLMu3p
Case MM_MCINOTIFY
'「MM_MCINOTIFY」定数を使うには 要 #Include Once "win/mmsystem.bi"
Astring = "MM_MCINOTIFY "+ Hex$(wParam) + " " + Hex$(lParam)
TakaDammyReturnCode = SoundFilePlay(10, Astring)
buff = Astring
SetDlgItemText(hWin, IDC_STC1, @buff)
'wParam = (WPARAM) wFlags
'lParam = (LONG) lDevID

122 :デフォルトの名無しさん:2017/03/14(火) 22:06:03.27 ID:1/oLMu3p
あと
CmdZString ="Open " & SoundFile+" notify"
MSerrorCodeMI= mciSendString(CmdZString, @CmdRetZString, SizeOf(CmdRetZString), TakaHWND)
buff ="Openを開始します"
SetDlgItemText(hWin, IDC_STC1, @buff)
Case IDC_BTN3
CmdZString= "Play "&SoundFile + " notify"
MSerrorCodeMI =mciSendString(CmdZString,@CmdRetZString, SizeOf(CmdRetZString), TakaHWND)
buff= "Playを開始します"
SetDlgItemText(hWin, IDC_STC1, @buff)
Case IDC_BTN4
CmdZString ="Close " & SoundFile+" notify"
MSerrorCodeMI= mciSendString(CmdZString, @CmdRetZString,SizeOf(CmdRetZString), TakaHWND)
buff ="Closeを開始します"
SetDlgItemText(hWin, IDC_STC1, @buff)

123 :デフォルトの名無しさん:2017/04/09(日) 21:36:39.17 ID:LdLCQwyT
Test

124 :デフォルトの名無しさん:2017/04/09(日) 21:43:21.61 ID:LdLCQwyT
>>122 のあと、マンゴーがなにんとかで、かけなくなって放置。
気が付いた点で関係情報を
外部タスクの同期起動は、Shell 等がある。
保守関係で、被同期にしたいので探して見つかったのが
'declare function WinExec(byval lpCmdLine as LPCSTR, byval uCmdShow as UINT) as UINT
'MSReturnCodeUINT = WinExec(byval "notepad", SW_SHOW)
とか
MSReturnCodeUINT = WinExec(byval "notepad "+OutFile, SW_SHOW)
これは、MSが切り替えを予定している。それで
'declare function CreateProcessA(byval lpApplicationName as LPCSTR, byval lpCommandLine as LPSTR,
byval lpProcessAttributes as LPSECURITY_ATTRIBUTES, byval lpThreadAttributes as LPSECURITY_ATTRIBUTES,
byval bInheritHandles as WINBOOL, byval dwCreationFlags as DWORD,
byval lpEnvironment as LPVOID, byval lpCurrentDirectory as LPCSTR, byval lpStartupInfo as LPSTARTUPINFOA,
byval lpProcessInformation as LPPROCESS_INFORMATION) as WINBOOL
Dim pi As _PROCESS_INFORMATION
Dim PiPtr as LPPROCESS_INFORMATION
dim si as _STARTUPINFOA
Dim SiPtr as LPSTARTUPINFOA
Dim As Zstring * 256 szCmd = "notepad "+OutFile

PiPtr = @pi
SiPtr = @si
memset(@si, 0, sizeof(STARTUPINFO))
memset(@pi, 0, sizeof(PROCESS_INFORMATION))
si.cb = sizeof(STARTUPINFO)
' 1 2 3 4 5 6 7 8 9 10
MSReturnCode = CreateProcess(NULL, szCmd, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, @Si, @pi)

125 :デフォルトの名無しさん:2017/04/09(日) 21:48:26.55 ID:LdLCQwyT
タイマー割り込み処理。
Case IDC_BTN1
buff = "IDC_BTN1を開始します"
'declare function SetTimer(byval hWnd as HWND, byval nIDEvent as UINT_PTR, byval uElapse as UINT, byval lpTimerFunc as TIMERPROC) as UINT_PTR
SetTimer(hwnd, 1, 2000, NULL)
SetDlgItemText(hWin, IDC_STC1, @buff)

で起動して
case WM_TIMER
'
buff = "WM_TIMER が発生しました"
SetDlgItemText(hWin, IDC_STC1, @buff)
Case WM_SIZE
と「WM_TIMER」事象発生を受けて、かン系ルーチンを起動する

126 :デフォルトの名無しさん:2017/04/09(日) 22:09:11.11 ID:LdLCQwyT
V.B.用に作ったタートル関係、FreeBasicでは関係命令が存在するだが、
変な拡張をしたがために、廃止できない状態に。
うまく動かないと思ったらば、ByRef, ByValの関係で、出力値に常に0が定義されていた。

(なんたら)=(かんたら)のなんたら部のみを検索するルーチンを作って、
Function文から引数名を引き抜くルーチンを作って、比較。
1ファイル平均3引数程度、ByRefをしなければならない場所がByValになっていた。
短期即興のルーチンだから解釈できない引数が800近くある。
ルーチン数でも同じくらいだから、引数の関係した未発見のエラーが多いと思われる。
タートル関係のルーチンが増えて、現在1170ルーチンのライブラリーとなっている。

127 :デフォルトの名無しさん:2017/04/09(日) 22:26:03.33 ID:LdLCQwyT
ファミコン等、かなり古いゲームでは8*8文字とか使っている。
それ前だと、ニキシー管 https://ja.wikipedia.org/wiki/%E3%83%8B%E3%82%AD%E3%82%B7%E3%83%BC%E7%AE%A1
を使ったスロットマシーンとかもある。

V.B.でこれを再現しようとした名残で、7セグとか14セグ、16セクとか
https://ja.wikipedia.org/wiki/7%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%88%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4
の文字表示ルーチンがある。
結果として、V.B.用のタートルが捨てられない。

128 :デフォルトの名無しさん:2017/04/13(木) 21:48:58.87 ID:CzF9QVAq
ByRef, ByVal 接頭語に関して。
サブルーチン内で定義する方法をLet文、具体的には「=」記号のみに限定する
という方法を選択して、
引数の変数を示す語をInstrで探して、
前が数字とアルファベット以外・又は文頭、後ろが数字とアルファベット以外、の場合に、変数を参照していると解釈する。
Open、For、Dim、ReDim、Select Case、IF、DO、LOOP、WHILE、Untilの場合には専用にルーチンで語の一致をみて、参照する場合と決定
IF THEN ELSE 文は、IF - Then 間、THen-Else間、ELSE移行の3文に分割
変数の前の文字を 「# : , ( 算術演算子」の場合に分けて
変数の後ろの文字を 「: , ) 算術演算子」の場合に分けて
「,」や「()」の場合には、前後の()を探して、配列名か関数名を特定。Declear文に記載がある場合に限って関数と解釈、ない場合が配列と解釈。
関数の場合には、自己の検査結果より引数が定義にしているか参照しているを調べる。配列名の場合には参照すると決定(MSやUnix系関数は判断できない)。
算術演算子の場合には参照と決定。
前に「#」があるばあいには、参照と決定。
前に「=」があるばあいには、参照と決定。
後ろに「=」があるばあいには、定義と決定。
多文字演算子として、MOD 演算子は + に書き換えで処理。

までやって、100位解釈できない引数があるけど、なんとかそれらしきものができた。
あとちょっとやれば、ByRef ByVal ガ原因の混乱は終焉すると思う。

129 :デフォルトの名無しさん:2017/04/15(土) 11:39:21.57 ID:e+ro1QoX
>>122 のあとのマンゴー関係で書けなかった内容。
画面中にある表示枠情報。
Dim CmWndpl As WINDOWPLACEMENT
CmWndpl.length = sizeof(CmWndpl): 'MS指示、参照前に定義のこと
MSReturnCode = GetWindowPlacement(hWnd, @CmWndpl)
で取得、
MSReturnCode = SetWindowPlacement(hWnd, @CmWndpl)
で復元。

'使用TVの物理サイズの取得
Dim R As RECT
Dim as HWND hWnd
hWnd = GetDesktopWindow()
MSReturnCode = GetWindowRect(hWnd, @R): 'スクリーン座標の取得

'タスクバーの位置と大きさを返す
Dim TaskBerInfo As _AppBarData
'(大域) Dim MSReturnCodeUintPtr as UINT_PTR
ZeroMemory(@TaskBerInfo, sizeof(TaskBerInfo)) : '(MS指定) 「TaskBerInfo」領域内を0で塗りつぶす
TaskBerInfo.cbSize = sizeof(TaskBerInfo): '(MS指定) 初期化、領域の大きさを定義
'declare function SHAppBarMessage(byval dwMessage as DWORD, byval pData as PAPPBARDATA) as UINT_PTR
MSReturnCodeUintPtr = SHAppBarMessage(ABM_GETTASKBARPOS, @TaskBerInfo)
リターンコードが「UINT_PTR」という使用頻度の低い型を使っていることに注意。

130 :デフォルトの名無しさん:2017/04/15(土) 11:46:28.47 ID:e+ro1QoX
'システム枠の幅と高さの取得
'declare function GetSystemMetrics(byval nIndex as long) as long
Select Case ActionType
Case SM_CXSCREEN, SM_CYSCREEN
'0, 1 'プライマリモニタの画面全体の幅と高さを取得します。
WideLong = GetSystemMetrics(SM_CXSCREEN)
HightLong = GetSystemMetrics(SM_CYSCREEN)
Case SM_CXVSCROLL, SM_CYHSCROLL
'2, 3 垂直スクロールバーの幅、または垂直スクロールバーの矢印の高さをピクセル単位で取得します。
WideLong = GetSystemMetrics(SM_CXVSCROLL)
HightLong = GetSystemMetrics(SM_CYHSCROLL)
'const SM_CYCAPTION = 4 ''通常のタイトルバーの高さをピクセル単位で取得します。
Case SM_CXBORDER, SM_CYBORDER
'5, 6 立体効果のないウィンドウの境界の幅と高さを取得します。
WideLong = GetSystemMetrics(SM_CXBORDER)
HightLong = GetSystemMetrics(SM_CYBORDER)
Case SM_CXDLGFRAME, SM_CYDLGFRAME
'7,8 'タイトルバーがあり、サイズが変更できないウィンドウの周囲を囲む枠の幅と高さをピクセル単位で取得します。
WideLong = GetSystemMetrics(SM_CXDLGFRAME)
HightLong = GetSystemMetrics(SM_CYDLGFRAME)
以下略。「GetSystemMetrics」関係がやたら沢山あって下手に書くとマンゴーに引っかかりそうなので一部分だけ。
Case SM_CXVIRTUALSCREEN, SM_CYVIRTUALSCREEN
'78, 79 仮想画面の幅と高さをピクセル単位で取得します。
WideLong = GetSystemMetrics(SM_CXVIRTUALSCREEN)
HightLong = GetSystemMetrics(SM_CYVIRTUALSCREEN)
と、40組ぐらいある。
'const SM_CXFOCUSBORDER = 83
から
'const SM_CMETRICS = 97
まで、Win系BIファイル('C:\tool\FreeBASIC\inc\win\winbase.bi)には記載があるが、内容が検索では見つけられなかった定数がある。

131 :デフォルトの名無しさん:2017/04/15(土) 11:51:10.66 ID:e+ro1QoX
'表示枠全体, 表示枠使用可能範囲、最大表示可能枠の取得
Dim MainWaku as tagRECT
Case 1
'declare function GetWindowRect(byval hWnd as HWND, byval lpRect as LPRECT) as WINBOOL
MSReturnCode = GetWindowRect(InhWin, @MainWaku) 'InhWinの左上端と右下端の座標をスクリーン座標で取得します。
Case 2
'declare function GetClientRect(byval hWnd as HWND, byval lpRect as LPRECT) as WINBOOL
MSReturnCode = GetClientRect(InhWin, @MainWaku) 'InhWinの表示枠内、ユーサー領域の左上端と右下端の座標をスクリーン座標で取得します。
Case 3
'declare function GetClipCursor(byval lpRect as LPRECT) as WINBOOL
MSReturnCode = GetClipCursor(@MainWaku) 'マウスカーソルの移動可能な範囲に相当するスクリーン座標を取得します(最大表示範囲)。
Case 4
'http://liweijing.blogspot.jp/2007/03/blog-post.html
'declare function SystemParametersInfoA(byval uiAction as UINT, byval uiParam as UINT, byval pvParam as PVOID, byval fWinIni as UINT) as WINBOOL
MSReturnCode = SystemParametersInfo(SPI_GETWORKAREA, 0, @MainWaku, 0) 'タスクバーの大きさをのぞいた画面の大きさ

132 :デフォルトの名無しさん:2017/04/15(土) 11:54:37.99 ID:e+ro1QoX
'表示枠全体, 表示枠使用可能範囲取得
Dim hBtn As HWND
Dim MainWaku as tagRECT
Dim PointXY as tagPOINT
hBtn = GetDlgItem(InhWin, IDnoGRALong): '表示枠内部品のハンドル(枠番号)を取得, hBtn=0でエラー
Select Case ActionType
Case 1, 11
MSReturnCode = GetWindowRect(hBtn, @MainWaku) 'hBtnの表示枠内部品の、左上端と右下端の座標を表示枠座標で取得します。
Case 2, 12
MSReturnCode = GetClientRect(hBtn, @MainWaku) 'hBtnの表示枠内部品の、左上端(0,0)と右下端の座標を取得します。

133 :デフォルトの名無しさん:2017/04/15(土) 11:58:30.77 ID:e+ro1QoX
'スクリーン座標 → ユーザー座標に換算
Dim as tagPOINT PointXY1, PointXY2
PointXY1.X = InWaku.Left
PointXY1.Y = InWaku.Top
IF (ActionType = 1) Then
MSReturnCode = ScreenToClient(InhWin, @PointXY1)
Else
MSReturnCode = ClientToScreen(InhWin, @PointXY1)
End If
IF (MSReturnCode = 0) Then IError = 1
PointXY2.X = InWaku.Right
PointXY2.Y = InWaku.Bottom
IF (ActionType = 1) Then
MSReturnCode = ScreenToClient(InhWin, @PointXY2)
Else
MSReturnCode = ClientToScreen(InhWin, @PointXY2)
End If
IF (MSReturnCode = 0) Then IError = 1
IF (Ierror = 0) Then
InWaku.Left = PointXY1.X
InWaku.Top = PointXY1.Y
InWaku.Right = PointXY2.X
InWaku.Bottom = PointXY2.Y
Else
'エラー
End If
てな感じ。

134 :デフォルトの名無しさん:2017/04/15(土) 12:03:35.44 ID:e+ro1QoX
表示枠や表示部品移動、大きさの変更について、
MSReturnCode = MoveWindow(hBtn, PointXY.X, PointXY.Y, WideLong, HightLong, True): '個別表示物の枠の寸法を定義, 再作画を指示
MSReturnCode = SetWindowPos(InhWin, HWND_TOP, 0, 0, new_width, new_height, SWP_NOMOVE)
MSReturnCode = SetWindowPos(hBtn, NULL, 0, 0, new_width, new_height, uFlags)
MSReturnCode = GetWindowRect(hBtn, @rw)
MSReturnCode = ScreenToClient(InhWin, @PointXY)
MSReturnCode = MoveWindow(hBtn, PointXY.X, PointXY.Y, new_width, new_height, True): '個別表示物の枠の寸法を定義, 再作画を指示
MSReturnCode = SetWindowPos(InhWin, HWND_TOP, LeftLong, TopLong, 0, 0, SWP_NOSIZE)
が関係しているらしいのだけれども、現在混乱して、作成中止中。

135 :デフォルトの名無しさん:2017/05/02(火) 10:03:18.39 ID:qBaC0+Zg
GFDL1.2の文書読んでいて気が付いた。
サブライセンス出来ないじゃん。

136 :デフォルトの名無しさん:2017/05/04(木) 11:36:41.54 ID:+fiMgp6j
そのままの意味で再許諾はできないよ

137 :デフォルトの名無しさん:2017/05/05(金) 06:45:28.53 ID:tmTYNlNg
かいとか。連投規制に引っかかった。

138 :デフォルトの名無しさん:2017/05/05(金) 07:11:15.97 ID:tmTYNlNg
>>128 の内容で一部抜けがある。
Line()等()の後ろに色々指定されている命令の場合、個別に処理して、参照だけで定義されていない
マルチステートにすると解釈が困難になる(:で切って1文1文を検索、表示は切る前の文節)ので、この手の命令を含むマルチステートを禁止した。
SelectCase, Sleep 文も同様な処理が必要になった。
MOD演算子の他にXOR演算子なども書き換えが必要であった。

ByVal, ByRef の間違いが1ファイルに2-3か所ぐらいあった。
引数として存在する物の使われていない変数が結構ある。これは、Function文として()がないと解釈できないので、無意味な引数をつけている。
これがエラーになるので、Type YearnInteger As Integer とYearn型変数を用意して検索の対象から外した。

Astring = ComDeclareListDir2 + "*.txt"
IF (dir$(Astring) <> "" ) then Kill Astring
が動かないみたい。Kill文に*?を使った場合にエラーになるみたい。
対応ルーチン作成中。

日曜プログラマーの場合には、多少実行効率が悪くても、多少処理が遅くても、
ソフト作製時間が少なくて済むように、一番手間のかかる、障害発見時間を短くて済むようにすることが必要。

139 :デフォルトの名無しさん:2017/05/06(土) 16:45:07.39 ID:Xeh+WPsq
クロスリファレンス表
https://search.yahoo.co.jp/search?p=%E5%A4%89%E6%95%B0%E5%90%8D+%E7%9B%B8%E4%BA%92%E5%8F%82%E7%85%A7%E8%A1%A8%E3%80%80%EF%BC%A2%EF%BD%81%EF%BD%93%EF%BD%89%EF%BD%83&
aq=-1&oq=&ai=zigtrn1cQYWrys51a_UUkA&ts=3634&ei=UTF-8&fr=top_ga1_sa&x=wrt
の作成ソフトをしらないか。
自作ソフトではかなり解釈ができない場合がある。
例、For-Next のAs 句

自作ソフトがわかりやすいように、文法を制限することはたやすい。
しかし、過去スレを見ればわかる通り、この手の制限をわかりずらいとする人がいる。

日曜プログラマーにとっては、
自分の描いたソフトには必ず障害が発生する、と信じて例外処理ルーチンを付すこと
は、その後の保守の簡便化に関係する。

しかし、簡便化ルーチンを否定する人は多い。
自前のルーチンで解釈が困難で、「難解なルーチン」となる部分を解釈してくれるもの
クロスリファレンス表作成ソフトがあるものと信じて、ここに問い合わせる。

140 :デフォルトの名無しさん:2017/05/09(火) 19:35:55.11 ID:YDoq9mLA
ファイル名関係処理でDBCS関連がらみの処理をどうしようか、
と迷っていたら、ファイル名関係のシステムコール(スーパーバイザ参照)ルーチンを見つけた。
細かいことは C:\tool\FreeBASIC\inc\win\shlwapi.BI を見てくれ。
「declare function Path」で検索すると、主要なルーチン名を見つけることができる。
一部 declare sub Pathなんたら()があるから注意してくれ。
「Pathなんたら()」と記載しないと参照できない。

141 :デフォルトの名無しさん:2017/05/13(土) 22:52:55.55 ID:6qsyWLV0
http://www.dotup.org/uploda/www.dotup.org1247922.zip.html
http://www.dotup.org/uploda/www.dotup.org1247923.zip.html

>>140 関係。動作試験した内容。
使いたい人がいたら、適当に使って。
ネットワーク関係のシステムコールが見つかったので整理中。
ローカルでの運用が主体なので、MSネットワーク関係が出てきて混乱している。
V.B.を購入した2000年頃の内容では、MSネットワークがウイルスソフトにやられることが多いので、MSネットワークは使用しないように、というウイルス対応が多かった。
だから、関係ルーチンを使わないようにしていた。だから、内容が理解できない。

C:\tool\FreeBASIC\inc\win\shlwapi.bi の内容は検索してみればわかる通り、個人サイトでは2010年頃に公開されている。
だから、かなり出遅れた内容となる。
'' MS指示 PathAddExtension() → PathCchAddExtension() を使え
なんて旨の内容もある。MSが指定したルーチン名はC:\tool\FreeBASIC\以下の*.BIファイルには見つからなかった。
近い将来、サポートされるものと思う。

142 :デフォルトの名無しさん:2017/05/14(日) 11:53:59.80 ID:J0U25/Ze
>>140 つづき。
Astring = "*.Txt": Kill Astring
がうまく動作しなくてはじめたこの処理だけど、こんなの見つけてしまった。
http://www.all.undo.jp/asr/Ver7/11.html
>有用性の高いWindows APIの動作が変わってる事だと思います。
>具体的にはPathMatchSpec()というAPIです。
>このAPIはWindows 8正式版の頃から挙動が怪しくなりまして、取りこぼしやら誤ヒットやらと、落ちるわけじゃないんですが比較の結果が正しくない文字が多数発生してました。
ということで、>>141の内容で打ち切って、自前ルーチンの作成が必要であるということになってしまった。
>Windows Vista以降であればPathMatchSpecEx()というAPIが別で存在している
PathMatchSpecEX()があるらしいのだが、FreeBasic ではサポートされていない。
>FindFirst系のAPIだとワイルドカードの組み合わせによって
は、皆さんご存知ですよね。Win 95頃長いファイル名がサポートされて、別名として短いファイル名が用意された。
別名、つまり、8.3形式のファイル名では重複するときに末尾2文字以上を(チルダ)(数字)に置き換える。
だから、おかしなことになりやすい。*で拾って、個別に比較して、処理するということが必要になってくる。
末端ユーザー(オペレーター)に対して、チルダを使うな、と指示して、チルダを使っているファイルをユーザーレベル(プログラム仕様書)で排除すれば済むのだけれど。

143 :デフォルトの名無しさん:2017/05/17(水) 20:43:36.59 ID:5N4X+pOX
>>141 のつづき。
http://www.dotup.org/uploda/www.dotup.org1251962.zip.html
http://www.dotup.org/uploda/www.dotup.org1251960.zip.html

>>140 関係。動作試験した内容。
使いたい人がいたら、適当に使って。
ネットワーク関係と、表示枠関係は動作試験をやっていない。

不審な動作があったので、ついでに記載。
DimChk42で新規にDialogAppAsMainのテンプレートを使って作成。
その後をDimChk42の内容をDimChk42B, DimChk42C, DimChk42Dにコピーして試験を続けた。
DimChk42AはDimChk42の名称を変更したもの。
DimChk42A内 BAKディレクトリーを消そうとしたら消えない。ReadOnlyになっていたので、これを解除して消去した。
そしたら、DimChk42B, DimChk42CのBAKディレクトリーも一緒に消えてしまった。
どこをどうしているのか、わからないけどOS由来の不審な挙動か、FBEが何かやっているのか、わからない。
OS由来の仕様の可能性が高い。

144 :デフォルトの名無しさん:2017/05/20(土) 11:06:25.21 ID:ZcoJjZsO
以前書いたような気がするのだが、
*.DLL ファイルの使い方が現時点で分からない。
結果として、LZH, ISH等のファイルが使えないでいる。
ISHは手作業でバイナリに戻して、手持ちのライブラリーのBAse64に切り替えるとして
LZH等が使えないでいる。 http://www.madobe.net/archiver/index.html

ZIPが使えるような雰囲気だが、
C:\tool\FreeBASIC\examples\manual\libraries\zip.bas
対応する ZIP.A ファイルなどが見つけられなかった。

今回、BZIP関係が成功したので、記載する。関係ファイルは
http://www.dotup.org/uploda/www.dotup.org1254567.zip.html
参照。
https://sourceforge.net/projects/fbc/files/Older%20versions/0.90.1/Binaries%20-%20Windows/Libraries/
内' FB-win32-bzip2-1.0.6.zip 内 libbz2.a の参照例
'コピー元ファイル C:\tool\FreeBASIC\examples\compression\bz2compress.bas
圧縮しかできない。解凍方不明。

検索資料 http://s-yata.jp/docs/libbzip2/
BZip対応解凍ソフト、CubeICE、http://www.vector.co.jp/soft/winnt/util/se489109.html

2ちゃんねるって、Base64による投稿を認めているのかな?

145 :デフォルトの名無しさん:2017/05/20(土) 19:52:51.58 ID:ZcoJjZsO
>>144 
使いたい人がいたら、適当に使って。
これ書き忘れた。

BZIPでは複数ファイルの一括圧縮ができないようなので、一括ファイル合併ルーチンを作ろうとして四苦八苦。
Dim FileSizeOver as DWORD
Dim FileSizeOverPtr as LPDWORD
「FileSizeOverPtr = @FileSizeOver」行を入れるのを忘れて
FileSezeGetULongInt = GetFileSize(FileHandle, FileSizeOverPtr)
とやると、ハングするので要注意。

146 :デフォルトの名無しさん:2017/05/24(水) 23:48:18.25 ID:ATqZKMOK
>>145 つづき。
なんとか、TARファイルもどき(タイムスタンプや属性をMSのデータそのまま複写等)を作るのに成功。
TARのファイル構造
'http://www.redout.net/data/tar.html tar の構造
'http://openlab.ring.gr.jp/tsuneo/soft/tar32_2/tar32_2/sdk/TAR_FMT.TXT TAR32.DLL フォーマット説明ファイル
を眺めて
https://ja.wikipedia.org/wiki/Tar
をみたら、考えることって同じなんだね。
パンチカードを使っていたころのルーチンが生きていたころ、パンチカードノ内容をほぼそのまま保存したUnPACK形式のデータファイルと
1枚のパンチカードの末尾以後の空白を削除したPack形式のデータが存在する。
Packデータを直接読み取れないのでpack形式をUnPack形式に変換して、固定長データとして取りあ使う。
パンチカートをデータファイルに変換し、保存することを目的に作ったのがパンチ等シすテム。
Tarの構造は、パンチラシステムに近い構造だった。
TARを読んでいたら、BZIPのマルチファイル形式も認めているようなのだが、
関係情報を持っている人はいないか。
Unixのソースファイルを読めば書いてあるのだろうが、Unixはデカコンを使うのをやめた年の終わりごろに入った機械なので、まったく中身を見る時間がなかった。
さっぱりわからない。

147 :デフォルトの名無しさん:2017/05/25(木) 21:36:48.40 ID:wf6/c17h
>>144 つづき。こんなファイルを見つけた。
'C:\tool\FreeBASIC\examples\dll\dylib.bas のコピー

148 :デフォルトの名無しさん:2017/05/27(土) 15:33:51.50 ID:ZQgU3vIU
>>147 つづき。
なんとか、LZH A とLZH E の2つのコマンドが使えるようになった。
詳細は、
http://www.dotup.org/uploda/www.dotup.org1262265.zip.html
さんしょう。
DLLファイル関係命令は、以下の通り。
http://makoto-watanabe.main.jp/freebasic/PgDylibsymbol.html
http://makoto-watanabe.main.jp/freebasic/PgDylibload.html
http://makoto-watanabe.main.jp/freebasic/PgDylibfree.html

149 :デフォルトの名無しさん:2017/05/27(土) 15:49:52.47 ID:ZQgU3vIU
>>148 つづき。
また、書くのを忘れた。
使いたい人がいたら、適当に使って。

Dim なんたら as function(こうたら) As なんたら
の使い方を覚えるべく、引数の類似したルーチンを見つけて、使いして、
文法エラーが出ないか、
だけを注意して継ぎ足していった結果が、>>148
したがって、FreeBasic用に1行Type 命令で定義されている変数型名に合わせているのではなく、
DLLファイルの内容に合わせて定義していった。
だから、変な型変換が入っていたりして動かないものも多いと思う。

150 :デフォルトの名無しさん:2017/05/28(日) 20:11:33.54 ID:RhTBneuP
>>148 つづき。
使いたい人がいたら、適当に使って。
http://www.dotup.org/uploda/www.dotup.org1263729.zip.html
ULH3300.EXE 導入すれば何とかなるだろうけど、最小限の動作試験程度の内容しかいれていない。
コマンド(C:\Program Files\なんたら\COMMAND.TXT)の使い方が結構忘れている。
あるいは、仕様が変更になったのかもしれない。
QBでは、バッチファイル作成ルーチンを作って、子プロセスでバッチファイルを起動していたから、スイッチなどはきれいさっぱり忘れている。
うまく動かない(子ディレクトリーの再帰読み出しと再帰解凍ができない)。
うまく動かない状態で、ArcDll.basには記載されている。

メモリーの内容を使った圧縮解凍(UnlhaExtractMem,UnlhaCompressMem)はコンパイルできなかった。
'ANSI 版とUnicode 版の2種類が存在する場合(AW)があるけど、区別していない。ANSI 版が起動しているはず。
UniCode( As WSTRING) を使っていないから。
今のところDBCSがわからなくて放置しているから、Uni-Codeまで手が回らない。

151 :デフォルトの名無しさん:2017/06/02(金) 23:57:18.03 ID:fEm5aE5c
マイクロソフトの作成した*.HファイルをFreeBasic用の*.BIファイルに機械変換した
という意味にとれる内容が記載されていたので、ちょっと探してみた。
Converting C Headers with swig
と、SWINGというソフトがある模様。しかし、現時点でDLハすべて失敗している。
https://sourceforge.net/projects/swig/?source=typ_redirect

152 :デフォルトの名無しさん:2017/06/04(日) 01:21:58.65 ID:YYutyyMm
検索してみたらそれらしきものが有ったけど
日付がかなり古い感じ
https://www.freebasic-portal.de/downloads/kommandozeilentools/swig-fb-wrapper-70.html
自分ではダウンロードもしていないし試していない
このサイトなら大丈夫だと思うけど自己責任で

こういうのも有るみたいよ
https://github.com/dkl/fbfrog
これは素のCだけでC++には対応してないみたい
参考にどうぞ

前にスレでswigの話してる時に揉めてたみたいね・・・

117 KB
新着レスの表示

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :


read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)