VB.NET質問スレ(Part35)
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/09/14(火) 09:20:53VB.NET質問スレ(Part34)
http://hibari.2ch.net/test/read.cgi/tech/1270998481/
テンプレは >>2-4 あたり
0153デフォルトの名無しさん
2010/10/04(月) 15:19:37あ、すまん、textboxは、たしかに面倒だw
0154デフォルトの名無しさん
2010/10/04(月) 17:59:32手を動かして、実際に何かを学ぼうと思っていないだろう。
2chで適当な返答返しながら、どんぴしゃな答え、誰かがコード書いて貼ってくれるの待ってるんでしょ。
2chに来る割合をもう少し減らして、開発に時間割けば?
0155デフォルトの名無しさん
2010/10/04(月) 18:03:400156デフォルトの名無しさん
2010/10/04(月) 18:03:56少なくとも言われたことは試してると思うが?
0157デフォルトの名無しさん
2010/10/04(月) 18:04:460158デフォルトの名無しさん
2010/10/04(月) 20:15:26クライアント領域のサイズに比例させる必然性が何もないし、苦労してやっても
気持ちの悪いUIになるだけだよなあ。
昔のネオジオの格闘ゲームじゃないんだからさあ。
VS2010のエディタ部分なんかデバッグ時微妙にフォントサイズが変わるけど、
あれってちょっと気持ち悪いでしょ?
0159デフォルトの名無しさん
2010/10/04(月) 21:31:21やるで
おわったで
と出力されるにもかかわらずディレクトリが出来ません
どうやって調査すれば良いのでしょうか
System.Console.WriteLine("やるで")
Try
System.IO.Directory.CreateDirectory("d:\temp\トップ")
Catch ex As Exception
System.Console.WriteLine(ex.ToString())
System.Console.WriteLine("いきなりディレクトリつくれんです")
End Try
System.Console.WriteLine("おわったで")
0160159
2010/10/04(月) 21:45:33別プロジェクトでコードを作り直しても同じ結果になり悩んでたんですが
ウィンドウを閉じて再度表示させると治りました
エクスプローラのwindowが更新されないとか、
今まで経験したことがなかったのでちょっと驚き
ウィンドウを再表示後は、上の減少は再現しなくなりました・・
0161デフォルトの名無しさん
2010/10/05(火) 14:10:02のようなコードで
1秒間にどれだけ処理(ループ)できるか書いているのですが
妥当ですかね?
0162デフォルトの名無しさん
2010/10/05(火) 14:59:05そのコードだと、ループ内で行ってる処理の中ではたぶん
Console.WriteLineが一番重いので、Console.WriteLineの処理時間を計測してるだけ。
測りたい処理よりもコストのかかる処理をループ内に入れてしまうと何の意味もなくなる。
文字列連結や文字列比較の速度を調べたいのでなければ、
同じ理由で文字列の操作も避ける。GC.Collectも同様。
パフォーマンス計測にはStopwatchクラスを使う。
ループ開始前にStartして終了後にStop。最後に経過時間を出力。
一秒間にどれだけ処理できるか調べたいんだったら最後に一秒当たりに換算すればいい。
0163デフォルトの名無しさん
2010/10/05(火) 15:26:36そのものズバリ Stopwatch クラスですかありがとうございます。
何を計りたいかですが…
1〜15桁の文字列(パス)の生成に掛かる時間を、
調べたいと思っています。
0164デフォルトの名無しさん
2010/10/05(火) 21:26:04StringBuilderを使う
0165デフォルトの名無しさん
2010/10/05(火) 23:58:01実際は末尾の.がないURLに代わってリクエストされるんだけど
対処法おしえてください
0166デフォルトの名無しさん
2010/10/06(水) 00:40:09現状、TcpClientとかSocketとか使うしかないんじゃないかな
0167デフォルトの名無しさん
2010/10/06(水) 22:22:47何行目と指定してテキストを取り出したり、
同じように指定してその部分を置き換えたりしたいのですが、
できるとしたらどんな方法で出来るでしょうか?
0168デフォルトの名無しさん
2010/10/06(水) 22:32:28ファイルの行を置き換えたかったら全部消して書き直せばいい
0169デフォルトの名無しさん
2010/10/06(水) 23:03:49行数が多くて一行あたりの処理が簡単なため一気に何千行の処理を行うことになるのですが
そうなると1行ごとに全部を書き換えるというのは避けた方が良いですよね?
変数に読み込んで処理すれば良いのですが、メモリの占有が大きくなるのと
プログラムが予期しない終了の仕方をした時にせっかく途中まで処理したものが
どこにも記録が残っていないという状態になってしまうので、
ファイルをピンポイントで修正していきたいと思ったのですがそういうアクセスはあまり一般的ではないでしょうか?
0170デフォルトの名無しさん
2010/10/06(水) 23:12:24これ、他人が読んで意味が通じると思う?
0171デフォルトの名無しさん
2010/10/06(水) 23:26:350172デフォルトの名無しさん
2010/10/07(木) 04:43:550173デフォルトの名無しさん
2010/10/07(木) 04:49:23ってばかあっー!
0174デフォルトの名無しさん
2010/10/07(木) 07:49:52>ファイルをピンポイントで修正していきたいと思ったのですが
>そういうアクセスはあまり一般的ではないでしょうか?
一般的うんぬん以前に、ファイルの任意の位置にデータを挿入する事は出来ないので無理。
元々の一行の長さと、書き込もうとする一行の長さが同じなら、その場所だけ上書きすればよい。
一気に何千行も書きかえるなら、一行ずつランダムアクセスするとかえって遅くなるかもよ。
0175デフォルトの名無しさん
2010/10/07(木) 15:16:12StreamReaderで一行ずつ読みながらStreamWriterで平行して書き出せばいい
0176デフォルトの名無しさん
2010/10/07(木) 15:53:02OKWaveのほうにも質問していますが、TransparencyKeyでフォーム中身を透過させて、そのフォームを最大化、そしてまた元のサイズに戻すなど、
一定のサイズ変更操作をすると、フォームのタイトルバーなどがつかめなくなってしまいます。
サイズ変更もできなくなります。
本当に困っています。何か回避方法などをご存じの方がいましたら教えてください。お願いします。
http://okwave.jp/qa/q6233258.html
(マルチみたいで申し訳ないです)
0177デフォルトの名無しさん
2010/10/07(木) 17:59:500178デフォルトの名無しさん
2010/10/07(木) 18:06:110179176
2010/10/07(木) 18:24:20ソースも何も、フォームデザイナで、BackColoerとTransparencyKeyを同一にしただけです。
他の設定は一切いじらずとも、百発百中でなります、
VS2008でも、VB2010 Expressでも。
0180176
2010/10/07(木) 19:03:33こんな感じです。
最大化したっきり、上にあるフォームのタイトルバーがつかめない・・・。
0181デフォルトの名無しさん
2010/10/07(木) 20:04:570182デフォルトの名無しさん
2010/10/07(木) 20:19:18ちなみにWinXPじゃ問題は起きません。Vista以降で、aero有効時にのみ起きるようです。
0183デフォルトの名無しさん
2010/10/07(木) 20:21:500184デフォルトの名無しさん
2010/10/07(木) 20:58:570185デフォルトの名無しさん
2010/10/07(木) 21:12:23aeroがなければ上手くいくのになぁ。。。
0186デフォルトの名無しさん
2010/10/07(木) 21:25:35プロジェクトのプロパティニXPの視覚効果の有効、無効の設定があったと思うけどそれじゃだめ?
うちはvista無いから試せん
0187デフォルトの名無しさん
2010/10/07(木) 21:28:25そのチェック外しても、なんにも変わりませんでした。。。
0188デフォルトの名無しさん
2010/10/07(木) 21:32:13でも下記のコードにしたら固まらなくなったよ
private void Form1_Load(object sender, EventArgs e)
{
//大きさを適当に変更
this.Size = new Size(300, 300);
Bitmap bmp = new Bitmap(1, 1);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(Brushes.WhiteSmoke, g.VisibleClipBounds);
//透明にする色
Color transColor = bmp.GetPixel(0, 0);
//画像を透明にする
bmp.MakeTransparent(transColor);
//背景画像を指定する
this.BackgroundImage = bmp;
//背景色を指定する
this.BackColor = transColor;
//透明を指定する
this.TransparencyKey = transColor;
this.TopMost = true;
}
0189デフォルトの名無しさん
2010/10/07(木) 21:33:20OnSizeChangedで前回のWindowStateと違ってればRecreateHandleとか乱暴なことでもする?
0190デフォルトの名無しさん
2010/10/07(木) 21:57:55タイトルバーも境界もどっちも掴めません。。。
>>188
つまり画像を挟むってことですかね?
いまdsiから書き込んでるので、明日VB的文法に翻訳してみたいとおもいます。
0191デフォルトの名無しさん
2010/10/07(木) 22:58:270192デフォルトの名無しさん
2010/10/07(木) 23:30:45仕事はVB.NETで趣味アプリはC#でやってて
今、家だからPCにはC#しか入ってないんだよw
0193デフォルトの名無しさん
2010/10/08(金) 05:47:58ここは何スレだっつの
0194デフォルトの名無しさん
2010/10/08(金) 11:59:10めんどいだろJK
0195デフォルトの名無しさん
2010/10/08(金) 13:45:25VB2010でVBの勉強をしているのですが、
ボタンを押すことによってテキストボックスに入力されている文字をテキストファイルに出力したいのですが
以下のコードではうまくいきません
Dim Writer As New IO.StreamWriter("C:\vb.txt")
Writer.WriteLine(TextBox1.Text)
Writer.Close()
デバッグしてもエラーは出ないし、ボタンを押しても何も起きない状況です
どなたかご教示お願いします
0196デフォルトの名無しさん
2010/10/08(金) 14:02:16http://dobon.net/vb/dotnet/file/writefile.html
じゃだめなの?
0197デフォルトの名無しさん
2010/10/08(金) 14:21:48だめです。
GUIデザイナのプロパティからTranceparecyなどの設定を削除して、フォームリロード時にお示しのコードを実行するようにしましたが、
やはりタイトルバーなどがつかめない状態になりました・・・。
0198デフォルトの名無しさん
2010/10/08(金) 14:29:13>>189じゃダメ?
0199デフォルトの名無しさん
2010/10/08(金) 14:41:21>>189をやると、正常になりますが、最大化したときだけじゃなく、
普通にサイズ変更しただけでもなる場合があるので、いくらかは問題は軽減しますが、全解決とはなりません・・・。
0200デフォルトの名無しさん
2010/10/08(金) 14:43:480201デフォルトの名無しさん
2010/10/08(金) 14:44:46瞬間にチカチカするのは代償と考えてあきらめるしかないですかね。
0202デフォルトの名無しさん
2010/10/08(金) 14:46:510203デフォルトの名無しさん
2010/10/08(金) 14:49:13まぁ、設定で、おかしくなる人ようの設定かなんかをもうけてもいいですし、その辺は臨機応変にやろうと思います。
0204デフォルトの名無しさん
2010/10/08(金) 14:50:17全部うそだよw
0205デフォルトの名無しさん
2010/10/08(金) 14:50:35ファイル名にコロンや垂直タブって無理じゃね?
0206デフォルトの名無しさん
2010/10/08(金) 14:51:31これでできました。ありがとうございました!
0207デフォルトの名無しさん
2010/10/08(金) 14:57:08何とか例の現象は解決(?)いたしました。
リサイズができなくなったときのために一応つけておいたステータスバーも取り払うことができ、
当初意図していたとおりのソフトができそうです。
皆様、アドバイス等ありがとうございました。
0208デフォルトの名無しさん
2010/10/09(土) 23:22:31Next
の中でiを1から100の間で戻したり進めたりするのは何も問題ないでしょうか?
0209デフォルトの名無しさん
2010/10/09(土) 23:25:120210デフォルトの名無しさん
2010/10/09(土) 23:49:26使わないのがいいと思う
0211デフォルトの名無しさん
2010/10/10(日) 22:41:57トンクス
0212デフォルトの名無しさん
2010/10/14(木) 11:32:35プログラミング用語の『スロー』ってどういう意味?(”投げる”とか答える人はまだ地球人)
なんか、こう、イメージの掴める解説ってないのかね
0213デフォルトの名無しさん
2010/10/14(木) 12:34:300214デフォルトの名無しさん
2010/10/14(木) 13:07:36その際のスペースカプセルが例外
0215デフォルトの名無しさん
2010/10/14(木) 15:43:350216デフォルトの名無しさん
2010/10/14(木) 16:20:310217デフォルトの名無しさん
2010/10/14(木) 22:36:51↑こんな感じでどう?
即席で作ってみたけど
0218デフォルトの名無しさん
2010/10/15(金) 01:19:03どこがまずいかご教授お願いします。
必要なファイルは事前に C:\Windows\system32\spool\DRIVERS\W32X86 にコピー済みで、
ファイルをフルパスで指定しても同じ結果になります。
Public Shared Function DriverInstall(ByVal strDriverName As String) As Boolean
Dim di As New DRIVER_INFO_3
With di
.cVersion = 3
.pConfigFile = "ps5ui.dll"
.pDataFile = strDriverName & ".ppd"
.pDependentFiles = "pscript.ntf" & vbNullChar _
& "pscript.hlp" & vbNullChar _
& "ps5ui.dll" & vbNullChar _
& strDriverName & ".ppd" & vbNullChar _
& "pscript5.dll"
.pDriverPath = "pscript5.dll"
.pEnvironment = "Windows NT x86"
.pHelpFile = "pscript5.hlp"
.pMonitorName = String.Empty
.pName = strDriverName
.pDefaultDataType = "RAW"
End With
If AddPrinterDriver(String.Empty, 3, di) = 0 Then
Dim ExcptWin32 As New Win32Exception(Marshal.GetLastWin32Error())
MessageBox.Show(ExcptWin32.Message, "Win32Err", MessageBoxButtons.OK)
Return False
End If
Return True
End Function
0219デフォルトの名無しさん
2010/10/15(金) 01:26:27AddPrinterDriverW を AddPrinterDriverA に変えると、エラーメッセージは「パラメータが間違っています」になります。
Private Declare Function AddPrinterDriver Lib "winspool.drv" Alias "AddPrinterDriverW" _
(ByVal pName As String, _
ByVal Level As Integer, _
ByRef pDriverInfo As DRIVER_INFO_3) As Integer
Public Structure DRIVER_INFO_3
Public cVersion As Long
Public pName As String
Public pEnvironment As String
Public pDriverPath As String
Public pDataFile As String
Public pConfigFile As String
Public pHelpFile As String
Public pDependentFiles As String
Public pMonitorName As String
Public pDefaultDataType As String
End Structure
0220デフォルトの名無しさん
2010/10/17(日) 00:05:450221デフォルトの名無しさん
2010/10/20(水) 16:20:400222デフォルトの名無しさん
2010/10/21(木) 01:16:550223デフォルトの名無しさん
2010/10/21(木) 11:05:07Imports System.Runtime.CompilerServices
Module StringExtensions
<Extension()> _
Public Sub Print(ByVal aString As String)
Console.WriteLine(aString)
End Sub
End Module
同じ要領でenumでも出来るはず、やってみて。
0224デフォルトの名無しさん
2010/10/21(木) 23:34:28なるほど、試してみる
0225デフォルトの名無しさん
2010/10/26(火) 20:28:20この場合バージョン管理ももれなく付いてくるの?
アセンブリバージョン上げたら呼び出し側でエラーが出るんだけど…
対処法としてはバージョン固定にするか、GACに登録してバージョンリダイレクトさせるかって事でOK?
0226デフォルトの名無しさん
2010/10/26(火) 21:57:25>対処法としてはバージョン固定にするか、GACに登録してバージョンリダイレクトさせるかって事でOK?
もしくはconfigファイルでバージョンリダイレクト。
もしくは全ビルド。
0227デフォルトの名無しさん
2010/10/26(火) 21:58:25実はあんまり意味ないよね。
0228デフォルトの名無しさん
2010/10/27(水) 00:18:19これは"呼び出し側exe.config"にバージョンポリシーを記述して配置するイメージですよね?
>実はあんまり意味ないよね。
えw
0229デフォルトの名無しさん
2010/10/27(水) 18:23:08横2列のcsvを二次配列に入れるプログラムが作れません。
field()でテキストをReadlineして
field-Aに二次配列で入れるループを書いてます。
untilのループ内に変数Xを利用すると下記のエラーが出ます
「Exception.InnerException を参照してください。エラー: オブジェクト参照がオブジェクト インスタンスに設定されていません。」
Dim field() As String
Dim field-A(,) As String
Dim reader As New System.IO.StreamReader("field.csv", System.Text.Encoding.Default)
Dim X As Integer
X = 0
Do Until reader.EndOfStream
line = reader.ReadLine()
field = line.Split(",")
field-A = Nothing
field-A(X, 0) = field(0)
field-A(X, 1) = field(1)
X = X + 1
Loop
csvの中身
フィールドA-01,フィールドB-01
フィールドA-02,フィールドB-02
フィールドA-03,フィールドB-03
0230デフォルトの名無しさん
2010/10/27(水) 18:25:30・他にもっと簡単な方法があると思うが浮かばない
・変数Xのuntil内での使い方がおかしいorスコープがおかしいが、原因がわからない
(UNTIL内でX=0とするとエラーが起きないんですがループでリセットするわけにはいかない)
上記2点、わかる方いらっしゃいますでしょうか?
宜しくお願いします。
0231デフォルトの名無しさん
2010/10/27(水) 19:05:03>field-A(X,0)の行でどうもエラーが出るようです。
field-Aを使用する前(Do Loopの前)にあらかじめ2次元配列を作成する
field-A = New String(2, 1) {}
>他にもっと簡単な方法
2次元配列使わないでいいのならListとか使ったほうが楽
>変数Xのuntil内での使い方がおかしいorスコープがおかしい
どうおかしいのか分からない
0232デフォルトの名無しさん
2010/10/27(水) 19:10:21オブジェクト参照がオブジェクト インスタンスに設定されていません。
というエラーが出てフォームも立ち上がらない状態です。
untilの外側で宣言したXがインスタンスオブジェクトと認識されてるとかなんとか
そこまでしか情報がわかりませんでした。
Nothingで解決かと思ったら解決せず。
0233デフォルトの名無しさん
2010/10/27(水) 20:33:20確保するコードを追加しよう。
だけど、行数わかる?ファイル読み込まないと分からないよな?
つまりこの処理に配列は合わない。
随時メモリを拡張してくれるListの方が適切
0234デフォルトの名無しさん
2010/10/27(水) 21:14:070235デフォルトの名無しさん
2010/10/27(水) 21:22:19>えw
あんまり役に立つ場面てないよね、に言いかえよう。
0236デフォルトの名無しさん
2010/10/27(水) 21:43:46ありがとうございます!
配列の最大数を宣言しないとだめなんですね。
Dim field-A(10,2) As String
と数値を入れて宣言したら思い通り動作しました。
それからListが良いということですので使ってみます。
全て解決です。皆さんありがとうございました。
0237デフォルトの名無しさん
2010/10/28(木) 01:54:46配列が向かないのはまあ同意するが
たまには ReDim Preserve の事も...いや、思い出さなくてもいいか
0238デフォルトの名無しさん
2010/10/28(木) 08:22:50msdnによると
ttp://msdn.microsoft.com/ja-jp/library/w8k3cys2(VS.80).aspx
>Preserve を使った初期化。Preserve 修飾子を指定した場合、Visual Basic では、
>既存の配列から新しい配列に要素がコピーされます。
とあるから、結局はコピー、つまり遅いんでしょ?
0239デフォルトの名無しさん
2010/10/28(木) 10:38:43List(Of T)は容量があふれるたびに内部の配列のサイズが2倍になる
同じことを自分でやってもいいけど時間の無駄
0240デフォルトの名無しさん
2010/10/28(木) 12:49:22VB6では桁違いに速い。
0241デフォルトの名無しさん
2010/10/28(木) 19:46:52VB6は内部でListみたいなことをやってるだけ
0242デフォルトの名無しさん
2010/10/28(木) 20:48:49実はその辺自信無くて試したんだけど、10倍ぐらい違ったからそうだろって…
0243デフォルトの名無しさん
2010/10/28(木) 20:52:08なんか物凄く馬鹿っぽいご意見ですいこと....
0244デフォルトの名無しさん
2010/10/28(木) 21:09:43List(Of T)は再割り当て時には現在の倍の容量を確保して新しい領域に現在の要素をすべてコピーする
要素が追加されるたびに再割り当てというような馬鹿なことはしない
0245デフォルトの名無しさん
2010/10/28(木) 22:17:260246242
2010/10/28(木) 23:27:06確かに要素数の増加に伴って拡張に必要な時間が増えますね・・・
にしても.net遅すぎる気が・・・
.netはinteger、VBA(VBが手元に無い為)はlongの一次元配列で、
要素数を0から350000まで1づつ増やすコードをそれぞれで実行した結果、
書くのも恥ずかしいぐらいの差がついちゃいました。
コード間違えたかなぁ・・・
0247デフォルトの名無しさん
2010/10/28(木) 23:45:54ループの中でRedim Preserveしたりするバカが多いから変な最適化してるんじゃないの
0248デフォルトの名無しさん
2010/10/30(土) 00:48:22.NETの場合はメモリ管理上確実に再確保とコピーが必要。
0249デフォルトの名無しさん
2010/10/31(日) 01:26:31変数に代入したいと思っています
Dim BBB As Byte
Dim III As Integer
という宣言で、BBBに「10」と入っている時に、IIIにどうにかして「16」と、10進数に
変換した結果を代入させたいと思っているのですが、どうしたらよいのでしょう?
III = CInt(BBB)とかIII = ToInt16(BBB)とかやってみたのですが、うまくいかず…
ToInt16とかを実行するために、2バイトのバイト列とかにしないとダメなのでしょうか?
0250デフォルトの名無しさん
2010/10/31(日) 01:38:32III=BBB
0251デフォルトの名無しさん
2010/10/31(日) 01:46:55それは何度も試しててムリぽ…と思ってもう一度やってみたら、できました…
ありがとうございました
何でできないって思ったんだろ?
もう寝ます…
0252デフォルトの名無しさん
2010/10/31(日) 07:39:59できなくね?
何か勘違いしてると思われ
16進数というのは16進数表記の事で、中身の数値じゃないよ。
5という数値を表す場合、"5"、"�X"、"五"、"○○○○○"、
といろいろあるが、そのひとつが16進数で、どれもStringで表現される。
III = Convert.ToInt32("10", 16)
が正解。
>III = CInt(BBB)とかIII = ToInt16(BBB)とかやってみたのですが、うまくいかず…
ToInt16の16は16bit整数型(Short)で16進数という意味は無いよ。
■ このスレッドは過去ログ倉庫に格納されています