超初心者でご面倒をおかけしますが、

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Anti MS

超初心者でご面倒をおかけしますが、

#1 投稿記事 by Anti MS »

以下のように、"Mainwnd"をあちこちで見かけますが、これは自動的に組み込まれているライブラリのようなものの中で定義されているいるものなのでしょうか?
これに関する解説やマニュアルなど、Webにはどんなに探しても見つかりません。山本大祐氏の"ActiveBasicオフィシャルユーザーズガイド"にもありませんでした。ご存じの方どなたかいらっしゃいましたらお教えいただきたいのですが......
Function MainWndProc(
Sub Mainwnd_create(
Sub MainWnd_Destroy(
Sub MainWnd_IDM_EXIT_MenuClick(
--------------------------------

また、以下の構文も必ず見かけますが、これはメインウィンドウを閉じるた後の処理のための
ものなのでしょうか?それにしても、これをプロシージャ記述領域の先頭に配置しても最後に配置しても、短いテストプログラムのためか動きに変化がありません。
ABもn88basicの様に、上から下の順に実行のための手続きが発行されることは一緒だと思うのですが、私の頭では理解できません。どなたかお教えください。m(__)m
Sub MainWnd_Destroy()
MenuTest_DestroyObjects()
PostQuitMessage(0)
End Sub
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

Re: 超初心者でご面倒をおかけしますが、

#2 投稿記事 by Sinryow »

以下のように、"Mainwnd"をあちこちで見かけますが、これは自動的に組み込まれているライブラリのようなものの中で定義されているいるものなのでしょうか?
MainWndとは、ウィンドウを作成する場合のデフォルトの名前です。変更することも可能です(ただしその場合は、コードを書き始める前に名前を変更することをお勧めします)。
また、以下の構文も必ず見かけますが、これはメインウィンドウを閉じるた後の処理のための
ものなのでしょうか?それにしても、これをプロシージャ記述領域の先頭に配置しても最後に配置しても、短いテストプログラムのためか動きに変化がありません。
ABもn88basicの様に、上から下の順に実行のための手続きが発行されることは一緒だと思うのですが、私の頭では理解できません。どなたかお教えください。m(__)m
プロシージャ(Sub ~ End Subのような、プログラムの実行のひとかたまり)は、プログラムのどこに書いても関係ないのです。それが外から呼び出されたときに初めて実行されるからです。

例えば

コード: 全て選択

#N88BASIC
Output1()
Output2()

Sub Output1()
    Print "No.1"
End Sub

Sub Output2()
    Print "No.2"
End Sub
ではもちろん先に「No.1」と表示してから「No.2」を表示しますが、

コード: 全て選択

#N88BASIC
Output1()
Output2()

Sub Output2()
    Print "No.2"
End Sub

Sub Output1()
    Print "No.1"
End Sub
であっても先に「No.1」と表示してから「No.2」を表示します。

N88BASICにはプロシージャという概念はないので、まずは概念を理解することが最初でしょうね。
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
Anti MS

Re: 超初心者でご面倒をおかけしますが、

#3 投稿記事 by Anti MS »

> プロシージャ(Sub ~ End Subのような、プログラムの実行のひとかたまり)は、プログラムのどこに書いても関係ないのです。それが外から呼び出されたときに初めて実行されるからです。
 これは、大変よく理解できました。朝早く貴重な時間を割いてコーディングまでしていただきましてありがとうございました。まさに、目の覚める感じが致しました。

 しかしながら、
> MainWndとは、ウィンドウを作成する場合のデフォルトの名前です。変更することも可能です(ただしその場合は、コードを書き始める前に名前を変更することをお勧めします)。
この解説自体は理解できるのですが、CreateやらDestroyやら_IDM_EXIT_などは、ウィンドウを作成する際に内部で予め予約されている(デフォルトでMainWndを使用した場合?)ものの様な気が致します。
 結局のところ、このあたりを理解するには、ABではなく、マイクロソフトのWin32APIの解説書を読むしかないのでしょうか?
 VBの入門編のようなところを探してみることと致します。
 どうもありがとうございました。

 
雷電

#4 投稿記事 by 雷電 »

私も初心者ですが一つ書かせていただきます。
VBやほかのソフトでもそうだと思いますが、イベントのコードです。

――――――――――
・Create(私は、”クリエイト”と読んでいますが)
ウィンドウが作成されたとき、つまりはプログラムが実行されたときです。
そのときに起こるイベントです。
ただ、これはsbpファイルのほうに書いておかないとちゃんとイベントとして動いてくれません。
・Destroy
ウィンドウが破棄されるときに起こるイベントです。

――――――――――
これらのものは決まっている動作です。
が、メニューなどの場合は作ってもいいようです。

例えば、

コード: 全て選択

Sub MainWnd_IDM_EXIT_Click()
    Dim ret As Long

    ret=MessageBox(hMainWnd,"本当に終了しますか?","終了時のメッセージ",MB_YESNO)

    Select Case ret
        Case IDYES
                EndDialog(hMainWnd,1)
        Case IDNO
                Exit Sub
    End Select
End Sub
こんな感じでコーディングするわけです。
確かに予約されている感じですね・・・。
N88BASICはあんまりやったことがないんですが、呼び出す順番で決まってきます。
下手な説明ですがお分かりいただけたでしょうか?
Indigo Visualist
記事: 33
登録日時: 2006年5月22日(月) 21:01
お住まい: 山口
連絡する:

#5 投稿記事 by Indigo Visualist »

それらは恐らく、RADツールを使ってプロジェクトを作製する時のお約束ですね。
自分で全てのコードを書く(新規作成の時に「Basicプログラム」を選択)場合は、それらの単語は全く予約されていませんし、自由に使うことができます。
ただし、Windowsのアプリケーションをつくる場合は、RADツールを使えば(新規作成で「プロジェクト」を選択)とても簡単に作れます。
Mainwnd_Destroy()などはエディタが勝手に挿入してくれますし、
Mainwnd_create()も、ツールから簡単に作ることができます。
ただし、N88から移行されるのでしたら、ノーマルウィンドウはいろいろとややこしいかも知れないので(ハンドルとかイベントとか)、
まずはプロンプトベースのプログラムを書いて、プロシージャやAPI等の概念に慣れてから、徐々に移行されるのが良いと思います。

偉そうなこと言って、僕も最近ようやく理解したばかりなんですけどね(笑
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

#6 投稿記事 by NoWest »

> まずはプロンプトベースのプログラムを書いて、プロシージャやAPI等の概念に慣れてから、徐々に移行されるのが良いと思います。
>
> 偉そうなこと言って、僕も最近ようやく理解したばかりなんですけどね(笑
ってことでAPIだけでウィンドウを実装してみましょう。

コード: 全て選択

Const CLASSNAME="Window Class"
Const WINDOWNAME="Window"

Dim hMainInst As HINSTANCE
hMainInst=GetModuleHandle(NULL)

Dim wce As WNDCLASSEX
ZeroMemory(VarPtr(wce),SizeOf(WNDCLASSEX))
wce.cbSize=SizeOf(WNDCLASSEX)
wce.hbrBackground=COLOR_WINDOW
wce.hCursor=LoadCursor(hMainInst,IDC_ARROW)
wce.hIcon=LoadIcon(hMainInst,IDI_WINLOGO)
wce.hIconSm=LoadIcon(hMainInst,IDI_WINLOGO)
wce.hInstance=hMainInst
wce.lpfnWndProc=AddressOf(WndProc)
wce.lpszClassName=CLASSNAME
wce.lpszMenuName=NULL
wce.style=CS_DBLCLKS or CS_HREDRAW or CS_VREDRAW

Dim AtmWndClass As ATOM
AtmWndClass=RegisterClassEx(wce)
If AtmWndClass=0 Then ExitProcess(0)

Dim hMainWnd As HWND
hMainWnd=CreateWindowEx(0,CLASSNAME,WINDOWNAME,WS_OVERLAPPEDWINDOW,0,0,640,480,NULL,NULL,hMainInst,NULL)
If hMainWnd=0 Then ExitProcess(0)

ShowWindow(hMainWnd,SW_SHOW)

Dim msg As MSG
Do
	Select Case GetMessage(msg,0,0,0)
		Case -1,0
			Exit Do
		Case Else
			TranslateMessage(msg)
			DispatchMessage(msg)
	End Select
Loop
ExitProcess(0)

Function WndProc(hWnd As HWND, Msg As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
	Select Case Msg
		Case WM_CLOSE
			DestroyWindow(hWnd)
		Case WM_DESTROY
			PostQuitMessage(0)
	End Select
	WndProc=DefWindowProc(hWnd,Msg,wParam,lParam)
End Function
ここで、WndProc関数のcase WM_DESTROYの部分がDestroyイベントに対応します。
例えば、Createイベントを実装する場合はWndProc関数を以下のように修正します。

コード: 全て選択

Function WndProc(hWnd As HWND, Msg As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
	Select Case Msg
		Case WM_CLOSE
			DestroyWindow(hWnd)
		Case WM_DESTROY
			PostQuitMessage(0)
		Case WM_CREATE
			MessageBox(hWnd,"ウィンドウが作成された。","メッセージ",MB_OK)
	End Select
	WndProc=DefWindowProc(hWnd,Msg,wParam,lParam)
End Function
RADツールを使ってウィンドウを作成する場合、このWndProcに相当する関数をRADツールが裏方でこっそり管理してくれているので簡単にプログラミングが出来るわけです。
Anti MS

Re: 超初心者でご面倒をおかけしますが、

#7 投稿記事 by Anti MS »

 皆さんありがとうございました。まだまだ理解ができていないどころか、皆様方のHPも除いてみたら、ますますABの深み広がりに驚くばかりです。当面(永久に?)、1ステップ(行、ライン)ずつ理解しようという壮大な計画はなかった事にしました ^^;)
 とても取っつきやすいRADツールが作ってくれるソースコード自体をUFOのように未確認のまま受け入れ、まず全体を理解することに致しました。
 それにしても、宇宙人のような人が大勢いらっしゃるのですね。このコミュニティには。なにやら、ABの熱烈ファンになりそうな予感がします。
返信する