VB.NET質問スレ(Part30) ..
[2ch|▼Menu]
232:デフォルトの名無しさん
09/06/25 16:30:58
RDBの流儀でいえばこんな感じのスキーマになると予想

スケジュール表 [ 日付, 業務種別ID, 実業務ID ]
業務マスタ [ 業務種別ID, 業務名, 実業務テーブル名 ]
(実業務表) [ 実業務ID, 必要な情報・・・ ] ←業務ごとに作成


233:デフォルトの名無しさん
09/06/25 17:39:47
>>225
プログラムで動的にSQLを生成して実行する
フィールド名も動的に変更できる

>>229
今回の要件なら、俺でも1−12月のフラグと1−31日のフラグもつかもしれない
まあ、ホントは後で書くスキーマのようにするのが正解だろうけど

>>232
登録するのは、業務の繰り返し頻度であって、業務のスケジュールそのものじゃないぞ
そのスキーマだと、日ごとスケジュールの生成って作業が必要だな
そして繰り返し頻度を変更した場合、今あるスケジュールを全部けして再生成
さらに何年先までのスケジュールを生成していいのか不明

俺の予想スキーマ

業務マスタ(業務ID,業務名,その他必要な内容)
業務頻度月(業務ID,業務実行月)
業務頻度日(業務ID,業務実行日)

指定月日の業務を知りたければ、この三つを業務IDでjoinして
業務頻度月.業務実行月=指定月日の月 and 業務頻度日.業務実行日=指定月日の日 を検索

まああれだ。DB設計の話は板違いだな

234:デフォルトの名無しさん
09/06/25 22:34:03
DBも気になるけどチェックボックスが大量に並んでいる画面を想像してぞっとした
あ、チェックボックスのリストコントロールとかもあるか・・・

235:デフォルトの名無しさん
09/06/26 04:16:35
大量って言っても、12個+31個だからなぁ

カレンダー系のマスタメンテとかで、31個のチェックボックスを
並べるのなんて結構やってるし

まあしかし、>225からここまで1回もvb.netって言葉が出てないじゃないかw


236:デフォルトの名無しさん
09/06/26 13:36:39

おい、出すなよ。

237:デフォルトの名無しさん
09/06/26 16:00:18
DB的な使い方をしない前提なら、
スポットで1日分だけ読み込もうとせずに、
1年分くらい全部読み込んでおけってことになるね。

238:デフォルトの名無しさん
09/06/26 18:18:29
VB.NETでスレッドを扱いたいんです。
同時に20個ほどスレッドを起動させ終了を待ちたいのですが、
どうすればいいのでしょうか?
.joinでは無理ですよね?
よろしくお願いします。

239:デフォルトの名無しさん
09/06/26 18:21:09
別にJoinでも問題ないと思うが

240:デフォルトの名無しさん
09/06/26 18:49:10
そんなにスレッド起動させてどうすんの?
SNS巡回ツールでも作んの?


241:デフォルトの名無しさん
09/06/26 23:46:59
大量のラベルコントロールを書き換えがしたくて
label1 label2 label3...のような感じで連番にして繰り返し処理で
一気に書き換えようと思うのですが思うようにできません
target = Cobj("label" & i) のような感じにしたのですが
エラーが出てとまってしまいます
どうしたらよいのでしょうか?

242:デフォルトの名無しさん
09/06/27 00:02:44
>>241
label1 label2 label3...をListに入れる

243:デフォルトの名無しさん
09/06/27 00:03:16
テンプレに入れたいぐらい良く出るな、この類の。

配列に入れとけ

244:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/27 00:34:12
正直、こんな命令があったんだとか
こんな使い方があったんだとか
他人のプログラムやサイトを見て知ることが多く
それを踏まえてみると自分の書いたコードがとても無駄だったみたいな経験があるんですが

みなさんはどうやって、こんな命令があるこんな使い方があるみたいなものを学んでるんですか?

246:デフォルトの名無しさん
09/06/27 00:36:46
MSDNのサンプルを読破しようと思ったこともありました
挫折しました
というわけで他人のプログラムやサイトw

247:238
09/06/27 01:31:43
>>238です
スレッドが終わるタイミングはまちまちです。
終わったスレッドから終わったあとの処理をしていきたいのです。
.joinだと制御が戻ってこないので困っています。

248:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/27 02:16:37
>>248
Static (Visual Basic)
URLリンク(msdn.microsoft.com)(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:デフォルトの名無しさん
09/06/27 02:28:03
>>249
thnx
staticなのにインスタンス別とは・・・

251:デフォルトの名無しさん
09/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
09/06/27 08:11:33
皆さん、教えていただきありがとうございました。
DBの設計を見直した方が良かったのですが、時間的な関係で今回はこのまま行く
事になりました。
結局プログラムでレコード1件ずつ読み込んで、指定日付の月、日に
対応するフィールドそれぞれのデータがtrueなら取得。
取得したデータを別テーブルに追加していってスケジュール表を作りました。

申し訳ないのですが、別のことでもう少し教えて頂きたい事があります。
スケジュール表を更新した日付等、ちょっとした情報を保存しておきたいのですが、
その為だけにわざわざ新しいテーブルを作るっていうのはおかしいですか?
保存しておきたい情報としては、更新日付、いつから〜いつまでのデータを
スケジュール表に取得しているかという情報くらいです。
スケジュール表は3種類あるので保存するレコード数は3件以上には絶対にならないので
たった3件の情報の為だけのテーブル作るっていうのは、変なのかなと思いまして
皆さんのご意見をいただけたらと思います。
お願いします。

253:デフォルトの名無しさん
09/06/27 11:14:59
DBを使うのはやめてOSファイルに書き出すのはどうだろう。
DataSetに全部突っ込んでテキスト(XML)で保存するのもいいアイデアだと思う。

254:デフォルトの名無しさん
09/06/27 12:59:33
いい加減、VB.NET関係ない話は該当するスレ(板)で聞け


255:225
09/06/27 15:13:48
>>254
VB.NETで作ってるので、関係ないとは一概に言えないと思います。

256:デフォルトの名無しさん
09/06/27 15:30:58
関係ないだろ。

257:デフォルトの名無しさん
09/06/28 13:18:40
>>252
書いてあることだけみると、他の人のアドバイスを元にDBから作り直せば3時間くらいで作れそうな気がするんだけど、
それでも「時間的な関係で」って結局そのままつくり続けるならここで聞く意味ないんじゃないか?

とりあえず更新日付等の情報を保存するためにテーブルを作るのは別に問題ないと思うけど、その程度の情報なら、
更新が起きたときにそのテーブルのレコードをUPDATEするんじゃなくて、INSERTしてログ的な使い方のほうが、そのデータをほしいって言った人の要求に近いんじゃないか。

更新対象のスケジュール日付、更新した人、作業内容(追加、修正、削除等)、更新日

みたいな感じのログにしておけば当面の要求はこなせると思う。
毎月1日実行のスケジュールを追加したら12個ログができるような感じで。

業務スケジュールっていうことだし、多分そんな頻繁に変更がないから、容量もそんなにくわないと思う。

258:デフォルトの名無しさん
09/06/28 15:03:59
質問させてください。
vb.netで開発したwebサイトを実行環境から確認しようと
IISを利用してアクセスしたのですが、
以下のようなエラーが出てしまいました。


BC40056: インポート 'Oracle.DataAccess.Client' で指定された名前空間または型が、
パブリック メンバを含んでいないか、または見つかりません。
名前空間または型が定義されていて、
少なくとも 1 つのパブリック メンバを含んでいることを確認してください。
また、インポートされた要素名がエイリアスを使用していないことを確認してください。


開発環境からは正常に実行できていたのですが、
実行環境からだとこのようなエラーが出てしまい困っています。
どなたか助けてください。


使用しているソフト等
windows xp
VWD
ODBC
ODP.NET
Oracle11g

259:デフォルトの名無しさん
09/06/28 15:07:36
machine.config か web.config に参照設定を記述しろ、ってなかったか?

260:258
09/06/28 15:20:02
>>259
「参照設定を記述しろ」っていう表示はどこにもなかったです。

261:デフォルトの名無しさん
09/06/28 16:03:09
URLリンク(otndnld.oracle.co.jp)

とかは違う? IIS への発行はどうやったの? 実行環境に、Oracle のクライアントはインストールしてある?

262:258
09/06/28 16:17:05
>>261
IISへの発行は、コントロールパネルの「プログラムの追加と削除」→「コンポーネントの追加」からIISを追加して、
ネット検索を経て、設定を済ませました。
URLリンク(<)ローカルホスト> でIISが表示されるようになっています。

OracleDBサーバーと、実行環境が同じPC上で行われています。
Oracle11gがインストールされているPCなので、
Oracleクライアントは必要ないかと判断しました。

また、リンク先のページを拝見しましたが、いまいち理解ができません;


263:デフォルトの名無しさん
09/06/28 16:21:00
んで、開発環境と実行環境は別 PC なのね?
どちらも 32ビット?

Oracle DB が入ってても、クライアントがインストールされてなきゃダメ。
まずはそこを確認してみて。

264:258
09/06/28 16:27:54
>>263
ありがとうございます。
開発環境と実行環境は別PCです。
どちらも32ビットです。

今からOracleクラインアントを
OracleDBサーバーにしているPCにインストールしてみまつ。

265:258
09/06/28 16:49:52
>>263
確認したのですが、OracleDBサーバーにしているPCに
クライアント10gがすでにインストールされていました。



266:デフォルトの名無しさん
09/06/28 17:52:33
皆さんは帳票の出力はCrystalReportを使用してますか?
現在帳票はACCESSで使用しています。
今回、フォームをVB.NETで作成しなおし、DBはACCESSを使用することにしました。
帳票がかなり複雑でビジュアル的にも良くできているのですが、それを
VB.NETで作り直すのがかなり困難だということをひしひしと感じております。
皆さんだったらどうしますか?

267:デフォルトの名無しさん
09/06/28 18:00:13
クリリポ、Active Reports、iText あたり。

268:258
09/06/28 18:09:14
Oracleクライアントはインストールされているのですが、
未だに上手くいきません。

269:266
09/06/28 18:10:13
ActiveReoprts良さそうなんですが会社で買うことが出来ないので
無料ツールはありませんか?

270:デフォルトの名無しさん
09/06/28 18:14:35
どうもこうもPrintDocumentでガシガシ書くだけだわな

271:デフォルトの名無しさん
09/06/28 18:15:41
つーかこのage厨は…

272:デフォルトの名無しさん
09/06/28 18:21:47
>>268
アプリの web.config はどうなってんの?

273:258
09/06/28 18:28:44
>>268
すみません。
「どうなってんの?」というのは具体的にどの部分のことを指しているのでしょうか?

274:デフォルトの名無しさん
09/06/28 18:32:13
つーか、参照設定がおかしいんじゃね? って言われてるんだから、
そこを調べろよ。

275:デフォルトの名無しさん
09/06/28 18:38:01
まぁ、どうやって調べたらいいんですか? とかだろうなw

276:258
09/06/28 18:44:03
>>274
参照設定は既に設定済みです。
「.NET」タブから一覧を表示させ、
「Oracle.DataAccess」が追加されています。

277:デフォルトの名無しさん
09/06/28 18:46:11
それは開発環境の話だろ・・・

278:258
09/06/28 18:56:37
>>277
すみません。
勘違いしておりました。
どの箇所の参照設定なのか教えて頂けますでしょうか?

279:デフォルトの名無しさん
09/06/28 19:14:42
ここで質問したからには、
他コミュで質問できないからな?
某掲示板や某フォーラムなどですると
「マルチ禁止!」のレスがつくからな
気をつけろよ・・・



280:266
09/06/28 19:59:32
PrintDocumentとCrystalReportはどちらの方がおすすめですか?
今回私の作りたいのは、1週間のスケジュール表になります。
日ごとに四角の枠を配置し、その中にその日の予定をテーブルから
書き出すことになります。
CrystalReportでとりあえず作ってみたものの、印刷プレビューで表示
すると実際の配置とかなりずれて表示されるので、本当に実現できるのか
不安になってきました。
予定表のテーブルから日をキーにしてレコードを取得後、日(曜日)ごとにDataSetを
作成してデータを突っ込んでます。
1週間分なので曜日のDatasetが7個できる形になります。
それをCrystalReportに渡して、曜日ごとの枠に収まるようにレコードを入れていきたい
のですが、全然綺麗に配置出来ないし、途方も無い作業でへこんでます。
だからといって皆さんに愚痴ってもしょうがないんですが、あまりにもレポート機能が
しょぼすぎて、ACCESSよりも劣ってるなんて残念でしょうがないです。
基本的にやり方としては間違ってないですか?

281:デフォルトの名無しさん
09/06/28 20:11:56
ある程度フォーマットが決まってるならクリリポ。
変なフォーマットなら、自由度の高い PrintDocument だな。

282:266
09/06/28 20:14:30
>>281
PrintDocument使うって事は、コードのみで書いていくんですよね・・・
例えば、エクセルで作るような表(網掛けなど)も可能ですか?

283:デフォルトの名無しさん
09/06/28 20:17:10
Box の塗りつぶしでできるレベルだな。

つーか、Access がいい、っていうなら、Access でやれよ。

284:デフォルトの名無しさん
09/06/28 20:29:01
>>278
Web.configにいろんなDLLの参照設定が書かれてないか?
それとサーバにODP.NETはインストールしてるのか?


285:266
09/06/28 20:36:31
>>283
会社でVB.NETで作るっていることに決まったんで、
ACCESSで作る事ができません・・・

286:デフォルトの名無しさん
09/06/28 20:43:33
だったら文句言わずにやれよ。
文句言うくらいなら、会社のやつらを説得すればいい。

287:266
09/06/28 21:01:55
>>286
はぁ?CrystalReportで作ってるってさっきから言ってるだろう。

288:デフォルトの名無しさん
09/06/28 21:08:20
じゃ、Crystal Reports スレでも行けよ。スレ違いだから。

289:266
09/06/28 23:04:43
こりゃしっけいいたしました

290:266
09/06/28 23:13:36
ってCrystalReportすれないじゃないか。騙された。

291:デフォルトの名無しさん
09/06/29 12:18:06
先生方〜馬鹿な私にアドバイスをください orz

VC++2008のWin32プロジェクトで開発した共有メモリのDLLを
VB.net2008から呼び出すプログラムを製作しています。

DLL内部で保持している構造体を参照渡しして共有する仕組みです。
ですが、下記記述だと構造体内部の配列(stSub1〜3)が
Nothingの状態になったままです。VB初心者の私にアドバイスをお願いします
ちなみにOSはWinXPです。よろしくお願いします。

※記述は改行数の関係上、次の書き込みに書きます

292:291
09/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
09/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
09/06/29 13:05:52
293のPublic Structureは
ST_AREAじゃなくST_SUBだった o..rz


295:デフォルトの名無しさん
09/06/29 13:37:07
MSDNのアンマネージ コードとの相互運用の中にあるサンプルみれ

296:デフォルトの名無しさん
09/06/29 21:11:52
そもそも違うプログラム同士で、変数の値などを共有(メモリの共有)をするにはどうしたらいいんでしょうか?
どこかに解説サイトないでしょうか

297:デフォルトの名無しさん
09/06/29 22:55:08
つーか、宣言が全然おかしいじゃん。

メモリマップドファイルとか、プロセス間通信系かな。>共有

298:291
09/06/30 09:34:04
>>295
ありがとです。
PVOID*なのでクラスにしてちと試してみます

>>296
C++ならCreateFileMappingとかあるみたいですよ。
ほかの言語はわかりません。


299:291
09/06/30 10:34:29
連続申し訳ないです。。。

C言語なら

ST_AREA *pStArea
MemOpen(&pStArea);
pStArea->stSub1[3].s2 = 10;

とかやれば直接書き込みできるのに
VBってこういうことできないんですか?

IntPtrのようなもので受け取らないとだめですかね?

300:デフォルトの名無しさん
09/06/30 10:52:14
つ「構造体のサンプル」

301:291
09/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
09/06/30 13:54:35
End StructureじゃなくてEnd Classだ o...rz

Openしたときは最後に書き込んだ値が取れます。
VB側から書き込んでも相手の値は変わらず。。。

303:291
09/06/30 16:17:43
お、落ち着くんだ私。

Declare Function MemOpen Lib "xx.dll" (ByRef Address As ST_AREA) As Integer
だな。

Cで書かれてるDLLの引数の型がPVOID*だから構造体でなくクラスで合ってると思うけど
オープンした時のみ値が取得できる状況です。。。

助けてティーチャー orz

304:デフォルトの名無しさん
09/06/30 16:31:44
ByValArrayは構造体専用
構造体にしてByRef IntPtrで受けるか、配列の要素を全部フィールドに展開するか

305:デフォルトの名無しさん
09/07/01 02:11:46
DataSetてどういう場合に使用するものなのでしょうか?
mdbファイルにadoを使いデータを抽出(SQL文を使用)
この抽出結果を一時的に保管しておく器とかに使うものなのでしょうか?

306:デフォルトの名無しさん
09/07/01 07:34:02
>>303
> Cで書かれてるDLLの引数の型がPVOID*だから構造体でなくクラスで合ってると思うけど

意味がわからん。P/Invoke のサンプルからやり直せ


307:デフォルトの名無しさん
09/07/01 07:34:13
>>305
そんな感じ。

308:デフォルトの名無しさん
09/07/01 10:02:21
>>306
ポインタへのポインタが必要だから参照型(構造体ではなくクラス)の参照渡しにすればいいんだよ
理屈は間違ってない

309:デフォルトの名無しさん
09/07/01 10:39:35
>>305
SQLでの問合せの結果(複数行)をとっとくのがDataTable、
DataSet は DataTable のコレクション+αの機能。

310:デフォルトの名無しさん
09/07/01 10:41:48
>>308
すごく…おかしいです。

311:デフォルトの名無しさん
09/07/01 10:57:19
おかしいも何も、MSDNに書いてある

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

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

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

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

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

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

315:314
09/07/01 12:03:44
アドレス固定したら結局IntPtrで渡すことになるな
一行目撤回

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

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

318:291
09/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
09/07/01 16:00:09
XXX = stArea.s1
はできたけど
stArea.s1 = 10
はできてなかったorz
まぁでも何とかなりそうです^o^

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


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

よろしくお願いします


322:デフォルトの名無しさん
09/07/03 21:19:41
>>321
フォームから DLL にコントロールの参照を渡してやれば OK

323:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/03 22:28:19
なってます、ってどうやって確認したの?

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

326:デフォルトの名無しさん
09/07/03 22:37:02
改行したら送信してしまいました
つづきです

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

327:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/03 23:07:50
了解っす

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

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

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

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

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

332:デフォルトの名無しさん
09/07/05 15:31:23
ググっても見つからないので質問させてください。
Textboxに入力されたデータから特定の行(ex:15行目から20行目)だけを取り出したいのですが、何か方法はないでしょうか?
よろしくお願いします。

333:デフォルトの名無しさん
09/07/05 15:36:17
>>332
どう検索したのか興味がある

Linesから適当に取得すればいいっしょ

334:デフォルトの名無しさん
09/07/05 15:50:04
>>333
初心者故に文字列の取得方法が分かりません。
申し訳ないです。

335:デフォルトの名無しさん
09/07/05 16:16:51
答え出てるじゃんw

336:デフォルトの名無しさん
09/07/05 16:18:49
DataGridViewをほぼ同じような表な形で印刷したいのですが、自分でライン書いて表の中のデータを書くというっ事をしなければならないんでしょうか?
DataGridviewをそっくりそのままの形のレイアウトで印刷してくれるようなもっと簡単なのがあってもよさそうなのですが・・・

337:デフォルトの名無しさん
09/07/05 16:22:09
>>335
すいません、Linesはどのように扱えばいいのでしょうか

338:デフォルトの名無しさん
09/07/05 16:24:10
表形式で出力できるレポートツールを使う、ってのが一般的かね。

おれはグリッドそのまま出せてもなんもうれしくないから、必要性を感じないな。

339:デフォルトの名無しさん
09/07/05 16:28:42
>>337
URLリンク(msdn.microsoft.com)

↑を見て、何がわからないのかきちんと説明しろ。

340:デフォルトの名無しさん
09/07/05 16:54:21
>>339
ごめんなさい
これを別のTextboxに出力させる方法が分かりません。

Dim counter as Integer
'Create a string array and store the contents of the Lines property.
Dim tempArray() as String
tempArray = textBox1.Lines

'Loop through the array and send the contents of the array to debug window.
For counter = 0 to tempArray.GetUpperBound(0)
System.Diagnostics.Debug.WriteLine( tempArray(counter) )
Next

341:デフォルトの名無しさん
09/07/05 16:54:58
Form右上の×ボタン押したときに終了するか確認メッセージ出して、
終了の場合は閉じるようにしたいんですが、closingイベント以外で実装
はできませんか?
今やりたい事は、フォームA→フォームBを呼び出してそこから終了
した場合、上記の確認メッセージを表示して両方のフォームが落ちるようにしたいです。
フォームBを×ボタンで閉じる動作を行うとフォームAをcloseという処理を走らせたい
のですが、フォームAにも上記のclosingイベントを実装する為
フォームB終了確認メッセージ後に、フォームAの終了確認メッセージが表示されてしまいます。
closingイベント内でフラグ立てて回避出来るかなと思ったら、無限ループに陥ってしまい無理でした。
どのような解決方法があるか教えていただけると幸いです。
よろしくお願いいたします。

342:デフォルトの名無しさん
09/07/05 17:19:49
FormB : FormClosingでキャンセルかどうか決める
FormA : FormBのFormClosedで自分をCloseする
    FormClosingでFormBが閉じられたときに呼び出された場合確認ダイアログを出さない

343:デフォルトの名無しさん
09/07/05 17:20:14
>>341
> Form右上の×ボタン押したときに終了するか確認メッセージ出して、
> 終了の場合は閉じるようにしたいんですが、closingイベント以外で実装
> はできませんか?

できない。

> 今やりたい事は、フォームA→フォームBを呼び出してそこから終了
> した場合、上記の確認メッセージを表示して両方のフォームが落ちるようにしたいです。
> フォームBを×ボタンで閉じる動作を行うとフォームAをcloseという処理を走らせたい

Closing イベントで閉じられる理由を確認すればいいんじゃね?

344:デフォルトの名無しさん
09/07/05 17:21:03
>>340
ってことは、取得する方法はわかったわけだ。

設定したいなら、「別のTextBox.Text = 取得した値」でOK。

345:デフォルトの名無しさん
09/07/05 17:27:40
>>331ですけど
ソースコードでテーブルをもう一つ作ってマージするって方法は見つけました

それが正解でしょうか?

コーディングなしで2つのDataGridViewで親子テーブルを作る例はいっぱいありましたが
それを単一のDataGridViewで表示するのって逆に難しいんですね

346:デフォルトの名無しさん
09/07/05 17:37:31
>>344
Dim counter As Integer
Dim tempArray() As String
  tempArray = textBox1.Lines

For counter = 0 To tempArray.GetUpperBound(0)
TextBox2.Text = tempArray(counter)
Next

こういうことでしょうか?
行数はFor counter = 0 To tempArray.GetUpperBound(0)の数値をいじればいいのですよね?

347:341
09/07/05 17:58:28
FormBの処理
FormB Closingイベントで確認ダイアログ表示
NOを返す→e.cancel=true (これでキャンセル)
YESを返す→FlgをtrueにしてFormA.close

FormA
上記のFormA.closeによって、FormAのClosingイベントが呼び出される。
FlgがTrueの場合、Closingイベント内の確認ダイアログはスルー。

私としては、上記の内容でいけると思ってたんですが、
FormA.Closeを実施のところで、何度も確認ダイアログが表示され
無限ループに陥っているようでした。

また、FormBのclosingイベント内に確認ダイアログをもうけないで
FormA.closeのみおいてみると何故か無限ループでエラーが出てしまいます。
その際、FormAにはClosingイベントはおいてません。
どなたか理由がわかる方いませんか?

348:336
09/07/05 18:18:31
>>338
>表形式で出力できるレポートツール
とは、どういうものなのでしょうか?

クリスタルレポートとかそういうものですか?
私は今、Vb2008を使ってるんですが、コントロールの一覧の中にCrystalreportがないのですが、なにか設定がいるんですかね

349:デフォルトの名無しさん
09/07/05 18:44:20
>>346
取得する行が決まってるなら、ループで回す必要はない

>>347
わかりづらいから、きちっとコード出してみ?

>>348
おまえさんの言うとおり、クリスタルレポートとか。
Edition によっては含まれてないんじゃない?

350:デフォルトの名無しさん
09/07/05 19:45:30
>>349
できました
ありがとうございます。

351:デフォルトの名無しさん
09/07/05 20:33:55
初期画面をログイン画面にしたいのですが、ログイン成功時にログイン画面をクローズして別フォームを表示したらフォームが全て落ちます。助けて下さい。

352:デフォルトの名無しさん
09/07/05 20:48:35
別フォームを表示してからログイン画面をクローズする
sub mainからログイン画面を表示する

353:336
09/07/05 23:12:53
>>349
Express Editionなんですが、クリスタルレポートは追加できないんでしょうか?

354:351
09/07/05 23:20:33
>>352
メイン画面をログイン画面に設定したらログイン画面落とした時点で
ほかのフォームも全て落ちちゃうんですよね。

355:デフォルトの名無しさん
09/07/05 23:22:20
>>353
URLリンク(www.microsoft.com)

ダメだね。

356:デフォルトの名無しさん
09/07/05 23:36:56
>>354
ログインをメインにするから不味い、ってことだろ。

357:デフォルトの名無しさん
09/07/06 01:28:08
>>331ですが、データソースを見るとリレーションが効いて
親テーブルの下に子テーブルが見えてるんですが

こいつをDataGridViewの単一テーブル上に展開できません

tableA
fieldID
fieldA
tableB
fieldID
fieldB

fieldID fieldA fieldB のような表現をしたいのですが・・・やはり無理でしょうか?

358:デフォルトの名無しさん
09/07/06 02:13:56
表示用に列一つ追加してExpression使うのが一番楽かな

359:デフォルトの名無しさん
09/07/06 02:24:49
あ、DataColumn.Expressionな

360:デフォルトの名無しさん
09/07/06 10:10:53
>>358
やっぱりそうですか
誰かに言って貰わないと楽ちんな方法を知らずに回り道してるんじゃないかと心配で
先に進めないもので・・・

ありがとうございました

361:デフォルトの名無しさん
09/07/06 11:56:20
>>331
たびたびすみません。

datasetのデザイナで子テーブルにフィールドを追加しフィールドプロパティのExpressionに
TableA.FieldAを設定すると
リレーションシップ0が見あたりません
そこで
parent(リレーションシップ名).FiedlAを設定すると
リレーションシップ名が見あたりません

となります。datasetデザイナ上では確かにリレーションシップを設定してその名前をコピペしてるので間違いないと思うのですが

もしかしてコード上で設定しないといけないのでしょうか?

362:デフォルトの名無しさん
09/07/06 12:14:49
Expression設定してるところでブレークポイント設定して確認すれ

363:デフォルトの名無しさん
09/07/06 13:05:59
>>362
datasetデザイナ上でプロパティを設定してるだけなので・・・・

よっぽどまぬけなことをやってるのかググっても該当するものは出てこず・・・

orz

364:デフォルトの名無しさん
09/07/06 13:19:17
現在のプロジェクトをExpressionで検索してみろよ

365:デフォルトの名無しさん
09/07/06 13:25:32
>>364
やっと意味がわかりました。なるほど・・・

で、やっと設定できました

原因は不明ですが、ビルドしたら親テーブルのフィールドを認識するようになりました

お騒がせしました

366:デフォルトの名無しさん
09/07/06 19:24:59
すみません
VBからTwitterに文字列を投稿する方法はAPI以外にないでしょうか?

367:デフォルトの名無しさん
09/07/06 21:54:39
これがWin32APIの事を指していたら、それはそれで面白いかもしれんね。

368:デフォルトの名無しさん
09/07/06 21:55:30
>>367
TwitterAPIの方です

369:デフォルトの名無しさん
09/07/06 22:15:26
SerialPortにて0.1Sec毎に送受の通信を行っているプログラムなんですが
フォームに配置しているボタンを連打したり、データグリッドを更新させたりしてプログラムに一次的に負荷をかけると、その間だけ送受の通信が止まってしまいます。
ためしにForm2を作ってその別のフォームで単独で通信させていてもForm1にあるボタン等を連打して負荷をかけると同じような結果でした。

こういう問題はどういう風に解決したらよろしいのでしょうか?
どうかご助言のほうをよろしくお願いします。

370:デフォルトの名無しさん
09/07/06 22:35:11
負荷とか関係なく、UIスレッドで通信しているのが原因の予感。
スレッドを分ければ一瞬で解決すると見た。

371:デフォルトの名無しさん
09/07/06 22:35:23
別のスレッドで通信を処理すればいいんじゃね?

372:デフォルトの名無しさん
09/07/06 22:42:11
UIスレッド?ですか
VB2008を使っているのですが、スレッドとはどういう事なのでしょうか?


373:デフォルトの名無しさん
09/07/06 22:50:21
マルチスレッドプログラミングってやつ
原則的に時間のかかる処理は別のスレッドを作ってそっちで動かさないとUIが固まります
特別な技術や注意が必要なのでしっかり勉強しましょう

374:デフォルトの名無しさん
09/07/06 22:51:31
「ワーカースレッド」でMSDN を検索してこい。

375:デフォルトの名無しさん
09/07/06 22:58:14

『.NETマルチスレッドプログラミング 1:スレッドの実行と同期』
URLリンク(codezine.jp)

『.NETマルチスレッドプログラミング 2:非同期デリゲートとスレッドプール』
URLリンク(codezine.jp)

376:デフォルトの名無しさん
09/07/07 04:24:03
ありがとうございます
参考にさせていただきます

なんとなくマルチスレッドの動きは分かったんですが
このプログラムは送信はタイマーイベントで行っていて、受信はCOMのDataRecivedイベントで行っているのですが
この場合、>>369のように停止させたくはないので両メソッドともマルチスレッド化したほうがよろしいんでしょうか?
なかなか複雑そうですね・・。

377:デフォルトの名無しさん
09/07/07 07:47:52
どうせDataReceivedはSerialPortが用意したスレッド上になるのだから、
データを格納した上でControl.BeginInvokeしておけば、
UIスレッドが原因で邪魔されることは無いんじゃないかな。

378:376
09/07/07 19:14:09
>>377
>データを格納した上でControl.BeginInvokeしておけば、
>UIスレッドが原因で邪魔されることは無いんじゃないかな。
すみません・・・もう少し詳しく説明していただけませんでしょうか?

それと思ったのですが
現状のプログラムがDaraRecivedイベントが発生してデータを受け取ったら、そのデータのヘッダ等を確認するためにDaraRecivedイベント内で処理関数(*1)を呼び出して、最終的に変数にデータを格納する処理にしています
そしてフォームに配置したタイマーイベントで、その格納した変数にアクセスしデータを読み取るようにしています。
DaraRecivedイベントから呼び出した上記の(*1)の処理関数もDataRecivedイベントと同じスレッド、つまりフォームが実行されているスレッドとは別で実行されているということなんですよね?

ということは、既に受信処理は別のスレッドで処理されていたということなんですよね
この場合、フォームに配置したタイマーイベントで行っている送信処理のみがフォームと同スレッドな為にフォーム操作時に停止していると判断して
結果的には送信処理のみを別スレッドにすれば問題は解決しそうですね

マルチスレッドについては教わった解説サイトを見て調べるとして
・・・タイマーイベント内の、送信処理を別スレッドにするべきなんでしょうか
それともこのタイマーイベント自体を別スレッドにしないといけないんでしょうか?
タイマーイベントはフォームを操作したとして途切れることはないのかな

379:デフォルトの名無しさん
09/07/07 19:34:19
送信処理を別スレッドにしてみて、改善されるか試してみなよ。
今後のことを考えれば、スレッド使えないと自分が大変なんだからさ。


380:デフォルトの名無しさん
09/07/07 19:46:17
System.Timers.Timerの方を使えば、
勝手に手持ちのスレッドプールからイベントを起こしてくれるから、
スレッドを一から作る必要は無いんじゃないかな。
UIスレッドとは無関係にイベントは発生するから、止まる事も無いはず。

381:デフォルトの名無しさん
09/07/07 22:00:04
Oracleと繋ぐときにOracle Clientを使わない方法って無いんですか?

382:デフォルトの名無しさん
09/07/07 22:02:18
ODP.NETでもODBCでも

383:デフォルトの名無しさん
09/07/07 22:19:17
>>382
ODP.NETやODBCだと、exeの配布先のマシンに
オラクルのクライアントがインストールされていなくても
SQLの実行などができますか?

384:デフォルトの名無しさん
09/07/07 22:25:49
まさか

質問はちゃんと要件をまとめてからしてくれよ

385:デフォルトの名無しさん
09/07/07 22:31:15
>>384
じゃ、exeの配布先のマシンには
Oracleのクライアントソフト(.Net)は必須なんですね?

386:デフォルトの名無しさん
09/07/07 22:34:17
そもそも今現在受信処理と送信処理はちゃんと(うまく)同期とって動いてるの?


387:デフォルトの名無しさん
09/07/07 22:36:04
Oracleのインストールは必須
.NETからOracleへのアクセスはSystem.Data.OracleClientやSystem.Data.Odbcなら標準ライブラリに用意されてる
> Oracleのクライアントソフト(.Net)
って何指してるの?

388:デフォルトの名無しさん
09/07/07 22:36:30
Oracleのクライアントソフト(.Net)ってなんだよ。
Oracleのネイティブなクライアント(OCIとか)と
.NETのプロバイダは別物だぞ。

さらにDataDirectなどの、Oracleのネイティブなクライアントが
不要なプロバイダもあることはある。


389:デフォルトの名無しさん
09/07/07 22:39:23
ありがとうございます。
納得しました。

390:デフォルトの名無しさん
09/07/08 16:42:49
VB2005でアプリを開発しています。
あるファイルが他のなんらかのアプリケーションで既に開かれているかどうかを調べるにはどうすれば良いでしょうか?
ファイル名から、そのファイルを開いているアプリケーションが何なのかを知りたいのです。

開発しているアプリからデータを既存のファイルに上書きでエクスポートしようとした時、
他のアプリでそのファイルが開かれていればエラーになってしまうので、どのアプリがその
ファイルを開いているかをユーザに通知したいのです。

どうぞよろしくお願いいたします。

391:デフォルトの名無しさん
09/07/08 16:49:29
無理じゃないかな、ハンドルの継承とかあるし

392:デフォルトの名無しさん
09/07/08 17:01:02
なんかAPIができたときいたことがある

393:390
09/07/08 17:28:25
>>391
>>392
レスありがとうございます。

とりあえず現時点では「ファイルが他のアプリケーションで使用されていないことを確認してください。」と
メッセージボックスを表示しています。

たとえば、開発しているアプリから xls ファイルでエクスポートしてそのファイルが Excel で開かれていれば
ユーザは Excel というアプリを自分で確認してくれるのですが、別のアプリでその xls ファイルを読み込んで
いる場合、ユーザはその xls ファイルが開かれているということに気づきにくいみたいですので、どのアプリが
その xls ファイルを開いているのか通知したいんです...

openfiles というコマンドがあるみたいですが、これは非公開APIを使用しているかも...みたいな記述は
見かけました。
ただこのコマンドを使用するにはシステムのパフォーマンスが低下する可能性があるとの事(openfiles.exe が
ファイルのトレースを行うのでオーバーヘッドが発生)で、このコマンドを使用するには抵抗があります。
URLリンク(www.atmarkit.co.jp)

何か妙案はないかな...

394:デフォルトの名無しさん
09/07/08 19:55:41
使い終わったらOFFにすればいいんだろ

395:デフォルトの名無しさん
09/07/08 20:47:51
>>393
URLリンク(technet.microsoft.com)(en-us).aspx

これはだめ?

396:デフォルトの名無しさん
09/07/08 20:51:10
VB2008を使用しています。
Form1とForm2を作成し、Form1からForm2を以下のようにして表示させました。

[Class Main]
Public Sub Main()
Application.Run(New Form1)
End Sub

[Class Form1]
Private Sub Form1_Load( 略 )
Form2.Show()
End Sub

Public Sub SetTextBox( str )
TextBox1.Text = str
End Sub

[Class Form2]
Private Sub Button1_Click( 略 )
Form1.SetTextBox("test")
End Sub

このとき、Form2のボタンからForm1のTextBoxに文字列をセットできないのは
Application.RunでNewしているForm1にアクセス出来ていないからでしょうか?

397:デフォルトの名無しさん
09/07/08 20:56:46
>>393
自分が開いてるかどうかなら
COM経由で開いてる文書一覧が取得できなかったっけ?

他PCが開いているかどうかなら
開かれていたらどうしたいのかによるんじゃね?
そもそもExcelが排他かけないんだし…



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

4949日前に更新/199 KB
担当:undef