VB.NET質問スレ (Part20 ..
[2ch|▼Menu]
113:デフォルトの名無しさん
07/03/14 21:47:44
10万行くらいあるテキストファイル(1行100文字前後)の最後の100行を
読みたいのだけれどもっとも高速な方法を教えてくれ。


114:デフォルトの名無しさん
07/03/14 22:01:17
頭から読むしかない。

文字列配列を要素100個分用意して放り込んでいき、
最後まで埋まったら頭から上書きしていく。

115:デフォルトの名無しさん
07/03/14 22:07:49
>114
>頭から読むしかない。
げげ、ほんまかいな。困った。
じゃあ、逆にファイルを書き出すときに末尾に追加するのではなくて、
先頭に行を追加することはできるかい?それが出来れば
読むときは頭から100行読めばいいので。どう?

116:デフォルトの名無しさん
07/03/14 22:12:02
そんな馬鹿なw
天然無脳(つまり114のことだが)だって1万ページある本の最後の1000行を
書き出すのに巻頭から全部目を通さないだろう

117:デフォルトの名無しさん
07/03/14 22:21:19
>116
その方法を教えてくれ。たのむ。

118:デフォルトの名無しさん
07/03/14 22:25:14
ケツからファイルポインタをデクリメントしていって1000個目の改行コード探すだけじゃん。
そこから先は普通にテキストとして読めばいい。

119:デフォルトの名無しさん
07/03/14 22:32:41
>118
サンプルコードを教えてくれ。たのむ。俺は、ファイルポインタなんて
使った経験がない。
StreamReaderでファイルを開いてReadLine() で一行ずつなら読める。

120:デフォルトの名無しさん
07/03/14 22:35:27
氏ねよ

121:デフォルトの名無しさん
07/03/14 22:39:37
>>119
FileStreamクラスを使うんじゃよ

122:デフォルトの名無しさん
07/03/14 22:43:56
>>113
>>119ってもしかしてテキストファイルなら、TextBox系でLoadFileしておいてTextを
String変数に代入してLength目から逆追いするってのと同じじゃないだろうか。
それなら直ぐ書けるのじゃないだろうか。
って俺はとてもヒマないからやってはあげはしないがw

123:デフォルトの名無しさん
07/03/14 22:45:37
あ、ただTextBoxBaseは最大文字数に制限あったっけ??

124:デフォルトの名無しさん
07/03/14 22:49:38
>>122,123は論外

125:デフォルトの名無しさん
07/03/14 23:18:39
プログラム始めてから数ヶ月の俺にも出来たぜw

126:デフォルトの名無しさん
07/03/14 23:24:16
>125
それを俺に教えてくれ。たのむ。

127:デフォルトの名無しさん
07/03/14 23:36:37
>>126
Dim a As New IO.FileStream("C:\a.txt", IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)
Dim count As Integer
Dim Bytes(a.Length - 1) As Byte
For I As Integer = a.Length - 2 To 0 Step -1
 a.Position = I
 If a.ReadByte() = 13 And a.ReadByte() = 10 Then
  count += 1
  If count = 1000 Then
   a.Read(Bytes, 0, a.Length - I)
   TextBox1.Text = System.Text.Encoding.GetEncoding("Shift-jis").GetString(Bytes)
   Exit For
  End If
 End If
Next
a.Close()

エンコードはシフトJIS
勘で作ったから保障はしないよ

128:デフォルトの名無しさん
07/03/14 23:44:13
色んな物がメチャクチャだなぁ

129:デフォルトの名無しさん
07/03/14 23:50:53
>Dim Bytes(a.Length - 1) As Byte
これで台無しだな

130:デフォルトの名無しさん
07/03/14 23:58:43
>>126
だからFileStreamクラスを調べろっつってんだろがボケ!!!

でもSeekとかPositionの性能が本当に良いかどうかは知らんよ。

131:デフォルトの名無しさん
07/03/15 00:01:41
>127
おおーーー、超サンキュウ!
さっそく試してみるわ。
>130
>ボケ
だから質問してるんだよ。俺に優しく教えろ!

132:デフォルトの名無しさん
07/03/15 00:06:09
だから悩んだり試したりする前にMSDNに目を通せと(ry

133:デフォルトの名無しさん
07/03/15 01:02:05
>>130はツンデレ

134:デフォルトの名無しさん
07/03/15 05:04:45
フォーム上にお絵かきするソフトで下記の例外がまれに発生するんだけど、
なんのことやらさっぱり分からん。

「InvalidOperationException:バッファ操作が現在進行中であるため、BufferedGraphicsContext を消去できません」

作り方が悪いのか?
どういう場合に発生する例外なのか、VBプロフェッショナル達よ、教えてくれ。




135:デフォルトの名無しさん
07/03/15 08:09:55
頭が悪いんだよ、きっと。
いや、確実に。

作り方が悪いのか?、だと?
お前さん以外にそういうトラブルを申し立てている人間がいるのかよw

136:デフォルトの名無しさん
07/03/15 08:15:47
>>127
そいつのベンチマークが見たいな。


137:デフォルトの名無しさん
07/03/15 09:51:10
>>125 こんなのでどうか

Public Function ReadTailLines(ByVal filename As String, ByVal lineCount As Integer)
  Dim sep() As String = {vbCrLf}

  Using ifs As IO.FileStream = IO.File.OpenRead(filename)
    Dim allBuf As New List(Of Byte)
    Dim len As Integer = lineCount * 100
    Dim pos As Long = ifs.Length
    Dim lines() As String

    Do
      pos -= len
      If pos < 0 Then
        len += pos
        pos = 0
      End If

      Dim tmpBuf(len) As Byte
      ifs.Seek(pos, IO.SeekOrigin.Begin)
      ifs.Read(tmpBuf, 0, len)

      allBuf.InsertRange(0, tmpBuf)
      lines = Text.Encoding.Default.GetString(allBuf.ToArray(), 0, allBuf.Count).Split(sep, StringSplitOptions.None)
    Loop While pos > 0 And lines.Length < lineCount
(続く)

138:デフォルトの名無しさん
07/03/15 09:52:07
    If lines.Length <= lineCount Then
      Return lines
    Else
      Dim ret(lineCount - 1) As String
      Array.Copy(lines, lines.Length - lineCount, ret, 0, lineCount)

      Return ret
    End If
  End Using
End Function

初めてVB.NETでプログラム組んだのでちょいと汚いがな

139:137
07/03/15 09:52:57
>>113 の間違いだ。すまん

140:デフォルトの名無しさん
07/03/15 12:22:10
>>134
どんな時にその例外が投げられるかはMSDN見れ。

なんで、もしくはどこで、出てるのかは
お前さんにしかわからない。

とりあえずコード上での発生箇所を探るしかないとおもう

141:デフォルトの名無しさん
07/03/15 12:26:42
例外発生ネタは発生個所を晒してもらわないことには回答のしようがないんだよな

142:デフォルトの名無しさん
07/03/15 12:50:39
134だけど、例外の発生箇所は下記のとおりだよ。

場所 System.Drawing.BufferedGraphicsContext.Dispose(Boolean disposing)
場所 System.Drawing.BufferedGraphicsContext.Dispose()
場所 System.Drawing.BufferedGraphicsContext.AllocBufferInTempManager(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle)
場所 System.Drawing.BufferedGraphicsContext.AllocBuffer(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle)
場所 System.Drawing.BufferedGraphicsContext.Allocate(IntPtr targetDC, Rectangle targetRectangle)
場所 System.Windows.Forms.Control.WmPaint(Message& m)
場所 System.Windows.Forms.Control.WndProc(Message& m)
場所 System.Windows.Forms.ButtonBase.WndProc(Message& m)
場所 System.Windows.Forms.Button.WndProc(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

自分の作ったコード内ではないので、困ってるんだよ。


143:デフォルトの名無しさん
07/03/15 12:54:43
そんな内部のことはどうでもいいから最後に実行された自分のコードを確認してくれ

144:デフォルトの名無しさん
07/03/15 13:56:01
>>142
> 自分の作ったコード内ではないので、困ってるんだよ。 
俺たちも自分の作ったコード内じゃないことの上にソースすらないからどうしようもないんよ(・ω・)

145:デフォルトの名無しさん
07/03/15 14:14:50
>>144
ソースがないと直しようがないじゃないか・・・

なんか ちらつき防止のダブルバッファの使い方を
間違えたんじゃないかと思うんだが?

どうなの、詳しい人?

それと、思い出したんだが.VisualStudioに逆アセンブラがついてた気がする。
難読化されていなかったらソース解析できる可能性があるよ。

146:デフォルトの名無しさん
07/03/15 14:16:38
ごめん>>144>>142が同一人物だと勘違いした。OTZ

147:デフォルトの名無しさん
07/03/15 14:49:56
>137
誰かこれをVB.NET2003に翻訳してくれ。たのむ。


148:デフォルトの名無しさん
07/03/15 16:47:19
VB.netを使って、サーバーやサイト上のデータ(htmlとかtxtとか)をダウンロードし、
PC内にためこんでデータベース化するソフトを作りたいんですが、
どういう機能を使えばいいのかわかりません。
どういう機能を使えばweb上のデータをDLできるのでしょうか?ADO?ASP?
また、それを学ぶのにお勧めの本などありましたら教えていただけると幸いです<(_ _)>


149:デフォルトの名無しさん
07/03/15 18:12:11
>>148
MSDN

150:デフォルトの名無しさん
07/03/15 18:43:47
VB.NETで作成したEXEファイルを自動的に配布するツールとかないですかね?
クライアントはIEが前提で

ノータッチデプロイメントでいいやって思ってたら、社外からのインターネットアクセスはTAMってやつが邪魔するのよ

151:デフォルトの名無しさん
07/03/15 19:00:29
んーーーーーいろいろ考えたけど
IISにローカルのEXEファイルとサーバサイドのファイル更新日時比較するスクリプト仕込んだポータルサイトを置いといて
そのスクリプトでFTPダウンロードする方式しか思いつかんな
でもかっこ悪いよなこんなやり方
セキュリティ警告のダイアログがウザそうだし

152:デフォルトの名無しさん
07/03/15 19:11:05
フロッピーで郵送

153:デフォルトの名無しさん
07/03/16 00:00:19
if x < 1e10 then
って書いたら、勝手に
if x < 10000000000 then
ってなるのだが、ゼロが並んでいると分かりにくいので、1e10のまま
にしたいのだが、方法はあるか?

154:デフォルトの名無しさん
07/03/16 00:22:53
VBって16進も勝手に整形するよね。もうアホかと。

Const tenBillion as Integer = 1000000000

とか、

if x < 10^10 then

ぐらいか、手の打ち所は?

155:デフォルトの名無しさん
07/03/16 00:31:47
>>153自動整形機能を切るのはダメ?

156:デフォルトの名無しさん
07/03/16 00:40:54
Int64.Parse( "1e+10", NumberStyles.AllowExponent )

ww

157:デフォルトの名無しさん
07/03/16 00:49:55
>>137
それだと、lines.Length=lineCountのとき、戻り値の最初の行が途中からにならないか。

158:デフォルトの名無しさん
07/03/16 04:51:37
134だよ。

ソースを提示したいけど、サイズがでか過ぎてムリだよ。
ミニマムコードを示せればいいんだけど。。。

とりあえず、情報を探してみたけど、
URLリンク(forums.microsoft.com)
URLリンク(www.codeproject.com)

似た現象はあるようだけど、解決策はかいてなかった。
下のは、Graphics.Flushを呼べと書いてあるけど、効果は不明。

う〜ん、はまった。。。



159:デフォルトの名無しさん
07/03/16 10:09:26
VB.NET2003でソフトを動作させていると
IOExceptionが発生し、内容は
このコマンドを処理するのに必要な記憶域をサーバーで確保できません

こんなエラーが時々出る様子

やっている処理は以下のようなもの(普通にありえないんだが別会社のソフトの関係で仕方なくこうなっている)
OSはすべてXPのSP2
ウィルスバスターインスコ済み

一定間隔(処理完了から次の処理開始までが10秒ほど)
PC2〜10からPC1にある大量のファイル(10000ほどある時もある)を全てなめて計算しているんだが
このときに出ている模様

で、検索してみるとサービスで使用しているスタック領域が不足しているので(XPのデフォは15)、これを現在の値から引き上げてやる模様
これが不足する理由ってのがよくわからないけど、他の人は単純に20とか30にまで引き上げてやれば解決しているみたい

外部から共有フォルダに接続してガリガリ読み込むと単純にネットワークサービスが使うメモリが不足するって事なのかな?
あと、これは・・・PC1に対して行うのかPC2〜10に対して行うんだろうか・・・
PC1だとは思うけどレジストリなのでおいそれと変えたくない予感

もし、何か知ってる人居たら教えてくれないか?

160:デフォルトの名無しさん
07/03/16 10:42:42
>>159
その質問に答えられるのはエスパーかペテン師ぐらいだろう。
VB.NET2003でどんなソフトを作ってんのよ。WinFormアプリかサービスか、
通信は共有フォルダなのか独自にやってるのかはっきりしろ。

161:デフォルトの名無しさん
07/03/16 10:54:54
>>160
ごめ、説明不足

WinFormアプリで
PC1の共有フォルダを介してPC1のファイルを
PC2〜10のWinFormアプリ各々がチェックしに行ってる状態

PC1のレジストリにはIRPStackSizeの項目は設定されていない
また、パフォーマンスの詳細設定で
パフォーマンスの優先はプログラム
メモリ使用量はプログラム
なぜか仮想メモリは370〜700固定

IRPStackSizeの変更後の値をネットで調べると15が多いようだが
マージンとってそれよりも大きな値(20〜30とか)に設定しても大丈夫なのかな?
出来れば設定値の基準値が知りたいところではあるけれど・・・

また、PC1では基本的に操作しないのでパフォーマンス設定も
サーバOSのデフォのように変えてやったほうがいいんだろうか?

PC1の大まかなスペックはP4 2.8Gでメモリ512M

ん〜・・・説明へたでゴメ


162:デフォルトの名無しさん
07/03/16 11:00:38
>>148
Webサービスでがんばれ

163:デフォルトの名無しさん
07/03/16 12:45:40
TextBoxのMaxLengthプロパティってディフォルトで32767文字もあるけれど、
10文字で十分なのだけれど、この値が大きくても小さくても、プログラム
起動してタスクマネジャでメモリ使用量比べても、余り違わないのだけれど、
これはどういうこと?1000個のTextBoxでテストしてみたが良く分からない。

164:デフォルトの名無しさん
07/03/16 12:48:18
入力を制限しているだけでそれ以上の意味はない

165:デフォルトの名無しさん
07/03/16 12:55:23
>164
知らんかった。39!

166:デフォルトの名無しさん
07/03/16 13:41:02
馬鹿のイメージでは、メモリアロケーションしてるんかい?
きょうびの高級言語、そんなにせこせこしてねーよ。

167:デフォルトの名無しさん
07/03/16 15:04:28
意味が分からない

168:デフォルトの名無しさん
07/03/16 19:06:31
質問、Excelなんかが公開してるCOMオートメーションをVB.NETから使う時なんですが。
Excel側のイベントでチェックボックスのチェック状態を変更すると、以下の例外が出ます。

 System.Reflection.TargetInvocationException' の初回例外が mscorlib.dll で発生しました。

COMのイベント内で自アプリのフォーム上のコントロールなんかを操作ってどうやったらいいでしょう。
とりあえずExcel側で新しいブックが作成された時のイベント(NewWorkbook)を使ってみたサンプルが
以下です。

Public Class Form1
  Private WithEvents m_objExcel As Excel.Application

  Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    m_objExcel = New Excel.Application
    m_objExcel.Visible = True

    CheckBox1.Checked = False
  End Sub

  Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    m_objExcel = Nothing
  End Sub

  Private Sub m_objExcel_NewWorkbook(ByVal Wb As Excel.Workbook) Handles m_objExcel.NewWorkbook
    CheckBox1.Focus()
    CheckBox1.Checked = True
  End Sub
End Class

VB6だと動きますが、やっぱりVB.NETだとお作法が違いますよね

169:デフォルトの名無しさん
07/03/16 20:19:54
ワロタ

170:デフォルトの名無しさん
07/03/17 21:18:29
おまえらって賢いな

171:168
07/03/18 01:11:07
解決しました

.NET Fremawork1.1のC#しか扱ったことなかったのですが、2.0以降ではサブスレッドから
Windowのコントロールにアクセスすると例外が起こるんですね。
1.1の時はたまたま動いていたと。 orz

ちなみにInvoke()呼び出しと、m_objExcelの操作をサブスレッドで実行するように変更したら
動くようになりました。

めったに.NETのC#もVBも使わないんで結構忘れますね。
あと書き忘れてましたが VisualStudio2005使ってます。(最近買いました)

172:デフォルトの名無しさん
07/03/18 01:19:03
>>171
ついでにCOM相互運用とかも見とくといいんでない?

173:デフォルトの名無しさん
07/03/18 01:22:41
URLリンク(jeanne.wankuma.com)
こんな開放ってやっぱり必要なの?

174:デフォルトの名無しさん
07/03/18 01:25:39
自分しか使わないもんなら不要。
それで困らなければ不要。
立ち上げてすぐ落とすようなもんなら大抵不要。

そうでなければ必須。

175:デフォルトの名無しさん
07/03/18 01:26:36
>>174 thx

176:デフォルトの名無しさん
07/03/18 01:28:38
>>172
ちょうどHELPでそこ読みながらやってました
でも.NETメインじゃないんで熟読するの辛いですね

>>173
やらないとアプリ終了時に例外が出ますね
でも、やらなくてもCOMのローカルサーバーはちゃんと終了するんで
参照カウントはデクリメント(Release)されてるのかも

177:デフォルトの名無しさん
07/03/18 12:09:49
>>173
やっとかないアンマネージドリソースはフレームワークが勝手に開放するような仕組みもって無いんで解放できないんじゃ・・・?
というわけで仕方なくCOM使う場合は必ず使ってる

ただ、ラッパクラスAをさらにラップしたクラスB作ったら、Bの解放のタイミングでフレームワークがCOMオブジェクトリリースしてくれないかな?
とか淡い期待抱いてるけど


178:デフォルトの名無しさん
07/03/18 12:21:01
>>173
使うことが推奨だが、

>COM オブジェクトを扱う場合は、参照の解放を常に意識する必要があります。
>使用した COM オブジェクトの参照カウントが、正しくデクリメントされていないと「メモリ リーク」を起こします。 

は明らかな間違い。いい加減なおして欲しいよ。

179:デフォルトの名無しさん
07/03/18 12:35:03
>>178
何が間違ってんだ、とぼけたこと抜かしてんなよボケ

180:デフォルトの名無しさん
07/03/18 12:36:46
>>178
”メモリリーク”を何に直せばいいの?

181:デフォルトの名無しさん
07/03/18 13:03:03
微妙な問題ではあるが、MSDNフォーラムのこの話題が参考になりそう。
URLリンク(forums.microsoft.com)

COMの参照カウンタはRCWが管理している。
ReleaseComObjectはCOMの参照カウンタそのものではなくRCWの参照カウンタを管理するもの。
RCWの参照ポインタがゼロのなるかGCされればCOMの参照カウンタはデクリメントされる。
RCWはReleaseComObjectで開放すべきであり、GCによる開放はフェイルセーフ的なものと考えるべき。


182:デフォルトの名無しさん
07/03/18 13:30:27
>>180
>COM オブジェクトを扱う場合は、参照の解放を常に意識する必要があります。 
COM オブジェクトを扱う場合は、参照の解放を意識する必要があります。 
>使用した COM オブジェクトの参照カウントが、正しくデクリメントされていないと「メモリ リーク」を起こします。  
使用したRCWの参照カウントが正しくデクリメントされていないと期待するタイミングでCOM オブジェクトが開放されません。  


183:デフォルトの名無しさん
07/03/18 13:32:24
>>182
あらゆる意味で不完全燃焼だ

184:デフォルトの名無しさん
07/03/18 13:34:37
そんな文章の校正屋みたいなことして楽しいのかね。奇特な奴。
どうせ何か書くなら物事自分の頭でまとめた結果をアウトプットしろよ

185:デフォルトの名無しさん
07/03/18 13:49:41
そりゃま、「全部GCでOKww手動でやる奴は馬鹿!」とか書いたら爆釣りで完全燃焼だろうけどさw

186:デフォルトの名無しさん
07/03/18 14:21:11
>>184
校正って、間違ってんだろ

187:デフォルトの名無しさん
07/03/18 17:13:13
VB6時代のNothing論争に似てる。
Sub XX
  Dim Obj As New ActiveX.Hoge
  '  いろいろな処理
  Set Obj = Nothing
End Sub
最後のNothingがないとメモリーリークが起きると言い張るのが必ずいた。
実害はないから頭の悪いプログラマーには全部Nothingを付けされたほうが安全というのが結論だった。


188:デフォルトの名無しさん
07/03/18 17:18:16
参照にnullを代入したらその時点でGCが動くと信じてる奴は多そう
全く意味はないとMSDNには書いてあるが

189:デフォルトの名無しさん
07/03/18 17:19:20
dim a as new collection
set a=nothing
msgbox a.count

190:デフォルトの名無しさん
07/03/18 17:19:56
全く意味は無いというのは言いすぎだな
超極めて限定的に意味があるシーンもある
……それは意味がないのと同義か

191:デフォルトの名無しさん
07/03/18 17:20:00
アウトプロセスサーバなCOMでプロセス起動するようなやつだと
解放しないとプロセスが残るやん
メモリリークどころじゃないやん
その時点でアウトやん

192:デフォルトの名無しさん
07/03/18 17:22:07
>>190
循環参照とかにつかうんよ

>>191
参照カウントをデクリメントするのと、「解放」するのは全く別物

193:デフォルトの名無しさん
07/03/18 17:24:48
循環参照でもそれらが孤立してたらGCされるだろ

194:デフォルトの名無しさん
07/03/18 17:27:18
>>193
.NETはね
VBは参照カウントだから無理

195:デフォルトの名無しさん
07/03/18 17:39:01
以下VB6の話。スレ違いなのでこれくらいにしておく。
「別の処理」のときにObjを確実に終わらせいたいときはNothingの代入は意味がある。
Sub XX 
  Dim Obj As New ActiveX.Hoge 
  '  いろいろな処理 
  Set Obj = Nothing ' ここで参照が0になったら即開放される。ここはVB.NETと異なる。
 ' 別の処理
End Sub
Objはローカルに宣言された変数だからEnd Sub時点でObjは消失してNothingの代入相当の処理
つまり参照カウンタの減算は行われる。このため「別の処理」が存在しないときにNothingの代入は意味がない。

196:デフォルトの名無しさん
07/03/18 17:39:55
COM使うの止めればいいじゃん。特にサーバでは。

197:デフォルトの名無しさん
07/03/18 17:41:26
>>196
サーバー用途だとエンタープライズサービスがもろCOM+だからねぇ

198:デフォルトの名無しさん
07/03/18 23:17:22
しかし、これからはComは使わないだろ

FW1.1とかでAPI使わずにVB6のMSCOMM使ってる連中が多かったから
FW2.0でCOMM通信のコンポーネント追加したんだろう

DataGrid使いづらいからってMSFLEXGRID使ってた連中もいたし
それでDataGridView追加したんだろうけどなぁ…

すべてはCOMから移行していくんだよ全て

199:デフォルトの名無しさん
07/03/18 23:28:50
とはいえ、マイクロソフトの主要プロダクトはほとんどCOMじゃないか。

200:デフォルトの名無しさん
07/03/18 23:34:01
>>198
FWってFrameworkのことか?
普通はFxと略すが

201:デフォルトの名無しさん
07/03/18 23:37:47
Fxは.NET Framework 3.0(旧称WinFX)のことだと誤解されそう

202:デフォルトの名無しさん
07/03/18 23:39:29
>>200
うはw初めて知った。
それって公式な略称なんですか?

203:デフォルトの名無しさん
07/03/18 23:39:53
マイクロソフトの出す資料には.NET Fxと書いてある。

204:デフォルトの名無しさん
07/03/18 23:40:14
>>200
FXは俺も3.0とオモタw

そういえばみんなフレームワークなんて呼んでるんだろうな?
俺は普通にフレームワーク2.0とかの書き方なんだが略し方とかあるのか?
VisualStudio2005=VS2005みたいに


205:デフォルトの名無しさん
07/03/18 23:41:16
Clipboard.SetDataObject(Me.PictureBox.Image, True)
で、クリップボードにコピーしようとしたら、10回に8回くらいは、以下のエラーが出るんだけれど
何でかな?

System.Runtime.InteropServices.ExternalException: 要求されたクリップボード操作が失敗しました。
at System.Windows.Forms.Clipboard.SetDataObject(Object data, Boolean copy)


206:デフォルトの名無しさん
07/03/18 23:46:05
>>205
他所のアプリがクリップボードをロックしてる時にでもエラーになってんじゃね?

207:デフォルトの名無しさん
07/03/18 23:50:34
>206
サンキュウ。うーん、でもね、他のアプリは確かに沢山動いているけれど、
クリップボードをロックしているはずはないのだけれど。
例えば、このエラーが出たあとPaintを起動してクリップボード使っても
何も問題なく使える。うーん、おかしい。

208:デフォルトの名無しさん
07/03/18 23:53:12
その前後のプログラムのソース見ないといまいちわからんかもしれんなぁ・・・
なにやってんだ?
俺はクリップボード問題なさそうなんだが

209:デフォルトの名無しさん
07/03/19 00:05:22
プログラムはFormを3つ開いて、Form3のPictureBoxに絵を描いて
Buttonを押したらその絵をクリップボードにコピーするという簡単なもの。
このサンプルをそのまま使っている。
URLリンク(www.bcap.co.jp)
プログラムの中には、スレッドを使って別の処理を並行してやらせるようなルーチンも
あるのだけれどプログラム起動直後はそういうルーチンは全然実行していないので、
スレッドなどは関係ないと思う。

210:デフォルトの名無しさん
07/03/19 00:15:10
>>209
COM関連だよなInterRop
そうおもってググってみたら同じような質問があった

でうまくいったみたいだけど参考になるかな?

211:デフォルトの名無しさん
07/03/19 00:15:56
貼り忘れ 連投スマソ
URLリンク(piza.2ch.net)
//*********************
232 名前: 名無しさん♯ 投稿日: 2001/04/17(火) 17:21

>>230
COMのスレッドの問題よん。
ここを参考にしてちょ。

質問
URLリンク(discuss.develop.com)

回答 from Microsoft
URLリンク(discuss.develop.com)



233 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 00:39

>>231-232
ありがとうです。
using System.Threading; して
Thread.CurrentThread.ApartmentState = ApartmentState.STA;
をMainの一番初めに入れればいいんですよね。
この方法で試してみたけど、うまくいったりいかなかったり…。
で、今試したら100%うまくいくようです。
ちょっと謎ですが、たぶん大丈夫でしょう。
どうもありがとうございました。



212:デフォルトの名無しさん
07/03/19 01:00:10
普通はSTAThreadAttributeついてると思うんだけど、つけてないの?


213:デフォルトの名無しさん
07/03/19 01:01:36
>>207
そりゃ問題なく使えて当然。そんな長時間クリップボードをロックしっぱなしするようなことはフツーしない。

214:デフォルトの名無しさん
07/03/19 02:05:54
>211
サンキュウ。
Thread.CurrentThread.ApartmentState = ApartmentState.STA
っていうのを入れてみたが効果なし。
おかしい。

215:デフォルトの名無しさん
07/03/19 07:39:15
>>214
.NETのVersionはなに?.NETのVersionが2.0なら
>Thread.CurrentThread.ApartmentState = ApartmentState.STA 
は既にレガシーで機能しない。
メインスレッドは属性[STAThread]で指定し、それ以外のスレッドならスレッド開始前に
Thread.SetApartmentStateで初期化する必要がある。

それからPictureBoxはGUIコンポーネントだから、もしメインスレッド以外から
PictureBox.Imageを参照してるならおかしくなるのは当たり前だけどそこは大丈夫?

216:デフォルトの名無しさん
07/03/19 08:08:45
マイクロソフトはレガシーって呼ぶのか…。obsoleteとか言ってくんないとわからんw

217:デフォルトの名無しさん
07/03/19 08:37:32
>>215
もうだめだ .Image が .Invoke に見えた(orz

218:デフォルトの名無しさん
07/03/19 08:44:50
それは目がピンヴォケですね

219:デフォルトの名無しさん
07/03/19 09:05:56


220:デフォルトの名無しさん
07/03/19 10:06:46
Directoryクラスについて教えてください。

ヘルプに、
「Directory クラスの静的メソッドは、すべてのメソッドでセキュリティ チェックを実行します。
オブジェクトを何回か再利用する場合は、このようなセキュリティ チェックが必ずしも必要では
なくなるため、これらの静的メソッドの代わりに DirectoryInfo の対応するインスタンス メソッドを
使用することを検討してください」

とありますがこのセキュリティチェックというのは、Windows固有の機能でのチェックでしょうか、
それともウイルス対策ソフトにチェックをしてもらうということでしょうか?

このヘルプの意味するところは、「初回は必ずDirectoryクラスを使い、一度使ったフォルダは
すぐ次ではDirectoryInfoクラスを使うようにする」ことで、ウイルスチェックなどがしっかり掛かる
ということを意味しているのでしょうか?それともこれらのセキュリティチェックとは、いわゆる
コードアクセスセキュリティのようなもののことでしょうか?すみませんがよろしくお願いします。




221:デフォルトの名無しさん
07/03/19 10:09:02
また、逆に言うと、Directoryクラスを使わず、DirectoryInfoクラスだけを使ってしまうと
セキュリティチェックが掛からず、ウイルスに汚染されてしまう危険がある、といったことをも
意味するのでしょうか?これもあわせてお願いします。

222:デフォルトの名無しさん
07/03/19 10:13:30
CASの事だよ。
ウィルスとか関係ない。
DirectoryInfoでもチェックは入るが、
例えばインスタンス作成時だけチェックすれば済むとか、
そういう話だよ。

223:デフォルトの名無しさん
07/03/19 10:24:35
>>217

とりあえずもちつけ
落ち着いて理論的に考えていけばきっと解決できる問題だ!!


224:デフォルトの名無しさん
07/03/19 10:32:50
>>222
ありがとうございます。やはりコードアクセスセキュリティのことだったのですか、

>DirectoryInfoでもチェックは入るが、
>例えばインスタンス作成時だけチェックすれば済むとか

ということは、ヘルプの言ってることは、原則として、

 インスタンス作成時は Direvtoryクラスを使い、
 それ以降そのインスタンスの使用は DirevtoryInfoクラスを使ってください

と考えてよいということでしょうか?そしてみなさんもそういう原則を踏襲して
日々コードを作成しておられると考えてよいでしょうか?

225:デフォルトの名無しさん
07/03/19 10:44:13
>>224
どこをどう読めばそう曲解できるのか不思議だが、書いてあるとおりだよ。
CASにかかる時間が気になるほど回数呼ばないならどっちでもいいってことだ。

226:デフォルトの名無しさん
07/03/19 11:07:57
>>225
たびたびすみませんです。

まだよく理解できていないのですが、DirectoryInfoでもDirectoryでも、
CASに関しては同等なのでしょうか、それともやはり顕著に異なるのでしょうか?

もし同等なのであれば、どちらを使ってもよい、ということになりコード作成で
気にする必要がなくなってありがたいのですが、ヘルプではやはり異なるように
書かれてあるようにも感じられます。CASをやってくれるのがDirecotryだけであるなら、

1.たくさんの回数呼ばないのなら、すべて 「Direcotry」 で済ませてよい、

しかし

2.もし同じフォルダーをたくさん回数呼ぶようであれば、最初だけはDirectoryを
  使って、あとは DirectoryInfo を使うようにするべきである、

ということでしょうか?そしてこの原則をはずしてすべてを DirectoryInfo だけで
記述してしまうと、.NETのプログラムとしては大きく欠陥となる、ということを意味する
のでしょうか?この辺が気になっています。VB6ではこういうことを考える必要が
なかったもので戸惑っています。

227:デフォルトの名無しさん
07/03/19 11:32:46
なんでそうなる

228:デフォルトの名無しさん
07/03/19 11:35:12
プログラミングがあまりに論理的なので忘れてしまうことが在る

プログラミングはスポーツ、つまり活動的な行為なのですよ

人に聞くなんて恥ずかしい行為は慎むとよい

229:デフォルトの名無しさん
07/03/19 11:36:24
DirectoryInfoはチェックしないなんて
どこに書いてあんだよ。

同じディレクトリに対して操作を繰り返すんだから、
最初のインスタンス作成時にチェックするだけで済むだろ。
だからコンストラクタとかその辺でチェックしてるってことだよ。

230:デフォルトの名無しさん
07/03/19 11:39:44
そろそろさじ投げてもいいほど俺たちは堪えてるよな?

231:デフォルトの名無しさん
07/03/19 12:07:46
>>229
>DirectoryInfoはチェックしないなんてどこに書いてあんだよ。

>>220で挙げたようなヘルプの説明はそういった意味かと思いました。
これは意味が異なるのでしょうか。いろいろお聞きしてすみません。

>同じディレクトリに対して操作を繰り返すんだから、
>最初のインスタンス作成時にチェックするだけで済むだろ。
>だからコンストラクタとかその辺でチェックしてるってことだよ。

ということは、コンストラクタを使う限りは、DirectoryでもDirectoryInfoでも
CASが掛かるということでしょうか、そうであれば、初めから両者の差は、
コンストラクタ以外のメソッドでのみ異なるということになるわけなのでしょうか。
たびたびお聞きしてすみません。

232:デフォルトの名無しさん
07/03/19 12:19:11
reflector.netでも使えばいいんじゃないか?

233:デフォルトの名無しさん
07/03/19 12:32:20
諦めた、もう無理w

234:デフォルトの名無しさん
07/03/19 12:37:29
どうやってDirectoryのコンストラクタを使うんだ。
どうやってコンストラクタを使わずにDirectoryInfoを使うんだ。


って言ったらコンストラクタ使わずに使えるよ、とか言われんだろな。
そういうことじゃないんだ、そういうことじゃ…


235:デフォルトの名無しさん
07/03/19 12:38:41
>>231
そのセキュリティチェック云々のたわ言は別にして
DirectoryとDirectoryInfoの違いはわかってるのか?

236:デフォルトの名無しさん
07/03/19 12:43:29
>>231
・・・なんという電波解釈wwww

237:デフォルトの名無しさん
07/03/19 12:46:37
>>235
>DirectoryとDirectoryInfoの違いはわかってるのか?

それもあいまいなのですした。すみませんです。

>そのセキュリティチェック云々のたわ言は別にして

この件はそれほど気にしなくてもいいという感じでいいでしょうか?

238:デフォルトの名無しさん
07/03/19 12:54:47
TextBoxに入力した内容を次にソフトを立ち上げた時に表示するように保存しておくようにしたいんですけど。
どうやるんですか?
データファイルとかソフト本体以外のファイルは作らないでやりたいんです。

239:デフォルトの名無しさん
07/03/19 12:57:52
1回のCASの検査にかかる時間はせいぜい1/1000秒かそれ以下。
1000回繰り返したら1秒遅くなることになるが、これが気になるならうまくやれってこと。

240:デフォルトの名無しさん
07/03/19 13:01:52
>215
サンキュウ。
VS.NET2003です。
その後のテストで、以下の事実が判明しました。ここで教えてもらったスレッド関係の設定をしなくても、
別のDELLマシンでは、何の問題もなくpictureBoxクリップボードにコピーできる。
エラー発生するのは最初に開発していたマシンのみ。
エラー発生しても、プログラムの実行を継続してやれば、2回目以降は成功する。

というわけで、よく分からない状態です。たまたま解決したのか、また、別のマシンで発生する可能性があるのか考えるとちょっと怖い。
お客さんのマシンで発生したら最悪。。。


241:デフォルトの名無しさん
07/03/19 13:02:17
>>238
情報量増やさずに情報を増強するのは無理
普通は外部ファイルとして保存するかアプリケーション構成とかに保存するんだろうが、
嫌なら諦めろ

242:デフォルトの名無しさん
07/03/19 13:04:20
>>238
念じるしかないんじゃないの?
増やさないで情報を保存するなんて、エスパーしかできねーし。


243:デフォルトの名無しさん
07/03/19 13:04:37
>>238
レジストリに格納できないか?


244:デフォルトの名無しさん
07/03/19 13:14:38
>>239
>1回のCASの検査にかかる時間はせいぜい1/1000秒かそれ以下。
>1000回繰り返したら1秒遅くなることになる

そうだったのですか。わかりました、ということは原則としてアクセス回数が
少ないものの場合は、Directoryですべてまかなう方がむしろよい、というふうに
つまりCASを必ず通すという考えでやれば間違いはない、ということなのですね。
どうもありがとうございました。

あとは、DirectoryとDirectoryInfoの違いについてまた調べてみますです。
どうもでした。


245:デフォルトの名無しさん
07/03/19 14:16:26
おめでとうございます。
日常生活でのコミュニケーションに障害を感じるレベルです。


246:デフォルトの名無しさん
07/03/19 15:36:42
>>238
アプリ本体のアセンブリ自身を書き換えてやればいいんじゃないか?

247:デフォルトの名無しさん
07/03/19 15:40:19
>>243
それも外部ファイルいじってるやんw

>>238みたいなのはもう居なくなれよwwwww
常識的に考えてそんなことしねぇよwwwww

248:デフォルトの名無しさん
07/03/19 15:41:53
まあ、彼がファイルとか作りたくないっていう理由が全くわからんけどね。
Assembly自身の書き換えは、厳格名を持ってる場合に問題出るだろうし、そもそも最近のセキュリティソフトが嫌うと思う。
EXEの書き換えなんて。
普通にapp.configに書き出せばいいのに。


249:デフォルトの名無しさん
07/03/19 15:52:26
>>247
少なくとも新規作成はしない罠

250:デフォルトの名無しさん
07/03/19 15:55:27
>>249
確かにw


しかしまぁ、何故新規作成したくないというか・・・・
きっとダメな理由でもあるんだろうけどなぁ



251:デフォルトの名無しさん
07/03/19 15:59:14
それならSystem32あたりで適当なファイルをランダムに選んで乗っ取れ

252:デフォルトの名無しさん
07/03/19 16:04:16
ブートローダ乗っ取ればいいんじゃね?

253:デフォルトの名無しさん
07/03/19 16:05:35
PCに残せないなら、前回の最終入力を作業者の脳内に残してもらえばいいじゃん。
それを画面起動時に入力してもらう。

254:デフォルトの名無しさん
07/03/19 16:08:58
ふっかつのじゅもんか。

255:デフォルトの名無しさん
07/03/19 16:11:21
設定サーバを立ててオンラインで保存・読み込みすればいいんじゃね

256:デフォルトの名無しさん
07/03/19 16:13:15
まあ、普通に馬鹿な仕様を変更すればいいだけだろ?
ローカル保存可とするか、保存する場所ないならば前回入力なんぞ保持しないか。

257:デフォルトの名無しさん
07/03/19 16:38:26
VBでいうAsc関数はフレームワークではどの様に記述するのでしょうか?
Microsoft.VisualBasic.Strings のメンバではなくてです。

258:デフォルトの名無しさん
07/03/19 16:38:54
system.math
名前空間の中じゃねぇの?

259:デフォルトの名無しさん
07/03/19 16:44:21
Reflectorで覗いてみたら?
自己責任で

260:デフォルトの名無しさん
07/03/19 16:44:27
>>257
普通にInt32にキャストしろ

261:257
07/03/19 17:18:27
たくさんの回答ありがとうございます。

>>258
名前からして違うと思います。一応確認しました。

>>259
リコンパイラ以前使ったのですが、どこに入れたのか忘れちゃいました。
Platform SDK か何かをインスコしたパスの中に実行体があるんでしたっけ?

>>260
キャストですか?

262:デフォルトの名無しさん
07/03/19 17:28:34
Dim row as DataRow
row("ID") = 3
みたいに、括弧をつけてアクセス出来るようにするには、
クラス定義の時、どのようなメソッドを追加すれば良いのでしょうか。

263:デフォルトの名無しさん
07/03/19 17:34:18

引数設定すればいいんじゃね?

Public Property Row(ByVal ColName As String) As DataRow
Get
return HOGEHOGE
End Get
Set(ByVal value As DataRow)
_HOGEHOGE= Value
End Set
End Property

264:デフォルトの名無しさん
07/03/19 17:34:47
とりあえずHashMapとかディクショナリとか。
.netになって意識してないけど、デフォルトプロパティもあるんだっけ?

上記の場合、Row.Item("ID")な書き方が正なように思う。
で、ItemってのがHashMapなりディクショナリで実装。
DataRowのデフォルトプロパティがItemだから、row("ID")でもアクセスできる。
かな?

265:デフォルトの名無しさん
07/03/19 17:46:36
>>264
あ、そっち方面の話だったのねwww

266:デフォルトの名無しさん
07/03/19 18:22:31
>>263-265
どうも丁寧にありがとうございました。

267:デフォルトの名無しさん
07/03/19 18:38:05
ちょっと質問です

VB.NET 2005のWinアプリでXSDスキーマ(スキーマA)使ってデータを読み込んだりしようとしている。

このスキーマAはプロジェクトAのSchemaフォルダに配置されていて実行時にこれを読み込みたい
(ただし、直でファイルパスを切りたくないので相対パスでアクセスしたい)

開発環境では、プロジェクトAのBinフォルダ以下のReleaseやDebugフォルダの中に保存されてしまい、
インストーラからインストールした時は、実行ファイルと同じ階層にSchemaフォルダがあるため、相対パスではアクセスできないので
相対パスで開発環境でも、実行環境でも同じ相対パスでアクセスしたい。

インストール時のフォルダ構造を開発環境に合わせればいいじゃないかといわれればそうだけど、
もし特に設定ナシで目的が達成できるならと思い質問させてもらいました。

説明が下手で伝わりにくいかもしれませんが、よろしくお願いします。



268:デフォルトの名無しさん
07/03/19 19:09:56
exeファイルにNTFSストリームをくっ付ければ
hoge.exe:hoge.txt
とかに保存すれば

269:268
07/03/19 19:11:17
>>238
です

270:デフォルトの名無しさん
07/03/19 22:04:50
>>267
Schema フォルダのパスを設定ファイルに書いとけばいいんじゃね?

271:デフォルトの名無しさん
07/03/19 22:08:41
>>257
これでわかるかい?

Dim s As String = "abcABC"

For Each c As Char In s
  Dim a As Integer = Convert.ToInt32(c)
  Console.WriteLine("{0}: {1}", c, a)
Next


272:デフォルトの名無しさん
07/03/19 22:34:45
Ascをreflectorで見た
何気に気合入ってたよ
Unicode<->ASCII(MS-shiftjis?)

273:デフォルトの名無しさん
07/03/19 22:39:15
Microsoft.VisualBasic.Asc() じゃダメ?

274:デフォルトの名無しさん
07/03/19 23:16:11
>>271
それはAscW

275:デフォルトの名無しさん
07/03/19 23:34:22
>>270
やっぱそうなっちゃいますよね?
あんまり、パスの直書きはしたくなかったんで聞いてみたんですが
とりあえずいい案思いつくまでそれでしのごうかと思います
(というか、そのままになりそうな予感)

レスサンクスでした

276:デフォルトの名無しさん
07/03/20 00:03:30
質問。StreamReader.Read(Char(), Int32, Int32) で文字列を読み込んだら、空白部分がnothing扱い(!?)になるんだが、
空かどうかはどう判定すればいいの?C#では普通にナル文字が入ったんだけどなぁ・・・。


277:デフォルトの名無しさん
07/03/20 00:11:46
VB の Nothing は C# では default(T)。
default(Char) は '\0' だな。

で、空白とか空とかって何?

278:デフォルトの名無しさん
07/03/20 00:20:32
この質問はVBの質問とはちょっと違いますが、
Windowsの仕組みを良く知っている人が多そうなここで質問させていただきます。
間違っていたらごめんなさい。
質問は、
Cでコンパイル済のEXEファイルAがあって、それはある種のシミュレーションを
繰り返し計算して、計算結果の数値を画面にずらずらと出力しています。
i=1 数字1  数字2  数字3
i=2 数字1  数字2  数字3
i=3 数字1  数字2  数字3
...
...
こんな感じです。そのソースを入手できないのですが、何らかの方法でこの出力している数字を
リアルタイムで取得して、それを別プロセスで動いているVBで作ったグラフ描画ソフトBに
データとして送りたいのです(ファイルマッピングか何かの方法で)。
問題は、画面の数字を取り込む方法なのですが、何か良い方法はありますか?

279:デフォルトの名無しさん
07/03/20 00:26:53
タイマで WM_GETTEXT 投げてりゃ良いんじゃね

280:デフォルトの名無しさん
07/03/20 00:27:19
ProcessStartInfo.RedirectStandardOutput プロパティがそれっぽい
ProcessStartInfoはProcess.Startの引数として使う
やったことないから合ってるかは知らんが

281:デフォルトの名無しさん
07/03/20 00:32:33
> 画面にずらずら
もうプログラムとか横においてだな、
詳しく書かないといけないところを省略するなよ

OCRが最も汎用的だな

282:デフォルトの名無しさん
07/03/20 00:38:37
ちょwwwOCRてwwwww


まずデジカメが必要だから買ってきて



283:デフォルトの名無しさん
07/03/20 00:45:04
フォント固定で種類が数値+α程度なら、パターンマッチも
そんなに難しくはないだろうね、

284:デフォルトの名無しさん
07/03/20 00:59:23
>280
ありがとうございました。教えてもらった方法で、
意外にも簡単にできました。でも一つ問題がありまして、
出力をリダイレクトしたら、画面の表示が出なくなりますが、
希望としては、画面にも今までどおり出しながら、同時にリダイレクトして
取り込みたいのですが、それは無理でしょうか?

285:デフォルトの名無しさん
07/03/20 01:00:52
受け取った出力をそのまま標準出力に流せばいいじゃない

286:デフォルトの名無しさん
07/03/20 01:09:57
そのためのtee

287:デフォルトの名無しさん
07/03/20 01:14:27
>285
VBからシミュレーションソフトを起動していますが、そのConsoleに
AttachConsoleする方法が分かりません。
>286
TeeってDOSにありますか?探してみたのですが無いようでした。

もっと簡単に、リダイレクトしながらconsoleにもそのまま出力する
というプロパティ設定があるといいのですが。。

288:デフォルトの名無しさん
07/03/20 07:18:16
無いならダウンロードするか作れよ。

289:デフォルトの名無しさん
07/03/20 09:41:48
自分でコンソール作ればいいじゃないか

290:デフォルトの名無しさん
07/03/20 10:32:04
あるテーブル2つのデータを持つDataSetがあります
TableA
TableB
がデータセットに格納されており、2つのテーブルは
TablA:TableB=1:Nの関係でリレーションが張られています。

TableA/TableB共にデータを追加・更新・削除した後にDBに繁栄させるためにUPDATEメソッドを実行したいのです。

ここで普通データアダプタで更新する場合

Tableという名前のDataTableがUpDateメソッドで反映される為
TableAの名前をTableに書き換えてデータアダプタでUpDateしています。
その後TableAの名前を元に戻し、
TableBの名前をに書き換えてデータアダプタでUpDateしています。

2回データアダプタを作成し、更新していますが、
同一コネクション内でトランザクションをかけている為、同時実行時などは問題なく処理できています。
しかし、この処理が非常にスマートでない気がします。

なにかもっと簡単にリレーションの張られたデータを更新する手法があるのではないかと情報を集めてみたのですが、うまい解決方法が見つかりません。
もし、なにかスマートな解決方法や考え方があるよ?とか、俺はこうしている
などの情報を少し分けてもらえないでしょうか?

よろしくお願いします。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4346日前に更新/125 KB
担当:undef