[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 07/26 10:23 / Filesize : 199 KB / Number-of Response : 675
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

VB.NET質問スレ(Part30)



1 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 10:00:19 ]
前スレ

VB.NET質問スレ(Part29)
pc12.2ch.net/test/read.cgi/tech/1235206416/l50

テンプレは>>2

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
すごく…おかしいです。

311 名前:デフォルトの名無しさん [2009/07/01(水) 10:57:19 ]
おかしいも何も、MSDNに書いてある

312 名前:291 mailto:sage [2009/07/01(水) 11:26:45 ]
>>308さんのおっしゃるとおり
ttp://msdn.microsoft.com/ja-jp/library/awbckfbz(VS.80).aspx
上記サイトの
アンマネージ シグネチャ  マネージ宣言 1 レベルの間接参照 class MyStruct(…);
DoWork(MyStruct** x);   DoWork(ByRef x As MyStruct)
部分をみて構造体ではなくクラスにしないといけないのかなと判断してます
解釈が間違ってますかね?

>>304さん
>構造体にしてByRef IntPtrで受けるか
この意味が私の考えで合っているのかわかりませんが、
IntPtr型でポインターのアドレスを受け取り
構造体にキャストして割り当てるということなのでしょうか?

それとは別に、クラスにしてByValArray以外の方法(参照渡しができる方法)で
配列を作って引数に渡すことができればなぁと考えています。

考え方がC言語に偏っているので変なことを言ってるかもしれませんが
先生方、どうか温かい目でアドバイスをお願いします m(_ _)m

313 名前:デフォルトの名無しさん [2009/07/01(水) 11:40:47 ]
クラスなら配列の要素と同じ数だけフィールド並べるしかないんじゃないの

314 名前:デフォルトの名無しさん [2009/07/01(水) 11:56:18 ]
構造体として定義して、その配列を参照渡し(ByRef)してみるのはどうだろう
でも配列渡すならアドレス固定しないといけないから、IntPtrで受けてMarshal.PtrToStructureの方がまだ簡単確実

315 名前:314 [2009/07/01(水) 12:03:44 ]
アドレス固定したら結局IntPtrで渡すことになるな
一行目撤回

316 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 13:12:57 ]
>>299
>VBってこういうことできないんですか?
P/Invoke で外部関数呼び出し時には引数の変換がされるが、それ以外のタイミングで
Managed なコードから Unmanaged な領域を弄る簡単な方法はない。
おとなしく Marshal の共有メソッド (Read〜/Write〜等) に IntPtr を渡す方法を試せ。

317 名前:デフォルトの名無しさん [2009/07/01(水) 13:14:58 ]
やっと理解できた
VBのメンバを通してC側に直接書き込もうとしてたのか
マーシャリングでは無理だ
VBでは構造体も使えない
IntPtrで受けてMarshal.WriteByteでも使って直接書き込むしかない

318 名前:291 mailto:sage [2009/07/01(水) 15:41:43 ]
先生方いろいろとありがとうございました。
以下のように落ち着きました(ST_SUBは以前のまま)
Public Structure ST_AREA
Puclic BaseAddr As IntPtr
Default Public Property stSub1(ByVal index As Integer) As ST_SUB
Get
Dim Offset As Integer = index * Marshal.SizeOf(GetType(ST_SUB))
Return CType(Marshal.PtrToStructure(BaseAddr, GetType(ST_SUB)), ST_SUB)
End Get
Set(ByVal value As ST_SUB) ' indexのサイズ超えは省略
Dim Offset As Integer = index * Marshal.SizeOf(GetType(RDS_DATA_AREA))
Marshal.WriteInt16(BaseAddr, Offset, CType(value.s1, Short)) ' ここをまとめたい
Marshal.WriteInt16(BaseAddr, Offset + Marshal.SizeOf(value.s1), CType(value.s2, Short)) ' まとめたいよ
End Set
End Property 'stSub2 と stSub3 も同様 オフセットを間違えないように!!
End Structure
Public stArea As ST_AREA
Declare Function MemOpen Lib "xx.dll" (ByRef Address As IntPtr) As Integer
Private Sub BtnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOpen.Click
Dim iRes As Integer = MemOpen(stArea.BaseAddr)
stArea.s1 = 10 'テストですよ
End Sub
SetのWriteInt16を一行にまとめたいとこですが思いつかなかったのでこんなです。
相手側アプリとの確認も取れました。VBむずかしいです orz
ありがとうございました〜

