2015年12月10日
脱線につぐ脱線
仕事でCADを使う。
仕事で計算するソフトを使う。
計算ソフトのデータから勝手に図面を書いてくれないものか。。
最近はソフトメーカーもそういった連携に対応している。
サーキャドとか。
でも試験段階というかユーザーはまだ手探り。
数独とかパズルゲームとかの感覚で
日々の頭の体操がしたいと思っていたので、
10月末から寝る前にプログラムの勉強を毎日することにした。
エクセルが得意なので
やっぱりVBAを勉強する。
@データ検索の関数を作成
計算ソフトから吐き出したCSVファイル内を検索し、
座標データを取得するfunctionプロシージャを作成した。
そう、vlookup関数やmatch関数+index関数と同じことを
自分の作ったプロシージャでできるようにした。
といっても
まだCSVファイル内を検索している訳ではなく、
エクセルのシートにコピー&ペーストして
シート内を検索している。まだまだ不勉強。
このとき勉強したのが
検索するエクセルシートのデータの最終行、最終列を
取得する方法。
下記のサイトより。
>No.8 ワークシートの最終行、最終列を取得する
>http://www.niji.or.jp/home/toru/notes/8.html
これにより、プログラムの動作時間は最小限になる。
ま、あんまり変わらないか。
A取得した座標を使ってエクセルからAutoCADに線や文字を書く
んで、取得した座標データをAutoCADのコマンドラインにに送信するSubプロシージャを作成した。
AutoCADとの連携で参考にしたのは以下のサイト。
>エクセルでAutoCADを自動作図させる方法
>http://excelvba.info/index.html
この頁、点を繰り返し書く方法が記載されているが、
最初に見たときは線や円や文字の書き方が書いてあった気がする。
(最近書き換えたのかな?)
いざエクセルVBAのプログラムでAUTOCADの作図が
できるとなると、楽しいもので、
レイヤを指定して線を書く関数を作り
レイヤを指定して丸を書く関数を作り
レイヤを指定して四角を書く関数を作り
レイヤを指定して文字を書く関数を作り、、
コマンドでできる操作は全て上記のホームページの方法で
エクセルVBAで作図できる。
Bダイアログのコンボボックスの各インデックスの文字列を取得する。
ここまでVBAで関数を作った段階で、脱線し始めた。
AUTOCADで「-xref」というコマンドで外部参照の
ダイアログが開く。
外部参照でいつもは図面枠を貼り付けている。
コマンドラインを使って全自動で作図したい人間にとって
ダイアログが開く系のものは困る。
ファイル名をテキストボックスに打ったり、開くのボタンを押すなどの
手動操作が出るからだ。
ファイル名を入力する箇所はComboBoxクラスになっている。
コンボボックスのインデックス数はCB_GETCOUNTとSendmessageで取得できる。
インデックス数は2だったのでインデックス番号0の時と1の時の文字列を取得したいが
SendMessageStr(hwnd, CB_GETLBTEXT, num1, StrBuf)として送っても
バッファStrBufに文字列が返ってこない。
以後3週間何をやっても文字列を取得できない失敗の日々が続く、、、、
で試行錯誤の末、buf=SendMessage(hwnd, CB_GETLBTEXTLEN, num1, 0) にて
先に文字列の文字数を先にしっかり取得し、
LngLen = buf + 1
StrBuf = String(LngLen, "1")
buf2 = SendMessageStr(hwnd, CB_GETLBTEXT, num1, StrBuf)
といったように
文字数以上のバッファを用意しておけばきちんと文字列が
返ってくることに気付く。
色々調べているとCB_GETLBTEXTというメッセージの種類で
エラーで困っている人がしばしばいた。僕と同じ。
なかには
他のプロセスとSendmessageをやり取りするため
共有メモリなるものをVirturalallocex関数で確保し、
共有メモリのポインタをSendmessgeにて渡すという技を使っている以下のホームページもあった。
>全てのウィンドウとコントロールの情報を表示するサンプル(VB6)
>http://homepage2.nifty.com/nonnon/SoftSample/SampleEnumWindows.html
ただ、このホームページにある
SendMessageByVAEString = SendMessage(hWnd, wMsg, wParam, lngVirtual)
のlngVirtualはVirturalallocex関数で確保した共有メモリの開始アドレスで
型はlong型。
sendmessageでlong型を第4引数に入れてしまうと、
何もメモリに書き込まれなかった。
ReadProcessMemory関数で開始アドレスlngVirtualから文字列を読んだが、
何も書き込まれていなかった。
んで
僕は思った。
VB6.0の限界だ。(VBAの限界だ。)
sendmessage関数の第4引数は文字列変数でなければならないのだ。たぶん。
やりたいことは文字列変数のポインタをlngVirtualの値に変えたい、ということ。
ポインタの付け替え。
これはVB6.0(VBA)ではできないのだ。たぶん。
Cアセンブラを覚えよう!
んで
調べたところ
下記のホームページを発見。
>t-hom’s diary
>http://thom.hateblo.jp/entry/2015/08/03/014648
機械語と一対一対応するアセンブリ言語を
VBAで実行し、ポインタによる変数の付け替えを行うという記事。
この記事を読むがまま、僕は流され、
amazonで独習アセンブラという本を購入してしまうのであった。
この本を読んで僕はnasmというアセンブラに出会う。
ただ、nasmをインストールする2頁ほど読んで
nasmをダウンロードし、Cドライブに解凍する。
そしてストップする、、あれ?この後どうしたらいいんだ?
windowsの部分の記載不親切だよ、、
どうやったら使えるようになるのかわからない。
んで
調べて調べて下記のホームページにたどり着く。
>Division by Zero アセンブラでWin32APIを使ってみる(MessageBox編)
>http://moge32.blogspot.jp/2013/03/asmwin32apimesbox.html
>NASM の入手
>http://bb-side.com/modules/side04/index.php?content_id=14
リンカとWIN32.LIBを追加でダウンロードした。
どうやらコマンドプロンプトを使うようだ。
BATファイルの勉強をした際の経験が役に立ったぞ。
nasmのexeファイルのある場所にcdコマンドで移動し、
例題のコマンドを打ち込んでアセンブル。
生成したオブジェクトファイルと win32.lib をリンクしてexeファイルを生成。
exeファイルを実行するとMessageBoxにHello Worldが表示された。
ここまで来れば、「独習アセンブラ」の内容も分かるはず!
いざ本の通りに打ち込んでみると、
我が初代surface proは64bitマシンのため.com形式のファイルは
エラーとのこと。なにー!?
せっかく買った本が、、無駄か?
次の日の会社帰りに僕は「64ビット アセンブラ入門」を購入。
あー、またいつもの衝動買い。無駄遣い癖がでた。
その本ではc++からアセンブリ言語関数を呼び出す、、とか
Visual Studio Express 2013 for Windows Desktop、、とか書かれているので、
最終的にはC言語を勉強したくなるであろう、という読み。
で、そんなことを考えていると
目の前にC言語の本が!
で「苦しんで覚えるC言語」を買ってしまうのであった。
あー無駄遣い。間違いない。
このまま行くと
いずれPython(言語)を勉強して
人工知能の勉強をするのも非現実的な話ではない気がしてきた。
なーんて。
ただこんなバカをいっぱいやるのもいい頭の体操にはなるな。
仕事で計算するソフトを使う。
計算ソフトのデータから勝手に図面を書いてくれないものか。。
最近はソフトメーカーもそういった連携に対応している。
サーキャドとか。
でも試験段階というかユーザーはまだ手探り。
数独とかパズルゲームとかの感覚で
日々の頭の体操がしたいと思っていたので、
10月末から寝る前にプログラムの勉強を毎日することにした。
エクセルが得意なので
やっぱりVBAを勉強する。
@データ検索の関数を作成
計算ソフトから吐き出したCSVファイル内を検索し、
座標データを取得するfunctionプロシージャを作成した。
そう、vlookup関数やmatch関数+index関数と同じことを
自分の作ったプロシージャでできるようにした。
といっても
まだCSVファイル内を検索している訳ではなく、
エクセルのシートにコピー&ペーストして
シート内を検索している。まだまだ不勉強。
このとき勉強したのが
検索するエクセルシートのデータの最終行、最終列を
取得する方法。
下記のサイトより。
>No.8 ワークシートの最終行、最終列を取得する
>http://www.niji.or.jp/home/toru/notes/8.html
これにより、プログラムの動作時間は最小限になる。
ま、あんまり変わらないか。
A取得した座標を使ってエクセルからAutoCADに線や文字を書く
んで、取得した座標データをAutoCADのコマンドラインにに送信するSubプロシージャを作成した。
AutoCADとの連携で参考にしたのは以下のサイト。
>エクセルでAutoCADを自動作図させる方法
>http://excelvba.info/index.html
この頁、点を繰り返し書く方法が記載されているが、
最初に見たときは線や円や文字の書き方が書いてあった気がする。
(最近書き換えたのかな?)
いざエクセルVBAのプログラムでAUTOCADの作図が
できるとなると、楽しいもので、
レイヤを指定して線を書く関数を作り
レイヤを指定して丸を書く関数を作り
レイヤを指定して四角を書く関数を作り
レイヤを指定して文字を書く関数を作り、、
コマンドでできる操作は全て上記のホームページの方法で
エクセルVBAで作図できる。
Bダイアログのコンボボックスの各インデックスの文字列を取得する。
ここまでVBAで関数を作った段階で、脱線し始めた。
AUTOCADで「-xref」というコマンドで外部参照の
ダイアログが開く。
外部参照でいつもは図面枠を貼り付けている。
コマンドラインを使って全自動で作図したい人間にとって
ダイアログが開く系のものは困る。
ファイル名をテキストボックスに打ったり、開くのボタンを押すなどの
手動操作が出るからだ。
ファイル名を入力する箇所はComboBoxクラスになっている。
コンボボックスのインデックス数はCB_GETCOUNTとSendmessageで取得できる。
インデックス数は2だったのでインデックス番号0の時と1の時の文字列を取得したいが
SendMessageStr(hwnd, CB_GETLBTEXT, num1, StrBuf)として送っても
バッファStrBufに文字列が返ってこない。
以後3週間何をやっても文字列を取得できない失敗の日々が続く、、、、
で試行錯誤の末、buf=SendMessage(hwnd, CB_GETLBTEXTLEN, num1, 0) にて
先に文字列の文字数を先にしっかり取得し、
LngLen = buf + 1
StrBuf = String(LngLen, "1")
buf2 = SendMessageStr(hwnd, CB_GETLBTEXT, num1, StrBuf)
といったように
文字数以上のバッファを用意しておけばきちんと文字列が
返ってくることに気付く。
色々調べているとCB_GETLBTEXTというメッセージの種類で
エラーで困っている人がしばしばいた。僕と同じ。
なかには
他のプロセスとSendmessageをやり取りするため
共有メモリなるものをVirturalallocex関数で確保し、
共有メモリのポインタをSendmessgeにて渡すという技を使っている以下のホームページもあった。
>全てのウィンドウとコントロールの情報を表示するサンプル(VB6)
>http://homepage2.nifty.com/nonnon/SoftSample/SampleEnumWindows.html
ただ、このホームページにある
SendMessageByVAEString = SendMessage(hWnd, wMsg, wParam, lngVirtual)
のlngVirtualはVirturalallocex関数で確保した共有メモリの開始アドレスで
型はlong型。
sendmessageでlong型を第4引数に入れてしまうと、
何もメモリに書き込まれなかった。
ReadProcessMemory関数で開始アドレスlngVirtualから文字列を読んだが、
何も書き込まれていなかった。
んで
僕は思った。
VB6.0の限界だ。(VBAの限界だ。)
sendmessage関数の第4引数は文字列変数でなければならないのだ。たぶん。
やりたいことは文字列変数のポインタをlngVirtualの値に変えたい、ということ。
ポインタの付け替え。
これはVB6.0(VBA)ではできないのだ。たぶん。
Cアセンブラを覚えよう!
んで
調べたところ
下記のホームページを発見。
>t-hom’s diary
>http://thom.hateblo.jp/entry/2015/08/03/014648
機械語と一対一対応するアセンブリ言語を
VBAで実行し、ポインタによる変数の付け替えを行うという記事。
この記事を読むがまま、僕は流され、
amazonで独習アセンブラという本を購入してしまうのであった。
この本を読んで僕はnasmというアセンブラに出会う。
ただ、nasmをインストールする2頁ほど読んで
nasmをダウンロードし、Cドライブに解凍する。
そしてストップする、、あれ?この後どうしたらいいんだ?
windowsの部分の記載不親切だよ、、
どうやったら使えるようになるのかわからない。
んで
調べて調べて下記のホームページにたどり着く。
>Division by Zero アセンブラでWin32APIを使ってみる(MessageBox編)
>http://moge32.blogspot.jp/2013/03/asmwin32apimesbox.html
>NASM の入手
>http://bb-side.com/modules/side04/index.php?content_id=14
リンカとWIN32.LIBを追加でダウンロードした。
どうやらコマンドプロンプトを使うようだ。
BATファイルの勉強をした際の経験が役に立ったぞ。
nasmのexeファイルのある場所にcdコマンドで移動し、
例題のコマンドを打ち込んでアセンブル。
生成したオブジェクトファイルと win32.lib をリンクしてexeファイルを生成。
exeファイルを実行するとMessageBoxにHello Worldが表示された。
ここまで来れば、「独習アセンブラ」の内容も分かるはず!
いざ本の通りに打ち込んでみると、
我が初代surface proは64bitマシンのため.com形式のファイルは
エラーとのこと。なにー!?
せっかく買った本が、、無駄か?
次の日の会社帰りに僕は「64ビット アセンブラ入門」を購入。
あー、またいつもの衝動買い。無駄遣い癖がでた。
その本ではc++からアセンブリ言語関数を呼び出す、、とか
Visual Studio Express 2013 for Windows Desktop、、とか書かれているので、
最終的にはC言語を勉強したくなるであろう、という読み。
で、そんなことを考えていると
目の前にC言語の本が!
で「苦しんで覚えるC言語」を買ってしまうのであった。
あー無駄遣い。間違いない。
このまま行くと
いずれPython(言語)を勉強して
人工知能の勉強をするのも非現実的な話ではない気がしてきた。
なーんて。
ただこんなバカをいっぱいやるのもいい頭の体操にはなるな。
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/4507799
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック