約 1,890,317 件
https://w.atwiki.jp/mini98/pages/20.html
VB6は不十分とは言え、オブジェクト指向の仕組みを備えた言語です。世のオブジェクト指向言語は、データ型に厳格である方向性で開発されています。コンパイルが型に厳しい。継承やポリモーフィズムの仕組みがあるのですから当然のような気もします。 一方、VB6はデータ型が曖昧な部分があります。基本データ型のVariant型の存在です。ここにはIntegerであろうがLongであろうがStringであろうが入ってしまいます。Variant型とオブジェクト指向という部分に何か違和感を感じます。 @
https://w.atwiki.jp/mini98/pages/22.html
高い技術を持つエンジニアがソフトを開発する場合、言語は何を選択しても同じというような意見が無くは無いです。しかしシステム開発の実際では、それなりの理由があり、言語が選択されます。 ソフトの形式であれば、組み込みであるか、webシステムであるか、デスクトップアプリであるか。機能の要求もあります。デスクトップアプリでも、入力して印刷してすぐに終了というようなものか、それとも常に何かからデータを取得して記録し続けるようなものであるか等々。 webであれば、適切なフレームワークが存在するかどうか。大規模開発であれば、マンパワーの確保も重要で、いくら優れたフレームワークが用意されていたとしても、そのフレームワークを熟知した技術者がほとんどいないような状況では、そのフレームワークは選択されないでしょう。 VB6はもう既に枯れた言語であり、マイクロソフトもサポートを打ち切っています。Windows7でそのまま動作するかどうかは大きな悩みどころであったと思います。企業のシステムにVB6が使われているならば、windows7でもし動作しなかった場合、新たに開発し直さなければなりません。 今はもうMicrosoftは.NETに方向性をシフトしています。.NETというバーチャルマシンがあり、C++であろうがVBであろうがC#であろうが、この.NET上の動作するよう中間コンパイルされ、VM上で実行されます。おそらくJavaのコンセプトを追いかけたものだと思いますが。 このVM(バーチャルマシン)が曲者で、JavaもVB.NETもC#.NETも、自動ガベージコレクタ(GC)の仕組みを持っていますが、GCする時って、少ない時間ながら、システムが止まるんです。意図的にGCを起こして、その停止時間を短くする事はできます。しかしこの仕組みだと、常にデスクトップ上で動作させて情報収集するとかいうようなシステムには向きません。GCにかかる時間を抑えるような事は可能ですが、全く問題にならないように作るのはそれなりに難しい。 VB6ももちろんGCの仕組みはあります。しかしJavaや.NET言語とは違った簡易なGCの仕組みです。参照をカウントしておいて、カウントが0になったら破棄、という単純なものです。メソッドの中であるクラスをNewしても、メソッドを抜けて参照がなくなると、そこでメモリは解放されます。自作クラスを作って、Terminateイベントで、メモリの解放がわかるような記述を入れておくと、どのタイミングでTerminateしているか観察できます。 VB6の簡易なGCの仕組みで注意すべき点は、循環参照を作らない事です。これを作ってしまうとすぐにメモリリークを起こします。 また、VB6はオブジェクト指向とはいえ、その仕組みは簡易なものです。例外のスローも実装されていません。従って、簡易にシステムを組みやすいという点があります。あまり強固なものを作る事ができませんが、裏をかえせば、簡単なソフトをささっと作るのに向いています。 まとめると 簡易なGC 簡易な文法 これらによって、常に動作し続ける簡易なソフトには向く、と言えそうです。 @
https://w.atwiki.jp/mini98/pages/23.html
「VB6はOOPをわかりにくくする」でも書いたように、VB6だけを利用し続けていると、OOPはいつまでもマスターできないです。それとは別に、VB6は初心者に向かないんじゃないかなあと思う所を書いてみます。 オブジェクト指向を抜きにしても、VB6は初心者に向きません。少し語弊があるので正確に言うと、VB6では初心者がちゃんとプログラムの勉強をするには向きません。データ型が曖昧です。VB6を解説したサイトには、メソッドの引数や戻り値のデータ型の記載の無いサイトすらあります。他の言語のサイトでは考えられません。 Text1.text = Text1.text + 1 このような記述でもコンパイルエラーになる事はありません(Text1に数値以外のデータが入ってしまった可能性が考慮されていません)。しかし初心者はこのようなコードを平気で書きます。場合によっては、数値の比較をしているのか文字列の比較をしているのかわからなくなるようなコードも見た事があります。 暗黙のうちに使用されるプロパティもあります。 Text1.text = "hogehoge" と書くところを Text1 = "hogehoge" でも同じ意味になります。しかし、他の人が後から見てもわかるように書くならば、プロパティは正確に記述するに越した事はありません。 きちっと書く、という習慣は大事です。データ型は基本中の基本です。メソッドやプロパティも基本中の基本です。ここを曖昧にしたままでも動作してしまう仕様は、初心者にも簡単に書けるようにマイクロソフトが配慮したのでしょうが、それは不要な配慮であったと思うのです。 @
https://w.atwiki.jp/mini98/pages/16.html
VB6はオブジェクト指向プログラミングをわかりにくくする VB6は紛れもなくオブジェクト指向機能のあるプログラミング言語です。しかしながら、VB6だけでプログラミングの勉強をしていると、オブジェクト指向の考え方のようなものはいつまで経っても理解できないでしょう。VisualEditorの初期画面の一部です。 プロジェクトエクスプローラーを右クリックして出てくる「追加」に、フォームモジュール、MDIフォームモジュール、標準モジュール、クラスモジュールがありますが、フォームとMDIはわかりやすいとしても、標準モジュールとクラスモジュールをどう使い分ければ良いかわかりますか?市販のVB6解説本の大半には、この説明がありません。Webで検索しても、ほとんど見つからないと思います。 標準モジュールとクラスモジュールの使い分けはどのようにすればいいのでしょうか?標準モジュールの構成はクラスモジュールと同じく、フィールドとメソッドから成り立っています。しかし標準モジュールはクラスのようにインスタンス化せずとも利用できます。デザインパターンに慣れた人なら「Singleton」がすぐに浮かぶと思います。つまり、staticなインスタンスのような存在が標準モジュールなのです。 おそらく、VB6しか触った事の無い人であれば、ここまでの解説はあまり理解できないと思います。 OOPを理解する事により、この違いが明確にわかるようになれば、クラスと標準モジュールの使い分けができるようになると思います。 幸いにもVB6はシングルスレッドの動作しかできない(マルチスレッドは不可能ではありません)ので、単によく利用するメソッドをまとめておくという目的の為に標準モジュールを利用するのも間違いではありません。しかしisoで定められたソフトウェア品質の一つに「移植性」があります。これを考慮するのであれば、クラスがわからないうちは単にメソッドをまとめておくだけの場合も、クラスモジュールにまとめておいた方が良いでしょう。 VB6でOOPが身につかない理由 VB6からプログラミングの勉強をはじめた VB6以外のオブジェクト指向言語に触れた事が無い フォームもクラスであるにも関わらず、規定のインスタンスが存在し、インスタンス化して利用する機会が無い 標準モジュールという特殊な存在がある このような人はおそらくいつまでもオブジェクト指向プログラミングの技術が身につきません。市販のVB6テキストでOOPを解説した本が見当たらないですし、Webでもほとんど存在しません(無くはないです)。このような環境でどのようにVB6を利用してOOPを勉強していけばいいのでしょうか。 市販のVB6テキストの大半は、コントロールの使い方の解説に終わっています。その中にはNew演算子のようなOOPの書き方が無くもないのですが、利用者はわからないまま利用しているに過ぎないように思います。 マウスでフォームの広さを決定し、マウスでコントロールを貼付け、クリックして適当にロジックを書く。それでも動作するものを作る事ができます。でもこれではいつまでもOOPは身につきません。他に、構造化もおぼつかないと思います。構造化する理由は後で述べますが、Functionプロシージャも書けないまま、初心者を抜け切れない独学者は大勢いると思います。これはVB.NETの時代でも同様です。 @
https://w.atwiki.jp/mini98/pages/18.html
VB6でOOPしようとする時、弱点があります。それは、クラス群をパッケージにまとめる事ができないという弱点です。Javaではパッケージ、.NETでは名前空間と呼ばれる仕組みがあります。それは、クラスをまとめておくものです。VB6にはその機能はありません。DLL化すればできなくもありませんが、VB6で作成したクラスのDLL化にはスコープがおかしくなるというようなMicrosoftのバグが存在するため、お勧めできません。 結果、クラスモジュールのフォルダに、たくさんのクラスが整理されずに収まっているような状態になります。パッケージプライベートというような用い方が仕様に無い言語なので仕方ないといえば仕方無いのですが。 もちろん、機能的には問題ありません。 @
https://w.atwiki.jp/mini98/pages/17.html
私が考える、VB6でオブジェクト指向プログラミングを勉強する最初の一歩を紹介します。これは、フォームもクラスであるという考え方からスタートするための方法です。次のような流れになります。 標準EXEを作成する Form1の既定のインスタンスを削除 プロジェクトエクスプローラーを右クリック→標準モジュールを追加 Sub Mainを作成 プロジェクトプロパティでスタートアップの設定を「Sub Main」に変更する。 まず、VisualEditorを立ち上げ、標準EXEプロジェクトを作成します。 Form1のコンストラクタ(Initiarizeイベントプロシージャ)で、Form1の既定のインスタンスへの参照を削除します。コンストラクタとはクラスからインスタンスを生成した時に、最初に実行されるものです。 Private Sub Form_Initialize() Set Form1 = Nothing End Sub 既定のインスタンスとは、インスタンスを作成していなくても、自動的に作成されてしまうインスタンスでVB6に独特のものです(VB2005で復活してしまいましたが)。これでFormを実行しようとしても、すぐに終了してしまい、利用できません。また同様に、Form1からForm2を呼び出すような場面では、実行時エラーが生じます。 Formもクラスなのです。型(クラス)から実体(インスタンス)を生成する事により、利用を開始します。このインスタンスを、あたかも「モノ(Object)」のように扱う事ができます。 続いて、プロジェクトエクスプローラーから、標準モジュールを追加します。 標準モジュールを追加したら、Sub Mainメソッドを作成します。 Private mainFrm As Form1 Sub Main() Set mainFrm = New Form1 Call mainFrm.Show End Sub Sub Mainを作成すると同時にmainFrmと名付けたフィールドが用意されています。今回の例ではここまでする必要は無いのですが、後々mainFrmにアクセスできるよう、フィールドに保持させています。 最後に、プロジェクトプロパティでスタートアップの設定をSub Mainに変更します。プロジェクトエクスプローラーを右クリックすると、プロジェクトのプロパティを設定できます。そこでスタートアップを次のように変更して下さい これでプログラムを実行すると、ちゃんと表示されるようになります。 フォームを作成する際は、全てのフォームに対して、コンストラクタ内で既定のインスタンスを削除するよう心がけて下さい。 @
https://w.atwiki.jp/inouework/pages/18.html
VB6.0 ウィンドウプロシージャのオーバーライド ウィンドウの表示状態を制御する
https://w.atwiki.jp/yasrun/pages/36.html
なんかBASファイルがでてきた 漢字をカナにコンバートするプログラムらしい。 DBに漢字でしか名前が入っていないのに、「かな検索できるようにしてくれ!」 とか無茶ぶりされて、WEBのどこかから仕入れたコードででっちあげた代物だと思う。 あ、コメントに書いてあった。 http //plaza.rakuten.co.jp/pgmemo/diary/200512060000/ どうもその節はお世話になりました(*_ _) 良い子のみなさんは人名リストをDBで管理するときは ふりがなのカラムもきちんと用意しませう。 Attribute VB_Name = "KanjiKanaConvert" このプログラムは以下のサイトから取得したものを利用しています。 http //plaza.rakuten.co.jp/pgmemo/diary/200512060000/ Option Explicit Const GCL_CONVERSION = 1 Const GCL_REVERSECONVERSION = 2 Const VER_PLATFORM_WIN32_WINDOWS = 1 Const VER_PLATFORM_WIN32_NT = 2 ==IME 関連== Type CANDIDATELIST dwSize As Long dwStyle As Long dwCount As Long dwSelection As Long dwPageStart As Long dwPageSize As Long dwOffset(0) As Long End Type 入力コンテキストハンドル取得 Declare Function ImmGetContext Lib "imm32" ( _ ByVal hWnd As Long _ ) As Long 入力コンテキストハンドル開放 Declare Function ImmReleaseContext Lib "imm32" ( _ ByVal hWnd As Long, _ ByVal hIMC As Long _ ) As Long 変換候補取得 Declare Function ImmGetConversionList Lib "imm32" Alias "ImmGetConversionListW" ( _ ByVal hKL As Long, _ ByVal hIMC As Long, _ ByRef lpSrc As Byte, _ ByRef lpDst As Any, _ ByVal dwBufLen As Long, _ ByVal uFlag As Long _ ) As Long 入力ロケール識別子(キーボードレイアウトハンドル)取得 Declare Function GetKeyboardLayout Lib "user32" ( _ ByVal idThread As Long _ ) As Long 文字列長取得(Unicode) Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" ( _ ByRef strString As Any _ ) As Long ==OS バージョン取得== Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion(127) As Byte End Type Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" ( _ ByRef VersionInfo As OSVERSIONINFO _ ) As Long メモリ移動 Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ ByRef Destination As Any, _ ByRef Source As Any, _ ByVal Length As Long _ ) Public Function ReverseConversion(strSource As String) As String Dim bySource() As Byte 前変換用 Dim hIMC As Long 入力コンテキストハンドル Dim hKL As Long キーボードレイアウトハンドル Dim lngSize As Long 変換後バッファサイズ Dim lngOffset As Long 変換文字列候補オフセットアドレス Dim byCandiateArray() As Byte 変換結果バッファ Dim CandiateList As CANDIDATELIST Dim byWork() As Byte Dim lngResult As Long Dim osvi As OSVERSIONINFO If strSource = "" Then Exit Function 空文字列の場合は処理しない OS判別 osvi.dwOSVersionInfoSize = Len(osvi) lngResult = GetVersionEx(osvi) If osvi.dwPlatformId = VER_PLATFORM_WIN32_NT Then WindowsNT系 Unicodeのまま bySource = strSource 終端を付加 ReDim Preserve bySource(UBound(bySource) + 2) Else Windows95系 シフトJISに変換 bySource = StrConv(strSource, vbFromUnicode) 終端を付加 ReDim Preserve bySource(UBound(bySource) + 1) End If hIMC = ImmGetContext(Forms(0).hWnd) hKL = GetKeyboardLayout(0) 変換結果を受け取るバッファサイズを取得 lngSize = ImmGetConversionList(hKL, hIMC, bySource(0), Null, 0, GCL_REVERSECONVERSION) If lngSize 0 Then バッファサイズ分バイト配列を動的に取得 ReDim byCandiateArray(lngSize) 変換結果を取得 lngSize = ImmGetConversionList(hKL, hIMC, bySource(0), byCandiateArray(0), lngSize, _ GCL_REVERSECONVERSION) バッファ内容を参照するため構造体にコピー MoveMemory CandiateList, byCandiateArray(0), Len(CandiateList) If CandiateList.dwCount 0 Then 先頭候補のオフセット取得 lngOffset = CandiateList.dwOffset(0) "ふりがな"取得 ReverseConversion = MidB(byCandiateArray, lngOffset + 1, _ lstrlen(byCandiateArray(lngOffset)) * 2) End If End If lngResult = ImmReleaseContext(Forms(0).hWnd, hIMC) End Function
https://w.atwiki.jp/mini98/pages/2.html
メニュー トップページ 開発メモ GWTjar追加の注意点 DataGridの使い方 SuggestBoxのイベント ScrollPanel クライアント側のみでのファイルの扱い DiscrosurePanel VB6のオブジェクト指向プログラミング入門オブジェクト指向とは VB6はOOPをわかりにくくする VB6でOOPする最初の一歩 VB6でOOPする時の弱点 オブジェクト・クラス・インスタンス 動くラベルを作る クラスの作り方 余談 システムハンガリアン VB6の矛盾点 Collectionクラス VB6に向くソフト VB6は初心者向きでない テキストを選ぶコツ 画面の色使いについて インデントについて 画面作成について リンク プラグイン紹介 まとめサイト作成支援ツール メニュー メニュー2 @wiki @wikiご利用ガイド 他のサービス 無料ホームページ作成 無料ブログ作成 2ch型掲示板レンタル 無料掲示板レンタル お絵かきレンタル 無料ソーシャルプロフ ここを編集
https://w.atwiki.jp/mini98/pages/15.html
オブジェクト指向というものを定義するとき、なかなかヒトコトで表現する事は難しいのですが、「ソフトウェアで扱う事柄について、データと操作をまとめて1つのオブジェクトとして捉える」というソフトウェア開発を指向しているもの、と表現できます(オブジェクト指向超入門)。 VB6でデータというと、変数や定数ですが、クラスのはじめにで Private や Public で宣言している変数が上記定義中の「データ」です(Private と Public はアクセス修飾子ですが、メソッド内部の変数にはこのアクセス修飾子を付ける事ができません。これが関数内ローカル変数とオブジェクト指向でいう「データ」との違いです)。 言語に依存しない言い方をすると、オブジェクト指向ではこのデータの事を「フィールド」と呼びます(メンバ変数と呼ぶ事もあります)。 操作とは、クラス内部に存在する Sub や Function で宣言されるプロシージャの事です。 Sub はサブルーチン、Function は関数を指していますが、戻り値の無いものをサブルーチン、有るものを関数としています。Microsoftはこれらをまとめてプロシージャと呼んでいます。 言語に依存しない言い方をすると、オブジェクト指向ではこのサブルーチンや関数の事を「メソッド」と呼びます。 このフィールドとメソッドという呼び名はオブジェクト指向を解説した本やサイトでは共通です。 言語の解説本ではなく、オブジェクト指向そのものを解説した本も市販されています(丁寧にオブジェクト指向を解説すれば本一冊になります)。わかりやすい本が見つかればいずれ紹介します。 オブジェクト指向の利点 現在、世の中には大規模なシステムがたくさん稼働していますが、これもオブジェクト指向の普及が一役買っていると言えます。昔であれば大規模なシステムを開発するのは大変でした。オブジェクト指向の利点により、大規模な開発が容易になったからです。「オブジェクト指向の利点」で検索してみると多数のページがヒットします。それぞれ様々な解説があります。 再利用性 オブジェクト指向の様々な解説の中でも、いちばん共通する利点は「再利用性」だと思います。オブジェクト指向プログラミング(以下OOP)では、モジュールの単位が「クラス」です。OOPではクラスをどんどん再利用して開発していきます。 また、そういったクラスを集め、web開発であろうがデスクトップアプリケーションであろうが、その開発に向いたフレームワークが存在します。似たような処理をする部分でクラスによる骨組み(フレームワーク)を作成し、個別の部分についてはそのフレームワークに付け足していくだけ、というような構成になっています(残念ながらVB6でオープンソース的フレームワークは見当たりませんが)。 他に、デザインパターンの利用が挙げられます。ある種の設計を行う場合、このようなデザインを行うとスマートに実装できる、といったパターンが存在します。古くはGOFパターンと呼ばれるものがあります。VB6ではOOP機能の制限で、これらを全て適用する事はできませんが、それでも適用可能なパターンは存在します。 カプセル化 OOPの利点に隠蔽化(カプセル化)があります。クラス内部でクラス外に見せたくないものはアクセス修飾子をPrivateにします。こうする事で、より安全な設計ができるようになりました。昔のシステムであれば、巨大な構造体からなるグローバル変数が存在し、そのいずれも簡単にアクセスでき、変更可能でしたが、そのような設計はシステムを複雑にし、わかりにくいものにしていました。かつてプログラミングで「GOTOは悪」と言われましたが、現在では「グローバル変数は悪」と言えます。 VB6でオブジェクト指向開発する利点 VB6のオブジェクト指向には様々な制限があります。継承が無い、引数付きコンストラクタを生成できない等。しかしそれでもVB6でOOPする利点はあります。 利点 インスタンス生成により、初期化が保証されている 再利用性を向上する事ができる ポリモーフィズムにより、似たような処理を共通化しコード量を抑える事ができる その他 欠点 OOP理解に多少の時間がかかる VB6のOOP機能が他の言語と異なる部分があり、市販のOOP解説本の内容も噛み砕きながら読まなければならない 私なりのオブジェクト指向定義 私なりにオブジェクト指向というものを定義するならば…世の中には様々なモノ(オブジェクト)があります。モノには必ず構造と機能が備わっています。椅子という構造があるとき、座ることができる、という機能があります。心臓という構造があるとき、循環という機能が備わっています。非オブジェクト指向言語まででは、構造体というもので構造を表現できました。その構造体に機能(メソッド)を追加したものがオブジェクトです。構造と機能を備えたオブジェクトをオブジェクト同士の作用によってソフトを作成していく方法がオブジェクト指向です。 @