トップページ⇒tech
66コメント23KB

VisualBasicこっち

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
VBネタのスレがないので、つくったよ。
0002デフォルトの名無しさんNGNG
EUC文字コードのHTMLファイルを生成したいけど、
シフト文字をEUC文字に変換する方法、教えて

nkf32.dllはwin2000+vb6sp5では、不正処理で使えんよ。
0003デフォルトの名無しさんNGNG
>>2
EUCコードをシフトJISコードに変換する
http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/e/euc2sjis.html
0004デフォルトの名無しさんNGNG
>>2
> シフト文字をEUC文字に変換する方法

ここから探して
http://piza.2ch.net/test/read.cgi?bbs=tech&key=968328471&ls=50

> nkf32.dllはwin2000+vb6sp5では、不正処理で使えんよ。

ほんまかいな
0005デフォルトの名無しさんNGNG
>4
ないよ
0006BeeNGNG
出来たプログラムが重いと言われているVBですが、
少しでも動作を軽くするために気にしている事なんかありますか?
なるべくVB特有の事例を挙げて欲しいです。
0007デフォルトの名無しさんNGNG
>>6
VB使ってる限り最適化にはおのずと限界があるんだし、むしろ
動作を軽く「見せかける」ために、スプラッシュウィンドウとか
プログレスバーを適切に表示することを気をつけた方がいいと思う
0008>6NGNG
速いマシンを使う
0009>6NGNG
動作速度が要求される部分は、C等で記述。
0010デフォルトの名無しさんNGNG
DOEVENTは入れない。
0011元VB 現D使いNGNG
バリアントは極力使わない。

データをクラスファイルでひとまとめにしておいて
必要な時にNewで生成し、必要無くなったらこまめに
Set Obj = Nothingで解放する。

関連性の高いフォームはまとめてLoadし、Show,Hideで
切替を速く見せる。必要なくなればまとめてUnLoadして
Set Nothing。これもクラスでまとめておく。

グラフィックはリソースとしては取り込まない。
使う時もファイルから読み込む。
ActiveX使用も極力避ける。
0012BeeNGNG
>>8,9
VB内での最適化のノウハウが伺いたかったのですが・・・
僕の書き込みが悪かったようです。ということで、
VB内での(VBのみでの)最適化のノウハウなどありましたら、
教えていただけませんでしょうか?

>>7
なるほど。というかその辺はUIとして気をつけなければいけない
部分でもありますね。VBならなおさら。

>>10
確かにDoEventsはなかなかコストの高い命令のようですね。

>>11
オブジェクトの解放というのは速度的な影響があるのでしょうか?
こまめにやるよりは、(理想ですが)終了時にまとめて解放した方が
実際の動作としては軽く感じませんか?
ファイルから読み込むというのも、リソースとして取り込む方が
プログラムからのファイルの読み込みがない分、軽く感じると思うのですが・・・
001311NGNG
私は起動時に待たされるのはあんまり好きでない。
終了時も出来ればスパッと終わって欲しい。

グラフィックはメモリ食うし描画にも時間が掛かるから
できれば使わないに越した事は無いと思う。
使う時も出来るだけ使いまわししてデータの重複は避けたほうが
いいと思うよ。

それからDoEventsは入れないと長い処理で待ってる間
他の操作出来なくなるから入れたほうがいいと思う。
Windowsはプリエンプティブなマルチタスクだし。

それとgoogleで"VB 高速化"で情報集めてみたら?
0014デフォルトの名無しさんNGNG
>Windowsはプリエンプティブなマルチタスクだし。

そ、そうだったのか!
001511NGNG
例えばgoogleでヒットしたここなんかwith文の使用とか
いろいろ参考になると思われ。
http://www3.plala.or.jp/sardonyx/smart/
0016BeeNGNG
>>11
おお、これはなかなか面白く読めました。
この辺は結構常識的な事なんでしょうけど、
僕はまだまだ未熟なんで参考になりました。
ありがとうございました。
0017デフォルトの名無しさんNGNG
>>Windowsはプリエンプティブなマルチタスクだし。
>
>そ、そうだったのか!
ナゼカワラタ
001811NGNG
DoEventsを呼ぶにしても、

・3秒以内に結果を返せる:呼ばなくてもよい。
・1分以内で返せる:ループの一番外側で呼ぶ。
・1分以上かかる:ループの一番内側で頻繁に呼ぶ。

て具合に処理の負荷と優先度を考慮して使い分けるといいと思う。
0019デフォルトの名無しさんNGNG
VBのver6.0と4.0ってどう違うんですか?
0020usamiNGNG
VBの値段って
どれくらいですか?
0021デフォルトの名無しさんNGNG
だれか、このCをVBに書き換えて
できるかな!?

プログラム (sjis2euc.c)
unsigned int sjis2euc(unsigned int sjis)
{
unsigned int hib, lob;

hib = (sjis >> 8) & 0xff;
lob = sjis & 0xff;
hib -= (hib <= 0x9f) ? 0x71 : 0xb1;
hib = (hib << 1) + 1;
if (lob >= 0x9e) {
lob -= 0x7e;
hib++;
} else if (lob > 0x7f) lob -= 0x20;
else lob -= 0x1f;

hib |= 0x80;
lob |= 0x80;

return (hib << 8) | lob;
}

説明
シフトJISコードは Microsoft漢字コードともよばれ、現在のところ最も広く使用されている8ビット系
漢字コードであり、パソコン上の標準漢字コードでもある。
一方、EUCコードはUNIX上で広く使われている8ビット系漢字コードであり、JISコードの第1バイト、
第2バイトの両方に0x80を加算したものを使用する。
0022デフォルトの名無しさんNGNG
c2basic>21
0023デフォルトの名無しさんNGNG
VBにシフト演算ってあったっけ?符号無し整数も無かったような・・・
0024デフォルトの名無しさんNGNG
シフト演算ない・・・・・よね
0025デフォルトの名無しさんNGNG
BOCかどっかのOCXだかDLLだかにシフト演算の機能を提供してたかも
知れない。
でもそれなら変換処理自体をCで書いてDLL化した方がマシ。
0026デフォルトの名無しさんNGNG
シフト演算だけなら2のn乗を掛けたり割ったりでいいんじゃない?
オーバーフローとか負数の処理が面倒って言えば面倒か(汗
0027凸NGNG
シフト演算は掛け算割り算に置き換え
unsigned intはLongで代用
& 演算子は And 演算子に置き換え(そのままだと文字列連結←ヨクヤル)
| は Or、0xは&H
0028BeeNGNG
>>21
Private Function sjis2euc(sjis As Long) As Long
Dim hib As Long, lob As Long

hib = (sjis \ (2 ^ 8)) And &HFF
lob = sjis And &HFF

If (hib <= &H9F) Then
 hib = hib - &H71
Else
 hib = hib - &HB1
End If

hib = (hib * (2 ^ 1)) + 1

If (lob >= &H9E) Then
 lob = lob - &H7E
 hib = hib + 1
ElseIf (lob > &H7F) Then
 lob = lob - &H20
Else
lob = lob - &H1F
End If

hib = hib Or &H80
lob = lob Or &H80

sjis2euc = (hib * (2 ^ 8)) Or lob
End Function

どうかな?間違ってるかも。ていうか何故ですか?
0029デフォルトの名無しさんNGNG
EUCコードのhtmlファイルをVBで、生成するから。
いろんなコードを埋め込んでる。
他に、いい方法ってある?
0030デフォルトの名無しさんNGNG
>>29
俺なら NKF32.DLL とか使う
その方が確実だろ
0031デフォルトの名無しさんNGNG
「任意のファイルを関連付けされているアプリで印刷する」
これをVBでやるにはどんなコーディングすればいいですか
0032デフォルトの名無しさんNGNG
>>31
関連付けされてないファイル(DLL、EXEとか)はどうすんの?
関連付けられてるアプリが印刷機能持ってない場合も想定できるよね
WAVとかさ

印刷機能持ってたとしても、印刷方法はアプリによってまちまちでしょ
画一的にどうこうできる問題じゃないと思うね
まず前提の要求からしておかしいので仕様から見なおせ
003332NGNG
>31
ちなみに一番近い回答と思われるのは
「APIのShellExecute()を、引数lpVerbに"print"を指定して実行」
かな
印刷できるものに関しては印刷してくれるはずだ
0034元VB 現D使いNGNG
>>32
いやまずDLLやEXEファイル印刷しようとはだれも思わんでしょ。
ちょっとひねた見方しすぎ。

>>31
ShellExecuteでいいんじゃないかな?宣言はAPIビュワーで見てね。

Call ShellExecute(Form1.hwnd, "print", "Book1.xls", "", _
"C:\", 0)
003534NGNG
なんだカブった。スマソ。
結構やさしいじゃん。
0036VBManNGNG
リストビューコントロールで大きいアイコン表示をさせたとき
アイコンとテキストのわずかな隙間にクリックしてもアイコンが
アクティブにならない領域があるのですがこれは仕様ですか?
(テキスト囲むように出来る点線の上の部分あたり)

あるいは何かしらのプロパティの設定で回避できるものですか?
003732@同じく現D使いNGNG
>>35
いやこっちこそ連続カキコでスマソ
クライアントが「どんなファイルでも〜」って無茶言ってるなら
無理だって説明するための理由があった方がいいかなーと思って。
0038デフォルトの名無しさんNGNG
16進ダンプリストを印刷しちゃうのはちょっといやがらせかな。

ShellExecuteは"print"メソッドに対応してないのは普通に
開くだけだからまず安心。"open"もないのは何も起こらないし。

>>36
やってみたけど気になるほど開きはないけど?画面のプロパティ
のアイコンの間隔に影響されるのかな?
0039VBManNGNG
>38
エクスプローラとかだとその隙間はないんですよね。
だからマシンの設定とは関係ないかなと思ったんです。
わずか1px程度のラインなんだけど。
0040デフォルトの名無しさんNGNG
>>39
そこ押すほうが難しいと思われ
004131NGNG
>32、34
ありがとうです。
0042デフォルトの名無しさんNGNG
イメージコントロールで画像を表示するとき、
画像全体を表示するのではなく、画像の一部分だけ(例えば右下の部分だけ)表示するには
どうしたら良いのでしょうか。
0043デフォルトの名無しさんNGNG
>>42
イメージコントロールを2つ用意して、片方に画像全体を読みこむ
んで API の BitBlt で一部分だけ転送
004442NGNG
>>43
ありがとう。やってみます。
0045デフォルトの名無しさんNGNG
http://www.borland.co.jp/news/del6released.html
Delphi6>VS.NET
0046やる気なしNGNG
VBネタにしては珍しく?、まじめな書き込みばかりですね。
age
0047デフォルトの名無しさんNGNG
ビットブリット
0048 NGNG
イベントファイア
0049デフォルトの名無しさんNGNG
MsgBoxをプログラムから閉じる方法ってあります?
0050デフォルトの名無しさんNGNG
>>49
FindWindowまたはGetActiveWindowでウィンドウハンドルを取得し、
[Enter]キーを押すメッセージをPostMessageします。
0051デフォルトの名無しさんNGNG
http://www.zdnet.co.jp/news/0105/15/e_vb.html
0052凸NGNG
>>50
MsgBox出てる時はTimerも止まってるからなあ。
MsgBoxに似たフォームを作った方が早いと思われ。
005350NGNG
>>52
だよね
005450NGNG
だれか俺の替わりに答えてる・・・
0055デフォルトの名無しさんNGNG
>>54
わらた
0056閑話休題NGNG
http://www.zdnet.co.jp/news/0105/15/e_vb.html
VB使いとしてちょっと悲しい…(涙
0057>49NGNG
MsgBox の表示直前に timeSetEvent() API でコールバック関数を指定しておく。
でコールバック関数側で50さんの書いた処理を実行してやればオーケー。
これで「n秒後に自動で閉じるMsgBox」なんての作ったことがある。

でも面倒だから全然お勧めしない(笑
52 の方法がベストだと思うよ。
005850NGNG
>>57
VB5ならいいけど、VB6ってコールバックでこけない?
もうVBなんて終わりだよ
005957NGNG
>>58
俺の使ってる限りじゃ問題なかったけどなー
ひょっとしてSP4以降不具合出てるとか?
SP4が出る直前に前の職場辞めて、それ以降使ってないんだ

それにしても、ここVBスレなのにVB応援する意見少ないな(笑
悲しいとか終わりだとか、後ろ向きなのばっかりだ
0060超VB厨房NGNG
ドライブリストボックス→ディレクトリリストボックス
→ファイルリストボックスから選択したファイル
を拡張子の名前を変えて同じディレクトリにコピーする
のはどうやるんですか?

Dim DesFileName As String 'ファイルのコピー先
Dim SrcFileName As String 'ファイルのコピー元

SrcFileName = File1.Path & "\" & File1.FileName
DesFileName = File.Path & "\"  ???

FileCopy SrcFileName, DesFileName

で???の部分がわかりません。
コピー元の〜.INIファイルを同ディレクトリ内に〜.OLD
のように名前を変えてコピーしたいのですが…
0061デフォルトの名無しさんNGNG
記述された各プロシージャ間の関係をツリー形式に表示してくれる
ソフトって無いですか?
0062デフォルトの名無しさんNGNG
うちの会社でもVBの仕事なくなってきた。
0063デフォルトの名無しさんNGNG
>>61
作れ。まともな言語(笑)ならそこそこ出来るもんだぞ。

あとcだとctagsというソフトとviというエディタで
ツリーじゃないがハイパーリンク感覚を味わえるぞ。

あと再帰を使うとツリーは破綻する。


>>59
コールバックって出来るんですか。知らなかった。
Callback用になにか特殊な宣言とか有って
それを使うと安全に呼ばれるようになる、とかですか?
そのままだと結構無理があるように思うが。特にタイマー系は。

>>62
蛇足だけど、かわってナニが出てきたっすか?
まさか会社潰れそうとかいう意味じゃないよね?
0064デフォルトの名無しさんNGNG
>>63
gtags + htags 使うと、ホントにソースをハイパーリンクを含んだ HTML
に変換できる。
http://www.tamacom.com/global/

呼び出し系列を書き出すのは、C だと関数ポインタを使った時点で破
綻する他、C++, Java だと継承でも厳しくなる。そーゆーコードを追う
場合には、適当なところでデバッガに落としてスタックとレースを見る
のが常套手段だが、VB だと似たような手は使えないの?
0065D使いβNGNG
>>60
Delphiでは標準で拡張子を変える関数が付いてるから楽なんですけどね。
一応同名の関数を作ってみました。

Public Function ChangeFileExt(Filename As String, Ext As String) As String
 Dim l1 As Integer
 Dim l2 As Integer
 l1 = Len(Filename)
 l2 = InStr(1, Filename, ".")
 ChangeFileExt = Left(Filename, l1 - (l1 - l2)) & Ext
End Function

これで、
X = ChangeFileExt("C:\path\file.ini", "old")

ってすると、Xには"C:\path\file.old"が入る。だけどディレクトリの
相対指定"..\file.ini"だと上手くいかない。
0066D使いβNGNG
一番後ろのピリオド探すように変えてみた。
Public Function ChangeFileExt(Filename As String, Ext As String) As String
    Dim l1 As Integer
    Dim l2 As Integer
    Dim l3 As Integer
    l1 = Len(Filename)
    l3 = 1
    Do
        l2 = InStr(l3, Filename, ".")
        If l2 = 0 Then Exit Do
        l3 = l2 + 1
    Loop
    ChangeFileExt = Left(Filename, l1 - (l1 - l3 + 1)) & Ext
End Function
■ このスレッドは過去ログ倉庫に格納されています