FAQ(Frequently Asked Questions)よくある質問と答え

全般的なこと

Q:どこからダウンロードできるの?
A:
公式サイトが死んでいる場合は vector からでも。

Q:利用にお金はかかりますか?
A:
いいえ。ABは無料です。

Q:商用利用してもいいの?
A:
誰も止めはしない。

Q:関数や命令、文法の仕様は無いの?
A:
すべて作者の頭の中に入っていますよ。

Q:ActiveBasicはActiveBasicで作ってるの?
A:
CかC++で作っているらしい。

Q:ActiveBasicのプログラミングコンテスト無いの?
A:

RADツールに関すること

Q:RADツールで[x]の無いウインドウをテストしたのですが…閉じ方が分かりません。
A:
Alt+F4で閉じることができます。

Q:タブストップが効かない。
A:
プロジェクト名.abpのメッセージループにIsDialogMessage()を追加します。
#include "プロジェクト名.idx"

'---------------------------
'  Window Message Loop
'---------------------------
Dim msgMain As MSG, iResult As Long
Do
	iResult=GetMessage(msgMain,0,0,0)
	If iResult=0 or iResult=-1 Then Exit Do
	If IsDialogMessage(hMainWnd, msgMain) = 0 Then'これが大事
		TranslateMessage(msgMain)
		DispatchMessage(msgMain)
	End If'これも忘れずに
Loop

' Call destructores and exit process
End

Q:モードレスダイアログが表示されない
A:
モードレスダイアログのフォームのプロパティの可視のチェックを入れるか
ShowWindowでも使ってあげてください。

Q:イメージボックスにjpegは貼れないの?
A:
できません。

Q:リッチエディット、タブとかのコントロールは使えないの?
A:
CreateWindowEx()してください。

プログラムに関すること

Q:関数から複数の値を返すことはできるか。
A:
値を格納する領域をいくつか起動する側で用意して、それらの領域を 指すポインターを引数として渡し、関数にポインターの先に値を埋め てもらう。
あるいは、関数の戻り値を構造体にして、その構造体に希 望の値を設定してもらう。あるいは(最後の最後の手として)global変 数を使うことを考える。

Q:「ハンガリー記法(Hungarian Notation)」とは。使う価値があるか。
A:
ハンガリー記法には大きく分けてアプリケーションハンガリアン記法とシステムハンガリアン記法があり、Charles Simonyiが発明したのはアプリケーションハンガリアン記法の方であるが、
論文に「型の意味」と言う意味で「type」と言う単語を使ったため、Microsoft社のExcel開発グループとWord開発グループ以外の殆ど全ての開発チームで誤解が生じ、今に至る。
詳細はhttp://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95に詳しい。
ハンガリアン記法とは変数名に接頭辞をつける記法の事で、システムハンガリアン記法では、例えばdouble型の変数にはdblという接頭辞が付く。
一方アプリケーションハンガリアン記法では、例えばHTML出力可能なようにエンコードが済んであるゼロ終端ASCII文字へのポインタにはspszという接頭辞が付く。
アプリケーションハンガリアン記法は使う価値が高い可能性が高い(用途にもよるだろうが)。

Q:多次元の配列を動的に割り付けるのはどうしたらよいか?
A:
たいていポインターの配列を割り付けて、それぞれのポインターを動 的に割り付けた"列"に初期化するのが一番の解決策である。以下に>2 次元配列の例を挙げる。
Const nrows = 5
Const ncolumns = 6
Dim i As Long, array1 As **Long

array1 = malloc(nrows * SizeOf(*Long))
For i=0 To nrows-1
  array1[i] = malloc(ncolumns * SizeOf(Long))
Next

Q:コンパイルは通るのに実行すると落ちる。なんで?
A:
1.配列の添字がオーバーしている
2.ヌルポインタにアクセスしている
3.RaiseException(),DebugBreak()などが呼ばれている
などなど。

Q:四捨五入するプログラムを教えてください。
A:
次のようにするの。ただし負の値だと上手くいかない。符号をひっくり返して。
Dim aaaa As Double, bbbb As Double
aaaa=5.4
bbbb=Int(aaaa+0.5)

Q:ポインターは本当に配列よりも高速なのか。関数呼び出しをするとど れだけ遅くなるのか。++iはi=i+1よりも高速か。
A:
はい
※インテルのコンパイラーを使ってる人はポインタより配列を使うようにしましょう。

Q:さて問題です。どうやれば出力として、自分自身のソースコードを産 み出すコードをどうやったら書けるか。
A:
10 LIST
RUN

Q:円周率の値が欲しい
A:
function.sbpの中の_System_PIで定義されています。

Q:ヌルポインタってなんですか?
A:
ポインタに0を代入したものです。

Q:ABはWin32APIを使わないと何も出来ないんですか?
A:
いいえ。

Q:関数の戻り値に構造体を指定できないの?
A:
できません。

Q:変数が実数型か整数型かを知る方法は?
A:
オーバーロード(多重定義)を使いましょう。
#N88BASIC
Function f(a As Long) As Long
	Print "整数型です。"
End Function 

Function f(a As Double) As Long
	Print "実数型です。"
End Function

Dim a As Long
Dim b As Double
f(a)
f(b)

Q:「KILLがしたい」が人間の本能なのですか?
A:
そうであるとも言えるし、そうでないかもしれません。

Q:MIDIを再生する方法を教えてください。CDを再生する方法を教えてください。
A:
MCIを使えばいいのでは?

Q:Win32APIって何?
A:
Windowsのが提供する機能の総称です。

Q:open命令でエラーを判定できないの?
A:
open命令はWin2APIのCreateFile関数を呼び出しているだけなので、
直後にGetLastError()を使うとエラーコードを得られるはず。

Q:複素数は使えないの?
A:
自分で用意するしかないです。
Type COMPLEX
	r As Double
	i As Double
End Type

'複素数加算 a+b=c
Sub AddComp(ByRef a As COMPLEX,ByRef b As COMPLEX, ByRef c As COMPLEX)
	c.r=a.r+b.r
	c.i=a.i+b.i
End Sub

'複素数乗算 a*b=c
Sub MulComp(Byef a As COMPLEX,ByRef b As COMPLEX, ByRef c As COMPLEX)
	c.r=a.r*b.r-a.i*b.i
	c.i=a.i*b.r+a.r*b.i
End Sub

#N88BASIC
Dim A As COMPLEX
Dim B As COMPLEX
Dim C As COMPLEX
Dim D As COMPLEX

Input "A "; A.r, A.i
Input "B "; B.r, B.i

AddComp(A,B,C)
MulComp(A,B,D)
Print C.r, C.i 

Q:二重起動を抑止するには?
A:
ミューテックスを使うのが一般的かと。
'宣言部
Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" ( _
	pSAttr As Long, fOwner As Long, sMutexName As *Byte) As Long
Declare Function ReleaseMutex Lib "kernel32" (hMutex As Long) As Long
Const MutexName = "ともちん"
Const ERROR_ALREADY_EXISTS = 183
Dim mutex As DWord

'起動時Createイベントなど
mutex = CreateMutex(0, 0, MutexName)
If mutex = ERROR_ALREADY_EXISTS Then 
	MessageBox(0, "多重起動", 0, 0)
	ExitProcess(0)
End If

'終了時Destroyイベントなど
ReleaseMutex(mutex)

Q:独自のメッセージを作成するには?
A:
WM_APPを使って独自メッセージを定義します。
WM_USERを使えと書いている説明は信じないように。
Const MyMessage = (WM_APP+1)
SendMessage(hMainWnd, MyMessage, 0, 0)

Q:"new"と"malloc"の違いは何ですか
A:
newはオブジェクトの生成のみに使います。
mallocはその他のものに使います。