319 名前:291 mailto:sage [2009/07/01(水) 16:00:09 ]
XXX = stArea.s1
はできたけど
stArea.s1 = 10
はできてなかったorz
まぁでも何とかなりそうです^o^



320 名前:デフォルトの名無しさん [2009/07/03(金) 20:13:21 ]
XmlDocumentのSaveメソッドで「'」を「'」として書き出す方法ってないのかな?


321 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 20:51:09 ]
ウィンドウと内部処理(DLL)を別のプロジェクトで作成しました。
質問は、DLLからFormに張ってあるコントロールのプロパティを変更する方法です。
Labelの文字を変える程度でいいのですが。

よろしくお願いします


322 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 21:19:41 ]
>>321
フォームから DLL にコントロールの参照を渡してやれば OK

323 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 22:15:41 ]
VS2005です

ユーザーコントロールにDataGridViewを貼り付けてColumnを2つ追加しました
これにイベントハンドラを記述するとユーザーコントロールのコンパイルは通りますが
コントロールの読み込み時にエラーが発生します

'RowsAddedイベントハンドラ
Private Sub DataGridView1_RowsAdded(ByVal sender As Object, _
ByVal e As DataGridViewRowsAddedEventArgs) _
Handles DataGridView1.RowsAdded
DataGridView1.Sort(DataGridView1.Columns(1), ListSortDirection.Descending)
End Sub

列のSortModeがNotSortableに設定されているとき
列ヘッダーのSortGlyphDirectionをDesendingに設定することはできません
というエラーが出てるようですが、プロパティではSortModeはAutomaticになってます

ほわい?

324 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 22:28:19 ]
なってます、ってどうやって確認したの?

325 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 22:34:02 ]
>>324
ありがとうございます。
DataGridviewの設定はすべてデザイナでやってますので

326 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 22:37:02 ]
改行したら送信してしまいました
つづきです

デザイナでやってて、Columnもデザイナであらかじめ追加してます
デザイナ上でのプロパティではAutomaticになっております

327 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 22:47:38 ]
とりあえず、デザイナで設定したプロパティは忘れて、

'RowsAddedイベントハンドラ
Private Sub DataGridView1_RowsAdded(ByVal sender As Object, _
ByVal e As DataGridViewRowsAddedEventArgs) _
Handles DataGridView1.RowsAdded
If ...SortMode <> NotSortable Then
 DataGridView1.Sort(DataGridView1.Columns(1), ListSortDirection.Descending)
End If
End Sub

みたいにしてみるとか、エラーが出たときにウォッチしてみるとか、
その辺で確認してみたら?

328 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 23:07:50 ]
了解っす

329 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 00:02:23 ]
うまく行きました!
データがない状態の時NotSortableになってんのかな?
ありがとうございました



330 名前:デフォルトの名無しさん [2009/07/04(土) 00:19:06 ]
>>320
そんなに大きくないならStringWriterで文字列に書き出して置換すれば

331 名前:デフォルトの名無しさん [2009/07/05(日) 14:28:39 ]
DataGridViewにdataset内部でリレーションシップを設定したTableA TableBのフィールドを表示したいんです

TableAとTableBは1対多結合になります
フィールドは同一のDataGridViewで表示したい
TaleBを連結したDataGridViewに非連結列を追加してTableAのフィールドを検索して貼り付けることはできそうですが
なんかデザイングリッド上でぱぱっとやれそうな気がしておたずねしました

何とぞよろしくお願いいたします






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<199KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef