1 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 10:00:19 ] 前スレ VB.NET質問スレ(Part29) pc12.2ch.net/test/read.cgi/tech/1235206416/l50 テンプレは>>2 〜
210 名前:デフォルトの名無しさん [2009/06/23(火) 19:50:53 ] VBAのマクロを生成できるから何でもできる
211 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 20:23:57 ] 調べてもマクロ呼び出ししか出てこないけど。 VB.net上で書いたソースをどの参照からマクロ登録することが出来るんだろう。 どなたかサンプルソースがあるところ教えてください
212 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 20:38:49 ] >>211 officetanaka.net/excel/vba/vbe/06.htm
213 名前:デフォルトの名無しさん [2009/06/23(火) 22:44:41 ] VB2005でftpクライアントの機能作ってます。 WebRequestMethods.Ftp でサーバにあるファイル名を取ってくるときに、 2バイト文字のファイル名だと化けてしまいます。 化けないで正しいファイル名を取得する方法はないでしょうか?
214 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 22:53:11 ] FTPではマルチバイト文字は未定義なのよね TcpClient or Socket使って自分でFTP喋るしかないんじゃないかなぁ まあどっかにその辺の対応も含んだ野良FtpClientがあるかもしんないけど
215 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 02:26:15 ] 化けるって、どこでどう化けるんだ?
216 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 22:10:40 ] テキストボックスのD&Dで テキストのD&Dは Private Sub TextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter If e.Data.GetDataPresent(DataFormats.UnicodeText) Then e.Effect = DragDropEffects.Copy End Sub で処理できるのですが、インターネットエクスプローラに表示されているWEBページの リンクの文字をD&Dした際に、HTMLに設定されたURLを取得するにはどのように書いたら良いでしょうか?
217 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 22:52:44 ] "UniformResourceLocator"でデータ取得 MemoryStreamにキャストしてそこからRead Chr(0)を探してその直前までをEncoding.Default.GetString
218 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 22:54:22 ] あ、Chr(0)じゃなくていいか、単に0探すだけで
219 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 00:14:36 ] レスありがとございます。 その方法はアドレスバーのURLの左にあるアイコンをD&Dする方法ではないでしょうか? HTMLのリンクになっているテキストはドラッグしても通行禁止のマークのままなのですが・・・
220 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 00:18:44 ] 普通にa要素のD&Dを取れる IEとFxで確認した あ、EffectはCopyだけじゃなくてLinkも入れないと駄目かも
221 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 00:20:03 ] どぼんさんのHPにあるじゃないか ttp://dobon.net/vb/dotnet/control/dropfromwebbrowser.html
222 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 00:20:17 ] ありがとうございます。 DragDropEffects.Copy→DragDropEffects.Link の変更で受け取れました。助かりました。
223 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 02:06:49 ] OSを起動後に起動時の処理(スタートアップのプログラムの起動など)の一番最後に (PCがアイドル状態になったら)自分のアプリを起動したいのですが、 OSが起動後にそのような状態になったというのはどのように調べたら良いでしょうか? ちなみにWindowsXP-PROです。
224 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 14:03:50 ] hint wmic path Win32_Processor get LoadPercentage
225 名前:デフォルトの名無しさん [2009/06/25(木) 14:04:10 ] すみません。自分の開発してるプログラムでつまずいてしまったので教えてください。 現在業務をスケジュール管理するプログラムを作っています。 業務を登録する画面では、1月〜12月、1日〜31日までのチェックボックスを それぞれ作っています。 例えば1月〜12月と1日のチェックボックスをチェックすると、毎月1日の業務 として登録され、スケジュール表に毎月1日だけその業務が表示されるような ものを作りたいと思ってます。 データベースはACCESSを使用しており、月と日のチェックボックスに対応する 項目としてはYes/No型で1月〜12月、1日〜31日まで全て作っています。 今つまずいている点は、日付を指定してDB上からその日付に該当する業務を取得 したいのですが日付によってチェックするフィールドの位置が違う為、 どのようにすればいいか悩んでいます。 例えば6月1日の業務を取得したい場合、DB上で6月フィールドにチェックがあるかどうか の確認が必要になりますが、日付によって確認するフィールドを動的に変える方法を 教えてください。 1月1日の場合〜、1月2日の場合〜とコーディングしたら365日分つくらないと いけないので(こんな案しか思いつかなかったorz)良い案があれば教えて下さい。
226 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 14:16:31 ] DBのテーブルは与えられてるもの?自分でいじれるもの?
227 名前:225 [2009/06/25(木) 14:17:56 ] 連投すみません。 フィールド名を変数で定義出来れば多分出来るかなと思います。 1月の場合、変数に"1月"と代入しその変数=trueのレコードを取得とするような クエリにぶちこめば動くようにしたいです。
228 名前:225 [2009/06/25(木) 14:20:31 ] >>226 DBは自分でいじることが出来ます。 本当にド素人なんでどういったやり方がスマートなのかわかってないので 、こういうプログラムを作るときは普通こういった方法をする と言ったアドバイスを頂けたらと思います。 よろしくお願いいたします。
229 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 14:23:31 ] Accessを使ってるとフォームを作りやすいようなイメージでテーブルを 作ってしまうのだろうけどそこが誤りだろうな。 日付によって読みに行く場所が違うというのが異常だからそこを直すべき。
230 名前:225 [2009/06/25(木) 14:58:45 ] >>229 つまり1月〜12月、1日〜31日のフィールドっていうのが異常って事ですよね? むずかしいです・・・
231 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 16:24:00 ] まず、フィールドってのがRDB上の属性(カラム)なのかGUI上のコントロールなのかよくわからない 可能ならとりあえず現状のスキーマとSQLクエリでも晒してくれ
232 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 16:30:58 ] RDBの流儀でいえばこんな感じのスキーマになると予想 スケジュール表 [ 日付, 業務種別ID, 実業務ID ] 業務マスタ [ 業務種別ID, 業務名, 実業務テーブル名 ] (実業務表) [ 実業務ID, 必要な情報・・・ ] ←業務ごとに作成
233 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 17:39:47 ] >>225 プログラムで動的にSQLを生成して実行する フィールド名も動的に変更できる >>229 今回の要件なら、俺でも1−12月のフラグと1−31日のフラグもつかもしれない まあ、ホントは後で書くスキーマのようにするのが正解だろうけど >>232 登録するのは、業務の繰り返し頻度であって、業務のスケジュールそのものじゃないぞ そのスキーマだと、日ごとスケジュールの生成って作業が必要だな そして繰り返し頻度を変更した場合、今あるスケジュールを全部けして再生成 さらに何年先までのスケジュールを生成していいのか不明 俺の予想スキーマ 業務マスタ(業務ID,業務名,その他必要な内容) 業務頻度月(業務ID,業務実行月) 業務頻度日(業務ID,業務実行日) 指定月日の業務を知りたければ、この三つを業務IDでjoinして 業務頻度月.業務実行月=指定月日の月 and 業務頻度日.業務実行日=指定月日の日 を検索 まああれだ。DB設計の話は板違いだな
234 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 22:34:03 ] DBも気になるけどチェックボックスが大量に並んでいる画面を想像してぞっとした あ、チェックボックスのリストコントロールとかもあるか・・・
235 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 04:16:35 ] 大量って言っても、12個+31個だからなぁ カレンダー系のマスタメンテとかで、31個のチェックボックスを 並べるのなんて結構やってるし まあしかし、>225からここまで1回もvb.netって言葉が出てないじゃないかw
236 名前:デフォルトの名無しさん [2009/06/26(金) 13:36:39 ] ↑ おい、出すなよ。
237 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 16:00:18 ] DB的な使い方をしない前提なら、 スポットで1日分だけ読み込もうとせずに、 1年分くらい全部読み込んでおけってことになるね。
238 名前:デフォルトの名無しさん [2009/06/26(金) 18:18:29 ] VB.NETでスレッドを扱いたいんです。 同時に20個ほどスレッドを起動させ終了を待ちたいのですが、 どうすればいいのでしょうか? .joinでは無理ですよね? よろしくお願いします。
239 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 18:21:09 ] 別にJoinでも問題ないと思うが
240 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 18:49:10 ] そんなにスレッド起動させてどうすんの? SNS巡回ツールでも作んの?
241 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 23:46:59 ] 大量のラベルコントロールを書き換えがしたくて label1 label2 label3...のような感じで連番にして繰り返し処理で 一気に書き換えようと思うのですが思うようにできません target = Cobj("label" & i) のような感じにしたのですが エラーが出てとまってしまいます どうしたらよいのでしょうか?
242 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 00:02:44 ] >>241 label1 label2 label3...をListに入れる
243 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 00:03:16 ] テンプレに入れたいぐらい良く出るな、この類の。 配列に入れとけ
244 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 00:13:42 ] Controls()からLabelをさがせばいいんじゃない For Each child As Control In Me.Controls If child.Text Like "Label*" Then child.Text = child.Text & "でんがな" End If Next
245 名前:デフォルトの名無しさん [2009/06/27(土) 00:34:12 ] 正直、こんな命令があったんだとか こんな使い方があったんだとか 他人のプログラムやサイトを見て知ることが多く それを踏まえてみると自分の書いたコードがとても無駄だったみたいな経験があるんですが みなさんはどうやって、こんな命令があるこんな使い方があるみたいなものを学んでるんですか?
246 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 00:36:46 ] MSDNのサンプルを読破しようと思ったこともありました 挫折しました というわけで他人のプログラムやサイトw
247 名前:238 mailto:sage [2009/06/27(土) 01:31:43 ] >>238 です スレッドが終わるタイミングはまちまちです。 終わったスレッドから終わったあとの処理をしていきたいのです。 .joinだと制御が戻ってこないので困っています。
248 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 01:33:33 ] コンストラクタ内のstatic変数ってそのクラスのオブジェクトすべてで共通じゃないの? オブジェクトに通し番号をつけようと思って以下のように書いたんだが、毎回0になるのだが・・・ Public Class Form1 Private Class Foo Public Sub New() Static Sequence As Integer = 0 Sequence += 1 (毎回0に初期化されてこの時点で1になる
249 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 02:16:37 ] >>248 Static (Visual Basic) ttp://msdn.microsoft.com/ja-jp/library/z2cty7t8(VS.80).aspx >プロシージャが Shared でなければ、その Static 変数を含むローカル変数はインスタンス変数になります。 >そのインスタンス内の変数は、別のインスタンス内の同じ名前を持つ変数とは独立したものです。 各インスタンスで共有したかったらShared使ってこんな感じ Private Class Foo Private Shared Sequence As Integer = 0 Public Sub New() Sequence += 1 Console.WriteLine(Sequence) End Sub End Class
250 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 02:28:03 ] >>249 thnx staticなのにインスタンス別とは・・・
251 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 03:39:00 ] >>247 やっぱ、スレッドが終わるとき自分で終了通知する、とかじゃないかね Dim waitHandles(20) As AutoResetEvent Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load For i As Integer = 0 To waitHandles.Length - 1 waitHandles(i) = New AutoResetEvent(False) Dim workThread As Thread = New Thread(AddressOf worker) workThread.Start(i) Next Dim manageThread As Thread = New Thread(AddressOf manager) manageThread.Start() End Sub Private Sub worker(ByVal obj As Object) Dim i As Integer = CInt(obj) Thread.Sleep(i * 100) '適当に仕事をする waitHandles(i).Set() 'スレッドが終わるときに終了通知 End Sub Private Sub manager() Debug.Print("--------------") For count As Integer = 0 To waitHandles.Length - 1 Dim i As Integer = WaitHandle.WaitAny(waitHandles) '終了通知を待つ Debug.Print("worker {0} done", i) Next Debug.Print("ALL done") End Sub
252 名前:225 [2009/06/27(土) 08:11:33 ] 皆さん、教えていただきありがとうございました。 DBの設計を見直した方が良かったのですが、時間的な関係で今回はこのまま行く 事になりました。 結局プログラムでレコード1件ずつ読み込んで、指定日付の月、日に 対応するフィールドそれぞれのデータがtrueなら取得。 取得したデータを別テーブルに追加していってスケジュール表を作りました。 申し訳ないのですが、別のことでもう少し教えて頂きたい事があります。 スケジュール表を更新した日付等、ちょっとした情報を保存しておきたいのですが、 その為だけにわざわざ新しいテーブルを作るっていうのはおかしいですか? 保存しておきたい情報としては、更新日付、いつから〜いつまでのデータを スケジュール表に取得しているかという情報くらいです。 スケジュール表は3種類あるので保存するレコード数は3件以上には絶対にならないので たった3件の情報の為だけのテーブル作るっていうのは、変なのかなと思いまして 皆さんのご意見をいただけたらと思います。 お願いします。
253 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 11:14:59 ] DBを使うのはやめてOSファイルに書き出すのはどうだろう。 DataSetに全部突っ込んでテキスト(XML)で保存するのもいいアイデアだと思う。
254 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 12:59:33 ] いい加減、VB.NET関係ない話は該当するスレ(板)で聞け
255 名前:225 [2009/06/27(土) 15:13:48 ] >>254 VB.NETで作ってるので、関係ないとは一概に言えないと思います。
256 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 15:30:58 ] 関係ないだろ。
257 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 13:18:40 ] >>252 書いてあることだけみると、他の人のアドバイスを元にDBから作り直せば3時間くらいで作れそうな気がするんだけど、 それでも「時間的な関係で」って結局そのままつくり続けるならここで聞く意味ないんじゃないか? とりあえず更新日付等の情報を保存するためにテーブルを作るのは別に問題ないと思うけど、その程度の情報なら、 更新が起きたときにそのテーブルのレコードをUPDATEするんじゃなくて、INSERTしてログ的な使い方のほうが、そのデータをほしいって言った人の要求に近いんじゃないか。 更新対象のスケジュール日付、更新した人、作業内容(追加、修正、削除等)、更新日 みたいな感じのログにしておけば当面の要求はこなせると思う。 毎月1日実行のスケジュールを追加したら12個ログができるような感じで。 業務スケジュールっていうことだし、多分そんな頻繁に変更がないから、容量もそんなにくわないと思う。
258 名前:デフォルトの名無しさん [2009/06/28(日) 15:03:59 ] 質問させてください。 vb.netで開発したwebサイトを実行環境から確認しようと IISを利用してアクセスしたのですが、 以下のようなエラーが出てしまいました。 BC40056: インポート 'Oracle.DataAccess.Client' で指定された名前空間または型が、 パブリック メンバを含んでいないか、または見つかりません。 名前空間または型が定義されていて、 少なくとも 1 つのパブリック メンバを含んでいることを確認してください。 また、インポートされた要素名がエイリアスを使用していないことを確認してください。 開発環境からは正常に実行できていたのですが、 実行環境からだとこのようなエラーが出てしまい困っています。 どなたか助けてください。 使用しているソフト等 windows xp VWD ODBC ODP.NET Oracle11g
259 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 15:07:36 ] machine.config か web.config に参照設定を記述しろ、ってなかったか?
260 名前:258 [2009/06/28(日) 15:20:02 ] >>259 「参照設定を記述しろ」っていう表示はどこにもなかったです。
261 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 16:03:09 ] otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/win.111/E05791-01/featConfig.htm とかは違う? IIS への発行はどうやったの? 実行環境に、Oracle のクライアントはインストールしてある?
262 名前:258 [2009/06/28(日) 16:17:05 ] >>261 IISへの発行は、コントロールパネルの「プログラムの追加と削除」→「コンポーネントの追加」からIISを追加して、 ネット検索を経て、設定を済ませました。 < ローカルホスト> でIISが表示されるようになっています。 OracleDBサーバーと、実行環境が同じPC上で行われています。 Oracle11gがインストールされているPCなので、 Oracleクライアントは必要ないかと判断しました。 また、リンク先のページを拝見しましたが、いまいち理解ができません;
263 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 16:21:00 ] んで、開発環境と実行環境は別 PC なのね? どちらも 32ビット? Oracle DB が入ってても、クライアントがインストールされてなきゃダメ。 まずはそこを確認してみて。
264 名前:258 [2009/06/28(日) 16:27:54 ] >>263 ありがとうございます。 開発環境と実行環境は別PCです。 どちらも32ビットです。 今からOracleクラインアントを OracleDBサーバーにしているPCにインストールしてみまつ。
265 名前:258 [2009/06/28(日) 16:49:52 ] >>263 確認したのですが、OracleDBサーバーにしているPCに クライアント10gがすでにインストールされていました。
266 名前:デフォルトの名無しさん [2009/06/28(日) 17:52:33 ] 皆さんは帳票の出力はCrystalReportを使用してますか? 現在帳票はACCESSで使用しています。 今回、フォームをVB.NETで作成しなおし、DBはACCESSを使用することにしました。 帳票がかなり複雑でビジュアル的にも良くできているのですが、それを VB.NETで作り直すのがかなり困難だということをひしひしと感じております。 皆さんだったらどうしますか?
267 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 18:00:13 ] クリリポ、Active Reports、iText あたり。
268 名前:258 [2009/06/28(日) 18:09:14 ] Oracleクライアントはインストールされているのですが、 未だに上手くいきません。
269 名前:266 [2009/06/28(日) 18:10:13 ] ActiveReoprts良さそうなんですが会社で買うことが出来ないので 無料ツールはありませんか?
270 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 18:14:35 ] どうもこうもPrintDocumentでガシガシ書くだけだわな
271 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 18:15:41 ] つーかこのage厨は…
272 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 18:21:47 ] >>268 アプリの web.config はどうなってんの?
273 名前:258 mailto:sage [2009/06/28(日) 18:28:44 ] >>268 すみません。 「どうなってんの?」というのは具体的にどの部分のことを指しているのでしょうか?
274 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 18:32:13 ] つーか、参照設定がおかしいんじゃね? って言われてるんだから、 そこを調べろよ。
275 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 18:38:01 ] まぁ、どうやって調べたらいいんですか? とかだろうなw
276 名前:258 mailto:sage [2009/06/28(日) 18:44:03 ] >>274 参照設定は既に設定済みです。 「.NET」タブから一覧を表示させ、 「Oracle.DataAccess」が追加されています。
277 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 18:46:11 ] それは開発環境の話だろ・・・
278 名前:258 mailto:sage [2009/06/28(日) 18:56:37 ] >>277 すみません。 勘違いしておりました。 どの箇所の参照設定なのか教えて頂けますでしょうか?
279 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 19:14:42 ] ここで質問したからには、 他コミュで質問できないからな? 某掲示板や某フォーラムなどですると 「マルチ禁止!」のレスがつくからな 気をつけろよ・・・
280 名前:266 mailto:sage [2009/06/28(日) 19:59:32 ] PrintDocumentとCrystalReportはどちらの方がおすすめですか? 今回私の作りたいのは、1週間のスケジュール表になります。 日ごとに四角の枠を配置し、その中にその日の予定をテーブルから 書き出すことになります。 CrystalReportでとりあえず作ってみたものの、印刷プレビューで表示 すると実際の配置とかなりずれて表示されるので、本当に実現できるのか 不安になってきました。 予定表のテーブルから日をキーにしてレコードを取得後、日(曜日)ごとにDataSetを 作成してデータを突っ込んでます。 1週間分なので曜日のDatasetが7個できる形になります。 それをCrystalReportに渡して、曜日ごとの枠に収まるようにレコードを入れていきたい のですが、全然綺麗に配置出来ないし、途方も無い作業でへこんでます。 だからといって皆さんに愚痴ってもしょうがないんですが、あまりにもレポート機能が しょぼすぎて、ACCESSよりも劣ってるなんて残念でしょうがないです。 基本的にやり方としては間違ってないですか?
281 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 20:11:56 ] ある程度フォーマットが決まってるならクリリポ。 変なフォーマットなら、自由度の高い PrintDocument だな。
282 名前:266 mailto:sage [2009/06/28(日) 20:14:30 ] >>281 PrintDocument使うって事は、コードのみで書いていくんですよね・・・ 例えば、エクセルで作るような表(網掛けなど)も可能ですか?
283 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 20:17:10 ] Box の塗りつぶしでできるレベルだな。 つーか、Access がいい、っていうなら、Access でやれよ。
284 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 20:29:01 ] >>278 Web.configにいろんなDLLの参照設定が書かれてないか? それとサーバにODP.NETはインストールしてるのか?
285 名前:266 mailto:sage [2009/06/28(日) 20:36:31 ] >>283 会社でVB.NETで作るっていることに決まったんで、 ACCESSで作る事ができません・・・
286 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 20:43:33 ] だったら文句言わずにやれよ。 文句言うくらいなら、会社のやつらを説得すればいい。
287 名前:266 mailto:sage [2009/06/28(日) 21:01:55 ] >>286 はぁ?CrystalReportで作ってるってさっきから言ってるだろう。
288 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 21:08:20 ] じゃ、Crystal Reports スレでも行けよ。スレ違いだから。
289 名前:266 mailto:sage [2009/06/28(日) 23:04:43 ] こりゃしっけいいたしました
290 名前:266 mailto:sage [2009/06/28(日) 23:13:36 ] ってCrystalReportすれないじゃないか。騙された。
291 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 12:18:06 ] 先生方〜馬鹿な私にアドバイスをください orz VC++2008のWin32プロジェクトで開発した共有メモリのDLLを VB.net2008から呼び出すプログラムを製作しています。 DLL内部で保持している構造体を参照渡しして共有する仕組みです。 ですが、下記記述だと構造体内部の配列(stSub1〜3)が Nothingの状態になったままです。VB初心者の私にアドバイスをお願いします ちなみにOSはWinXPです。よろしくお願いします。 ※記述は改行数の関係上、次の書き込みに書きます
292 名前:291 mailto:sage [2009/06/29(月) 12:19:57 ] 続き(2/3) 見づらいと思いますがご了承ください orz ------------------------ VC++記述 ------------------------ typedef struct { short s1; short s2; }ST_SUB; typedef struct { ST_SUB stSub1[10]; ST_SUB stSub2[10]; ST_SUB stSub3[10]; }ST_AREA; DLL関数:HANDLE MemOpen(PVOID* Address)
293 名前:291 mailto:sage [2009/06/29(月) 12:22:28 ] ------------------------ VB記述 抜粋 ------------------------ Public Structure ST_AREA Dim s1 As Short Dim s2 As Short End Structure Public Structure ST_AREA Dim stSub1() As ST_SUB Dim stSub2() As ST_SUB Dim stSub3() As ST_SUB End Structure Public stArea As ST_AREA Declare Function MemOpen Lib "xx.dll" (<MarshalAs(UnmanagedType.Struct)> ByRef Address As ST_AREA) As Integer Private Sub BtnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOpen.Click Dim iRes As Integer iRes = MemOpen(stArea) End Sub
294 名前:291 mailto:sage [2009/06/29(月) 13:05:52 ] 293のPublic Structureは ST_AREAじゃなくST_SUBだった o..rz
295 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 13:37:07 ] MSDNのアンマネージ コードとの相互運用の中にあるサンプルみれ
296 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 21:11:52 ] そもそも違うプログラム同士で、変数の値などを共有(メモリの共有)をするにはどうしたらいいんでしょうか? どこかに解説サイトないでしょうか
297 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 22:55:08 ] つーか、宣言が全然おかしいじゃん。 メモリマップドファイルとか、プロセス間通信系かな。>共有
298 名前:291 mailto:sage [2009/06/30(火) 09:34:04 ] >>295 ありがとです。 PVOID*なのでクラスにしてちと試してみます >>296 C++ならCreateFileMappingとかあるみたいですよ。 ほかの言語はわかりません。
299 名前:291 mailto:sage [2009/06/30(火) 10:34:29 ] 連続申し訳ないです。。。 C言語なら ST_AREA *pStArea MemOpen(&pStArea); pStArea->stSub1[3].s2 = 10; とかやれば直接書き込みできるのに VBってこういうことできないんですか? IntPtrのようなもので受け取らないとだめですかね?
300 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 10:52:14 ] つ「構造体のサンプル」
301 名前:291 mailto:sage [2009/06/30(火) 13:51:15 ] >>300 先生ありがと! サンプルを元にやってみたけど 他アプリから値を変えても値が変わらない。。。 値渡しになってる? Public Structure ST_SUB Public s1 As Short Public s2 As Short End Structure <StructLayout(LayoutKind.Sequential)> _ Public Class ST_AREA <MarshalAs(UnmanagedType.ByValArray, SizeConst:=10)> _ Public stSub1 As ST_SUB() <MarshalAs(UnmanagedType.ByValArray, SizeConst:=10)> _ Public stSub2 As ST_SUB() <MarshalAs(UnmanagedType.ByValArray, SizeConst:=10)> _ Public stSub3 As ST_SUB() End Structure Public stArea As ST_AREA Declare Function MemOpen Lib "xx.dll" (<MarshalAs(UnmanagedType.Struct)> ByRef Address As ST_AREA) As Integer Private Sub BtnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOpen.Click Dim iRes As Integer iRes = MemOpen(stArea) End Sub
302 名前:291 mailto:sage [2009/06/30(火) 13:54:35 ] End StructureじゃなくてEnd Classだ o...rz Openしたときは最後に書き込んだ値が取れます。 VB側から書き込んでも相手の値は変わらず。。。
303 名前:291 mailto:sage [2009/06/30(火) 16:17:43 ] お、落ち着くんだ私。 Declare Function MemOpen Lib "xx.dll" (ByRef Address As ST_AREA) As Integer だな。 Cで書かれてるDLLの引数の型がPVOID*だから構造体でなくクラスで合ってると思うけど オープンした時のみ値が取得できる状況です。。。 助けてティーチャー orz
304 名前:デフォルトの名無しさん [2009/06/30(火) 16:31:44 ] ByValArrayは構造体専用 構造体にしてByRef IntPtrで受けるか、配列の要素を全部フィールドに展開するか
305 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 02:11:46 ] DataSetてどういう場合に使用するものなのでしょうか? mdbファイルにadoを使いデータを抽出(SQL文を使用) この抽出結果を一時的に保管しておく器とかに使うものなのでしょうか?
306 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 07:34:02 ] >>303 > Cで書かれてるDLLの引数の型がPVOID*だから構造体でなくクラスで合ってると思うけど 意味がわからん。P/Invoke のサンプルからやり直せ
307 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 07:34:13 ] >>305 そんな感じ。
308 名前:デフォルトの名無しさん [2009/07/01(水) 10:02:21 ] >>306 ポインタへのポインタが必要だから参照型(構造体ではなくクラス)の参照渡しにすればいいんだよ 理屈は間違ってない
309 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 10:39:35 ] >>305 SQLでの問合せの結果(複数行)をとっとくのがDataTable、 DataSet は DataTable のコレクション+αの機能。
310 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 10:41:48 ] >>308 すごく…おかしいです。