C# と VB.NET の質問掲示板
ASP.NET、C++/CLI、Java 何でもどうぞ
掲示板トップ
C# と VB.NET 入門
新規作成
利用方法
ツリー表示
トピック表示
ランキング
記事検索
過去ログ
ログ内検索
キーワードを複数指定する場合は 半角スペース で区切ってください。
検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
[返信]をクリックすると返信ページへ移動します。
キーワード
/
検索条件
/
(AND)
(OR)
検索範囲
/
(現在のログ)
(全過去ログ)
(過去ログ1)
(過去ログ2)
(過去ログ3)
(過去ログ4)
(過去ログ5)
(過去ログ6)
(過去ログ7)
(過去ログ8)
(過去ログ9)
(過去ログ10)
(過去ログ11)
(過去ログ12)
(過去ログ13)
(過去ログ14)
(過去ログ15)
(過去ログ16)
(過去ログ17)
(過去ログ18)
(過去ログ19)
(過去ログ20)
(過去ログ21)
(過去ログ22)
(過去ログ23)
(過去ログ24)
(過去ログ25)
(過去ログ26)
(過去ログ27)
(過去ログ28)
(過去ログ29)
(過去ログ30)
(過去ログ31)
(過去ログ32)
(過去ログ33)
(過去ログ34)
(過去ログ35)
(過去ログ36)
(過去ログ37)
(過去ログ38)
(過去ログ39)
(過去ログ40)
(過去ログ41)
(過去ログ42)
(過去ログ43)
(過去ログ44)
(過去ログ45)
(過去ログ46)
(過去ログ47)
(過去ログ48)
(過去ログ49)
(過去ログ50)
(過去ログ51)
(過去ログ52)
(過去ログ53)
(過去ログ54)
(過去ログ55)
(過去ログ56)
(過去ログ57)
(過去ログ58)
(過去ログ59)
(過去ログ60)
(過去ログ61)
(過去ログ62)
(過去ログ63)
(過去ログ64)
(過去ログ65)
(過去ログ66)
(過去ログ67)
(過去ログ68)
(過去ログ69)
(過去ログ70)
(過去ログ71)
(過去ログ72)
(過去ログ73)
(過去ログ74)
(過去ログ75)
(過去ログ76)
(過去ログ77)
(過去ログ78)
(過去ログ79)
(過去ログ80)
(過去ログ81)
(過去ログ82)
(過去ログ83)
(過去ログ84)
(過去ログ85)
(過去ログ86)
(過去ログ87)
(過去ログ88)
(過去ログ89)
(過去ログ90)
(過去ログ91)
(過去ログ92)
(過去ログ93)
(過去ログ94)
(過去ログ95)
(過去ログ96)
(過去ログ97)
(過去ログ98)
(過去ログ99)
(過去ログ100)
(過去ログ101)
(過去ログ102)
(過去ログ103)
(過去ログ104)
(過去ログ105)
(過去ログ106)
(過去ログ107)
(過去ログ108)
(過去ログ109)
(過去ログ110)
(過去ログ111)
(過去ログ112)
(過去ログ113)
(過去ログ114)
(過去ログ115)
(過去ログ116)
(過去ログ117)
(過去ログ118)
(過去ログ119)
(過去ログ120)
(過去ログ121)
(過去ログ122)
(過去ログ123)
(過去ログ124)
(過去ログ125)
(過去ログ126)
(過去ログ127)
(過去ログ128)
(過去ログ129)
(過去ログ130)
(過去ログ131)
(過去ログ132)
(過去ログ133)
(過去ログ134)
(過去ログ135)
(過去ログ136)
(過去ログ137)
(過去ログ138)
(過去ログ139)
(過去ログ140)
(過去ログ141)
(過去ログ142)
(過去ログ143)
(過去ログ144)
(過去ログ145)
(過去ログ146)
(過去ログ147)
(過去ログ148)
(過去ログ149)
(過去ログ150)
(過去ログ151)
(過去ログ152)
(過去ログ153)
(過去ログ154)
(過去ログ155)
(過去ログ156)
(過去ログ157)
(過去ログ158)
(過去ログ159)
(過去ログ160)
(過去ログ161)
(過去ログ162)
(過去ログ163)
(過去ログ164)
(過去ログ165)
(過去ログ166)
(過去ログ167)
(過去ログ168)
(過去ログ169)
(過去ログ170)
(過去ログ171)
(過去ログ172)
(過去ログ173)
(過去ログ174)
(過去ログ175)
(過去ログ176)
(過去ログ177)
(過去ログ178)
(過去ログ179)
強調表示
/
ON
(自動リンクOFF)
結果表示件数
/
20件
30件
40件
50件
100件
記事No検索
/
ON
大文字と小文字を区別する
全過去ログを検索
ヒット / 15件
(1-15 を表示)
<<
0
>>
■3378
印刷ダイアログの制御
□投稿者/ 御苗 -
(2007/05/08(Tue) 20:34:51)
分類:[VB.NET (Windows)]
2007/05/08(Tue) 20:40:00 編集(投稿者)
2007/05/08(Tue) 20:35:57 編集(投稿者)
printdialogで表示する印刷ダイアログのプロパティボタンを押下不可(disabled)にすることは出来ませんでしょうか?
ファイルへの出力やページ範囲は制御出来るのですが、プロパティボタンの制御が出来るかどうかがわかりません。どうぞご教授ください。
親記事 /過去ログ12より /
関連記事表示
削除チェック/
■17245
Java webシステム間連携について
□投稿者/ ま -
(2008/04/20(Sun) 01:53:58)
分類:[.NET 全般]
●システムA(以下A)
某社が開発したかなり安定しているマルチセッション可能なフレームワーク上で動くWebシステム。
見たことも触ったことも無いが、フレームワークの仕様書を見る限りということ。
struts ベース。
●システムB(以下B)
自社開発のかなり不安定なマルチセッション不可能なフレームワーク上で動くWebシステム。
セッション無しでも画面を起動できる点が唯一のポイント。
struts ベース、但し劣化してます。
●システムC(以下C)
自社開発フレームワークで行こうとした矢先に、部長のなじみの会社に案件を吸い取られ、結果自社フレームワークを
土台にしつつも大幅にデチューンしたがシステムBのフレームワークよりも安定しているある意味劣化版フレームワーク
上で動く、マルチセッション不可能なWebシステム。
見習ったフレームワーク自体が悪いのでこれも劣化 struts ベースです。
BとCを現在メンテしているのですが、今度Aが「同一ドメインでなければ出来ない連携」をするためこちらの環境に移行
されようとしています。但し厄介?なことにAの中身を触ることは一切出来ません。
同一ドメインで Aのセッション中のとある画面から showModalDialog 経由で、Bの新規画面を開き、BのDB情報を元に
ある計算を行った結果を、window.returnValue 経由で吸い取ろうという画面連携が実装される予定です。
同一ドメインならば、確かに showModalDialog だろうが、window.open だろうが、なんら関係なしにシステム間で連携でき
ますが、この連携を思いついた方々は静的HTML でのテスト確認しか行っていません。ですので、Aがまだこちらの環境に
移行されていないのですが、BとCを使って、CをAに見立ててBを呼び出す、ということを実際にやってみました。
Cのセッション中のとある画面にボタンを配置し、その画面から 静的HTML経由でBのサーブレットにポストする仕掛け
でやってみました。なぜ静的HTMLを間に挟む必要があるかというと、showModalDialog はフォームのターゲットにはでき
ないためです。
結果、Bをセッションを発行しないモードで起動するとBのJSPを ダイアログ内に表示し、そこで入力した値をCに戻す
ことに成功しました。
これでめでたしめでたしかとおもいきや、処理後、Cの画面で適当に画面遷移操作を行うとCのセッションがどうも壊れている
ように見える挙動が連発して発生し、画面が 404 になったり、1件も無いはずの検索結果が1件表示されたり、まことに怪しい
挙動が確認できました。モーダルダイアログを起動しない状態ではいじる前の普通に操作できる状態であったのでモーダルダイ
アログの起動後になんらかの情報が壊れているのが原因と推測しています。
今時、showModalDialog で画面連携も無いですが、これと同じ境遇に会われた方、居ましたらどんな些細なことでも良いので
その時の対処方法などあればお知らせ願います。
通常、こういうシステム連携というのはありえるのでしょうか?在り得る場合、双方のシステム間でどのようにしてセッションを
共有したりするのでしょうか?セッション・セッションって煩いですが、もしかしてセッションなんぞ関係無いとかそういう落ち
ですか?
もしかして、window.open ならそんなこと有り得ないのでしょうか?showModalDialog は window.open の子画面とはちょっと趣
が異なるのではないか?と愚考しています。
試したことは、
Cのセッション中に、Bをセッション新規で開始 =>結果はNG。どこをいじってもエラー画面しか出てこない。
Cのセッション中に、Bをセッション継続で開始 =>元々のセッションが無いのだから継続しようが無いのでこれもNG。
Cのセッション中に、Bをセッション無しで開始 =>上記の通り。
テスト構成は、
●Bに新規画面のサンプル画面をJSPで作成、サーブレットに初期化処理(静的HTMLからのポストパラメータを取得処理する)追加
●Cのとある画面に showModalDialog を呼び出すJavaScriptを追加、Cのパス配下に、BのサーブレットにPOSTするための静的HTML を
新規作成して追加
showModalDialog の第二パラメータに渡す情報は、
C画面のFORM 要素全てを cloneNode(true) で作成し、コピーを配列にセットして渡しています。
ダイアログ中のフォームにはその配列のノード種別に関係なく、HIDDEN 要素を作ってそれをフォームに追加し、そのフォームを
onload でBのサーブレットへサブミットしています。
cloneNode() でコピると一時的にIDやNAMEが重複することになるのですが、もしかしてこれが悪さしている原因でしょうか?
でもコピったからといって、Cのフォームにそのコピーが存在する訳では無いし、ダイアログ閉じたタイミングですべてのノードは
削除していますし・・・・この確認(cloneNode 以外での実装)はまだ行っていませんのでなんとも言えません。
以上
親記事 /過去ログ34より /
関連記事表示
削除チェック/
■47741
Re[3]: データベースアプリケーションをWEBに載せて共用したい
□投稿者/ ひでこ -
(2010/03/12(Fri) 18:30:40)
ありがとうございました。おかげさまで解決の糸口が見えました。
■
No47740
(ひでこ さん) に返信
> ■
No47720
(はつね さん) に返信
>>■
No47715
(ひでこ さん) に返信
> >>よろしくお願いします
> >>VISUAL C#2008EXPRESSとSQLSERVER2008EXPRESS、Vistaでデータベースアプリケーションを作成しています。
> >>アプリケーションを数台のパソコンで共用、操作したいと思っています。そこで廉価で使いやすいレンタル
> >>サーバー探しています。
>>
>>レンタルサーバーをお探しとのことですが、レンタルサーバー上にSQL Server 2008 Express相当があり
>>それを、VC#でつくったWindowsアプリから直接つなげられるようなところは(断言はできませんが)存在
>>しないと思います。
>>レンタルサーバーではなくアウトソーシングセンターなどではあると思いますので、費用面で問gがな
>>ければアウトソーシングセンターにSQL Serverを設置して、そこに社内から接続するスタイルがよいと
>>思います。でもレンタルサーバーで廉価という価格感だとしたら無理かな。
>>
>>あとは、VC#で作るアプリを、Windowsアプリ+ASP.NET Webサービスと作成し、SQL Server 2008 Express
>>とASP.NET Webサービスをレンタルサーバーにのせて、Windowsアプリからレンタルサーバー上のWebサー
>>ビスを使うという形態もあります。
>>でも、そのWebサービスは注意しないと誰でもが接続してつかえてしまう可能性があるのでユーザ認証を
>>どうするかなどきちんと設計しないといけません。
>>
>>そもそも社内で使うアプリをレンタルサーバーに乗せちゃっていいですか?
>>社内にサーバー立てたり、データセンターを使うようなセキュリティは不要なんでしょうか?
>>
記事No.47715 のレス / END /過去ログ81より /
関連記事表示
削除チェック/
■63321
Re[5]: ビルド時にdllを静的に取り込む設定について
□投稿者/ Azulean -
(2012/08/13(Mon) 21:53:26)
■
No63317
(VB.NETビギナー さん) に返信
> 私のところでは、上記のようなdllのプロパティには「相互運用機能型の埋め込み」という項目がありません。
> これって、COMが提供するものなのでしょうか?だとすると、参照する側としては、どうすることもできないということですかねえ。。。
対象のフレームワークが .NET Framework 4 になっていることが条件です。
VB2010 を使っていても、.NET Framework 2.0 〜 3.5 が対象となるようにプロジェクトのプロパティで設定されているようなら、見つからないかと思われます。
■
No63318
(VB.NETビギナー さん) に返信
> なぜか、CreateObjectを使うと、Interop.*.dll が作られず、作成したexe単独で起動できるようになりました。
> そういうものなのでしょうか。
Interop.*.dll は COM で公開されているクラスを .NET のクラスとして扱えるようにするための定義を集めたものとお考えください。
そういった型を使わない、CreateObject などの手法であれば Interop.*.dll は不要です。
ただし、型が宣言されていないのでコンパイル時にメソッドやプロパティのスペルミス、引数の過不足があってもエラーになりません。実行時に例外として初めてエラーになります。
実行するまで正しいかわからないので、コードの安全性としては悪くなりますが、Interop.*.dll に依存しなくはなります。
記事No.63311 のレス / END /過去ログ106より /
関連記事表示
削除チェック/
■86240
バイナリデータを読んで、日付などの形にする方法について
□投稿者/ へなちょこ -
(2018/01/03(Wed) 00:23:56)
分類:[VB.NET/VB2005 以降]
すみません、たびたび質問をさせて頂きます。
前の質問のご回答で、以下のコードを教えていただきました。
(一部分だけ書かせてもらいます)
reader.ReadBytes(2) '最初の2バイトは読み捨て
Dim len1 As Integer = 2 * reader.ReadByte() '文字1のバイト数
Dim len2 As Integer = 2 * reader.ReadByte() '文字2のバイト数
reader.ReadBytes(4) '次の4バイトは読み捨て
Dim bin1 As Byte() = reader.ReadBytes(len1) '文字列1のデータ
Dim bin2 As Byte() = reader.ReadBytes(len2) '文字列2のデータ
Dim txt1 As String = enc.GetString(bin1)
Dim txt2 As String = enc.GetString(bin2)
この中で、文字1のバイト数として1バイトのデータを読んでInteger型の変数len1に代入
その後、Byte()にしてString型にするという流れを行っていると思うのですが、
このような処理として、以下の事がしたい場合は、どのように書けばよいのか、教えて
頂けないでしょうか?
色々と試してみたところ、「型が変換できません」のエラーが出てしまい、訳が分からなく
なってます....
・8バイト分のバイナリデータを読んで、日付の形にする。(「FILETIME 構造体」という
形のデータだと思います。)
・2バイト分のバイナリデータを読んで、Integer型にする。(10進数の値にしたいと思ってます。)
すみませんが、よろしくお願いします。
親記事 /過去ログ148より /
関連記事表示
削除チェック/
■86241
Re[1]: バイナリデータを読んで、日付などの形にする方法について
□投稿者/ Azulean -
(2018/01/03(Wed) 00:44:46)
■
No86240
(へなちょこ さん) に返信
> このような処理として、以下の事がしたい場合は、どのように書けばよいのか、教えて
> 頂けないでしょうか?
どういった状況・目的で取り組んでいるのかわかりませんが、C 言語のデータ構造の読み方を独学でやりきるのは難しいでしょうし、質問が続いてしまうので、近場に頼れる人がいるならその人に教えてもらった方が良いと思いますよ。
> 色々と試してみたところ、「型が変換できません」のエラーが出てしまい、訳が分からなく
> なってます....
プログラミングは適当に試してもうまくいきません。
このコードでなぜそれができるのか? どういった仕組みなのか? を考察することも必要ですし、時にはいろいろと調べまくってキーワードをなんとか見つけるということも必要かと思います。
(VB.NET だけでうまく見つからないなら、C# 側のキーワードでも探してみて、どういったメソッドが使えそうか、探ってみるとかも必要かもしれませんが…)
> ・2バイト分のバイナリデータを読んで、Integer型にする。(10進数の値にしたいと思ってます。)
我々が数学などで扱う、普通の 10 進数では、1 桁で 0 〜 9 の 10 通りの表現ができ、1234 という数値は 1 * 1000 + 2 * 100 + 3 * 10 + 4 という数式で表現できます。
コンピューターの世界では 1 バイトが 8 ビットで構成されているので、256 パターンの数値表現となります。
256 になると、1つ上の桁=上位バイトに繰り上がり、[01] [00] となるわけです。
また、Intel 系 CPU ではリトルエンディアンが主流なので、下位バイトから順番に書き込む・読み込むことが一般的です。
よって、2 バイトで表現される数値は、以下のような計算で求まります。
Dim result As Integer = CInt(1 バイト目) + CInt(2 バイト目) * 256
> ・8バイト分のバイナリデータを読んで、日付の形にする。(「FILETIME 構造体」という
> 形のデータだと思います。)
こっちの話は「知っているか否か」が鍵になりますね。
FILETIME 構造体は以下のように 4 バイトの型が 2 つ並んだ構造体です。
https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms724284
特にアラインメントなどもなく、8 バイトの連続したデータであることが正しいのであれば、BinaryReader.ReadInt64 で Long 型として読み込み、DateTime.FromFileTime メソッドで DateTime 型に変換すれば楽でしょうね。
記事No.86240 のレス /過去ログ148より /
関連記事表示
削除チェック/
■86242
Re[2]: バイナリデータを読んで、日付などの形にする方法について
□投稿者/ へなちょこ -
(2018/01/03(Wed) 14:06:11)
ご回答ありがとうございます!
> どういった状況・目的で取り組んでいるのかわかりませんが、C 言語のデータ構造の読み方を独学でやりきるのは難しいでしょうし、質問が続いてしまうので、近場に頼れる人がいるならその人に教えてもらった方が良いと思いますよ。
おっしゃる通りです。近場に頼れる人がいれば、聞くことができるのですが、残念ながら該当する人がいない状態です.....。そのため、こちらで助けを求めさせていただいている次第です....
「C 言語のデータ構造の読み方」が分かっていないことが分かりました。ありがとうございます。
> プログラミングは適当に試してもうまくいきません。
> このコードでなぜそれができるのか? どういった仕組みなのか? を考察することも必要ですし、時にはいろいろと調べまくってキーワードをなんとか見つけるということも必要かと思います。
> (VB.NET だけでうまく見つからないなら、C# 側のキーワードでも探してみて、どういったメソッドが使えそうか、探ってみるとかも必要かもしれませんが…)
おっしゃるとおりです。
どうやら調べて出てきた情報が理解できないレベルなのが問題だと思います....
使えそうなメソッドの情報が見つかっても、それをどう使えばよいのかで悩んでしまうので....
ただ、今までに教えて頂いたことが元になって、色々と学ぶことができました。
> よって、2 バイトで表現される数値は、以下のような計算で求まります。
>
> Dim result As Integer = CInt(1 バイト目) + CInt(2 バイト目) * 256
ご丁寧に説明していただき、ありがとうございます!
教えて頂いた通りに試したところ、目的のデータが取得できました!ありがとうございます!
> 特にアラインメントなどもなく、8 バイトの連続したデータであることが正しいのであれば、BinaryReader.ReadInt64 で Long 型として読み込み、DateTime.FromFileTime メソッドで DateTime 型に変換すれば楽でしょうね。
こちらもご教授ありがとうございます!
記載して頂いた情報を元に検索をして調べたのですが、「BinaryReader.ReadInt64 で Long 型として読み込み」というのは出来て、以下のような値を入手できるのは確認しました。
バイナリデータ
50 EC 1D 47 C4 70 D2 01 24
↓
Long型で取得した値
131291327456210000
最終的に表示したい実際の日時
2017/1/17 13:19:05
このLong型で取得した値を「DateTime.FromFileTime メソッドで DateTime 型に変換」でよいと思うのですが、以下のサイトの「使用例」をそのまま使うと、変な表示になってしまいます。
https://msdn.microsoft.com/ja-jp/library/system.datetime.fromfiletime
(v=vs.110).aspx
サイトの「使用例」のFunction FileAgeに、引数としてLong型で取得した値をしていすると、以下の結果がでます。
出力結果→「350.15:21:09.8697527」
すみませんが、どうすれば「最終的に表示したい実際の日時」の形にできるか教えて頂けないでしょうか?
記事No.86240 のレス /過去ログ148より /
関連記事表示
削除チェック/
■86243
Re[3]: バイナリデータを読んで、日付などの形にする方法について
□投稿者/ Azulean -
(2018/01/03(Wed) 14:37:57)
■
No86242
(へなちょこ さん) に返信
> すみませんが、どうすれば「最終的に表示したい実際の日時」の形にできるか教えて頂けないでしょうか?
書いても良いですが、一旦考えてもらおうと思って逆質問します。
・TimeSpan 型って何かご存知ですか? →知らない状態であればこの機会に調べてください。
・使用例の FileAge 関数はどういった処理をしていると考えていますか?読み解けませんか?
・"FileAge" という英語から来ている命名から意味を想像できませんか?
記事No.86240 のレス /過去ログ148より /
関連記事表示
削除チェック/
■86245
Re[4]: バイナリデータを読んで、日付などの形にする方法について
□投稿者/ へなちょこ -
(2018/01/03(Wed) 17:39:13)
ご回答ありがとうございます。
> ・TimeSpan 型って何かご存知ですか? →知らない状態であればこの機会に調べてください。
すみません、知りませんでした....
調べてみたのですが、「1時間」といった時間の表現をするものと捕らえました。
> ・使用例の FileAge 関数はどういった処理をしていると考えていますか?読み解けませんか?
> ・"FileAge" という英語から来ている命名から意味を想像できませんか?
TimeSpan 型のことを考えて使用例を見たところ、以下の事をしていると考えました。
・「現在の時間」と「ファイル作成時間」を取得後、その差を計算して、ファイルが出来てからどれくらい経過しているかを求めている。
間違っているでしょうか?
上記のことを参考に、以下のようにコードを書いたら、うまく日時情報が取れました!
*「getTime」には、Long型にした8バイトの情報が入っています。
Public Function TimeCal(ByVal getTime As Long) As System.DateTime
Try
Dim Time1 As System.DateTime
Time1 = System.DateTime.FromFileTime(getTime)
Return Time1
Catch exp As ArgumentOutOfRangeException
Throw
End Try
End Function
コード1行目の最後が「System.TimeSpan」だったため、「350.15:21:09.8697527」のような時間が出たのだと思っています。
これで大丈夫だと思っているのですが、おかしな所はありますでしょうか?
記事No.86240 のレス /過去ログ148より /
関連記事表示
削除チェック/
■86247
Re[5]: バイナリデータを読んで、日付などの形にする方法について
□投稿者/ Azulean -
(2018/01/03(Wed) 19:36:41)
■
No86245
(へなちょこ さん) に返信
>>・TimeSpan 型って何かご存知ですか? →知らない状態であればこの機会に調べてください。
>
> 調べてみたのですが、「1時間」といった時間の表現をするものと捕らえました。
>>・使用例の FileAge 関数はどういった処理をしていると考えていますか?読み解けませんか?
>>・"FileAge" という英語から来ている命名から意味を想像できませんか?
>
> TimeSpan 型のことを考えて使用例を見たところ、以下の事をしていると考えました。
> ・「現在の時間」と「ファイル作成時間」を取得後、その差を計算して、ファイルが出来てからどれくらい経過しているかを求めている。
>
> 間違っているでしょうか?
合っています。
age っていうのが年齢とか、そういった意味のある言葉なので、ファイルが作られてからの経過時間という意図で命名しているのでしょうね。
> コード1行目の最後が「System.TimeSpan」だったため、「350.15:21:09.8697527」のような時間が出たのだと思っています。
それだけではないですよね?
Return するものを変更したはずです。
その「1行目の最後」は「戻り値の型」を示すだけであり、実際にはメソッド(関数)の中の「何を返す(戻す)か?」の部分が重要です。
そちらを書き落としていると、認識のずれにつながるので、差分を書き漏らさないようにしましょう。
記事No.86240 のレス /過去ログ148より /
関連記事表示
削除チェック/
■86248
Re[6]: バイナリデータを読んで、日付などの形にする方法について
□投稿者/ へなちょこ -
(2018/01/03(Wed) 23:51:48)
> 合っています。
> age っていうのが年齢とか、そういった意味のある言葉なので、ファイルが作られてからの経過時間という意図で命名しているのでしょうね。
認識があっていて良かったです!
指摘して頂き、ありがとうございました。
お陰で勉強になりました!
> それだけではないですよね?
> Return するものを変更したはずです。
>
> その「1行目の最後」は「戻り値の型」を示すだけであり、実際にはメソッド(関数)の中の「何を返す(戻す)か?」の部分が重要です。
> そちらを書き落としていると、認識のずれにつながるので、差分を書き漏らさないようにしましょう。
なるほどですね。
今後は「何を返すのか?」をキチンと意識して、コードを読むようにします。
やりたいと思っていたことができましたので、この質問は「解決済み」とさせていただきます。
非常に助かりました!
ありがとうございました!
記事No.86240 のレス /過去ログ148より /
関連記事表示
削除チェック/
■86252
Re[5]: バイナリデータを読んで、日付などの形にする方法について
□投稿者/ 魔界の仮面弁士 -
(2018/01/05(Fri) 16:27:34)
■
No86245
(へなちょこ さん) に返信
> Public Function TimeCal(ByVal getTime As Long) As System.DateTime
> Try
> Dim Time1 As System.DateTime
> Time1 = System.DateTime.FromFileTime(getTime)
> Return Time1
> Catch exp As ArgumentOutOfRangeException
> Throw
> End Try
> End Function
動作的には間違いというわけではないのですが、
このコードについて、少しだけ指摘させてください。
実は今回提示頂いたコードというのは、実質的には下記と同等です。
Public Function TimeCal(ByVal getTime As Long) As Date
Return Date.FromFileTime(getTime)
End Function
参考にしたコードを真似ただけでしょうから、上記の書き方になるのも致し方ないのですが、
実際に使う際には、必ずしも例外処理は必要ではありませんし、今回のように
わざわざ Function 化するほどの必要性も無さそうです。
ゆえに今回は、Function を作らずとも FromFileTime メソッドを直接呼び出すだけで十分かと思います。
'x = TimeCal(longValue)
x = Date.FromFileTime(longValue)
以下、上記の書き換えについての補足。
> Public Function TimeCal(ByVal getTime As Long) As System.DateTime
As Long と As System.Int64 は同じ意味ですし、
As Date と AS System.DateTime も同じ意味です。
Integer や Long や Date は、Visual Basic の組み込み型(プリミティブな型)で、
Int32 や Int64 や DateTime は、.NET Framework で用意された共通言語ランタイムの型名です。
どちらを使っても良いのですが、引数が前者表記、戻り値が後者表記で
混在されているのが気にかかりました。
意図的に使い分けているのであれば良いのですが、もしかしたら
Date 型の存在をご存じなかったのでは…ということで紹介しておきます。
左側が .NET Framework で対応するデータ型で、
右側が Visual Basic が組み込みで持っているデータ型の名前です。
ここでは右側(組み込み型)のアルファベット順に列挙してみました。
System.Boolean 構造体 / Boolean 型 (ブール型)
System.Byte 構造体 / Byte 型 (バイト型)
System.Char 構造体 / Char 型 (文字型)
System.DateTime 構造体 / Date 型 (日付型)
System.Decimal 構造体 / Decimal 型 (10 進型)
System.Double 構造体 / Double 型 (倍精度浮動小数点数型)
System.Int32 構造体 / Integer 型 (整数型)
System.Int64 構造体 / Long 型 (長整数型)
System.Object クラス / Object 型 (オブジェクト型)
System.SByte 構造体 / SByte 型
System.Int16 構造体 / Short 型
System.Single 構造体 / Short 型 (単精度浮動小数点型)
System.String クラス / String 型 (文字列型)
System.UInt32 構造体 / UInteger 型
System.UInt64 構造体 / ULong 型
System.UInt16 構造体 / UShort 型
これを踏まえた上で、
> Dim Time1 As System.DateTime
> Time1 = System.DateTime.FromFileTime(getTime)
> Return Time1
で使われている System.DateTime を Date 表記に書き換えると、
Dim Time1 As Date
Time1 = Date.FromFileTime(getTime)
Return Time1
のようになります。(ただの別名表記なので、どちらでも結果は一緒です)
また、必ずしも変換結果を変数に受け取る必要は無いので、上記 3 行を
Return Date.FromFileTime(getTime)
と一行にまとめて書くこともできます。コーディングに慣れるまでは
変数に一度受けておいた方が、処理の流れを追いやすいかも知れませんけれどね。
> Catch exp As ArgumentOutOfRangeException
> Throw
> End Try
今回使用した FromFileTime メソッドが ArgumentOutOfRangeException の例外を発生させるケースは
・引数の値が小さすぎる(getTime が 0 未満だった場合)
・引数の値が大きすぎる(getTime が 2650467744000000000 以上の場合)
に限られます。
つまり、最小値と最大値は下記の範囲になります。
Dim 最小値 = Date.FromFileTime(0L)
Dim 最大値 = Date.FromFileTime(2_650_467_743_999_999_999L)
この範囲を超えた場合は、例外処理によって Catch 句に入るわけですが、
先のコードでは、Catch 句で「単に Throw しているだけ」なので、
実際にはこのような例外処理は、ほとんど意味が無かったりします。
記事No.86240 のレス / END /過去ログ148より /
関連記事表示
削除チェック/
■86264
Re[6]: バイナリデータを読んで、日付などの形にする方法について
□投稿者/ へなちょこ -
(2018/01/09(Tue) 21:19:27)
■
No86252
(魔界の仮面弁士 さん) に返信
こちらも返信が遅れて申し訳ございません!
> ゆえに今回は、Function を作らずとも FromFileTime メソッドを直接呼び出すだけで十分かと思います。
>
> 'x = TimeCal(longValue)
> x = Date.FromFileTime(longValue)
なるほど。こんなシンプルなもので十分だったんですね。
確かに、ご説明いただいた通りですね。
> 意図的に使い分けているのであれば良いのですが、もしかしたら
> Date 型の存在をご存じなかったのでは…ということで紹介しておきます。
そういうことなんですね!
全然分かっていませんでした!
「なんで、これには「System.」が付いているんだろう?」って思っていたので、
ご説明いただき、大変助かりました!
> これを踏まえた上で、
>> Dim Time1 As System.DateTime
>> Time1 = System.DateTime.FromFileTime(getTime)
>> Return Time1
> で使われている System.DateTime を Date 表記に書き換えると、
> Dim Time1 As Date
> Time1 = Date.FromFileTime(getTime)
> Return Time1
> のようになります。(ただの別名表記なので、どちらでも結果は一緒です)
>
> また、必ずしも変換結果を変数に受け取る必要は無いので、上記 3 行を
> Return Date.FromFileTime(getTime)
> と一行にまとめて書くこともできます。コーディングに慣れるまでは
> 変数に一度受けておいた方が、処理の流れを追いやすいかも知れませんけれどね。
なるほど。
どちらでも結果は一緒であっても、混乱しないように統一した方が良いですね。
>> Catch exp As ArgumentOutOfRangeException
>> Throw
>> End Try
> 今回使用した FromFileTime メソッドが ArgumentOutOfRangeException の例外を発生させるケースは
> ・引数の値が小さすぎる(getTime が 0 未満だった場合)
> ・引数の値が大きすぎる(getTime が 2650467744000000000 以上の場合)
> に限られます。
>
> つまり、最小値と最大値は下記の範囲になります。
> Dim 最小値 = Date.FromFileTime(0L)
> Dim 最大値 = Date.FromFileTime(2_650_467_743_999_999_999L)
>
>
> この範囲を超えた場合は、例外処理によって Catch 句に入るわけですが、
> 先のコードでは、Catch 句で「単に Throw しているだけ」なので、
> 実際にはこのような例外処理は、ほとんど意味が無かったりします。
例外処理に関しては、これから整理していかなければいけないと思っていたので、考え方が分かり、
大変参考になりました!
他の箇所に関しても、どのような例外があるか考えてみます。
ご丁寧な説明、誠にありがとうございました!
また何か質問してしまうかもしれませんが、その際はご教授いただければ幸いです。
よろしくお願いします。
記事No.86240 のレス /過去ログ148より /
関連記事表示
削除チェック/
■86244
Re[1]: バイナリデータを読んで、日付などの形にする方法について
□投稿者/ Jitta -
(2018/01/03(Wed) 17:36:42)
■
No86240
(へなちょこ さん) に返信
プログラムというのは、pro: 前もって、gram: 書かれたもの、です。
前もって書かれたもの、つまり、する予定のことをあらかじめ書いておくことです。
何を書くのか。コンピュータに対する命令です。
「コンピュータに対する」を、「人」に置き換えてみてもいいでしょう。
「人に、何をするか、伝える」というのが、プログラム。
それをコンピュータが理解できる言語で表したものがプログラムコードです。
ということで、プログラムコードを書く前にプログラムを作りましょう。
すなわち、何を依頼しているのか、理解しましょう。
> reader.ReadBytes(2) '最初の2バイトは読み捨て
> Dim len1 As Integer = 2 * reader.ReadByte() '文字1のバイト数
> Dim len2 As Integer = 2 * reader.ReadByte() '文字2のバイト数
> この中で、文字1のバイト数として1バイトのデータを読んでInteger型の変数len1に代入
> その後、Byte()にしてString型にするという流れを行っていると思うのですが、
len1 には、「1バイトのデータを読んで代入」ではなく、「1バイトのデータを読んで、2倍して、代入」しています。ここで、「2倍」している意図は何でしょうか。
ところで、1行の中にコメントを押し込んでいますが、最近、特に .NET Framework でのコードでは、そういうことは推奨されていません。コメントは1行ごとに「何をしているか」ではなく、プログラム(することの流れ)の中で、「この時点で何を実現するか」を書くようにします。「何をするか」は頻繁に変わりますが、「何をしなければならないか」は、仕様変更に連動するだけです。つまり、仕様をコメントとして書いていけば、コメントとコードの違いがバグとして見えるようになります。
> 色々と試してみたところ、「型が変換できません」のエラーが出てしまい、訳が分からなく
> なってます....
エラーが出たときは、どの行なのかというのが重要な情報です。
記事No.86240 のレス /過去ログ148より /
関連記事表示
削除チェック/
■86249
Re[2]: バイナリデータを読んで、日付などの形にする方法について
□投稿者/ ?????? -
(2018/01/03(Wed) 23:52:29)
解決
記事No.86240 のレス / END /過去ログ148より /
関連記事表示
削除チェック/
<<
0
>>
パスワード/
-
Child Tree
-