C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 >>
■55367  Re[2]: MDBに画像を保存した後、読み込んでPictureboxに
□投稿者/ 魔界の仮面弁士 -(2010/11/28(Sun) 16:03:33)
    No55364 (魔界の仮面弁士) に追記
    
    #region ヘルパーメソッド
    static string Dump(string targetFile) {
       byte[] binImg = File.ReadAllBytes(targetFile);
       return BitConverter.ToString(binImg).Replace("-", "");
    }
    static Image LoadImage(byte[] bin) {
        using (MemoryStream stm = new MemoryStream(bin))
        {
            return Image.FromStream(stm);
        }
    }
    #endregion
    
    OleDbConnection cn = new OleDbConnection(@"
            Provider=Microsoft.JET.OLEDB.4.0;
            Data Source=C:\db1.mdb;
    ");
    /// <summary>デモ用テーブルの作成</summary>
    private void button1_Click(object sender, EventArgs e) {
        cn.Open();
        OleDbCommand cmd = cn.CreateCommand();
        cmd.CommandText = @"
            CREATE TABLE TestTable (
                ID  AUTOINCREMENT(10000, 10)  PRIMARY KEY,
                IMG1 OLEOBJECT NULL,
                IMG2 OLEOBJECT NULL
            );
        ";
        cmd.ExecuteNonQuery();
        cn.Close();
        MessageBox.Show("テーブル作成");
    }
    /// <summary>SQLにデータを埋め込む</summary>
    private void button2_Click(object sender, EventArgs e) {
        cn.Open();
        OleDbCommand cmdINSERT = cn.CreateCommand();
        cmdINSERT.CommandText = @"
            INSERT INTO TestTable (IMG1, IMG2) VALUES (
                0x" + Dump(@"C:\Windows\珈琲カップ.bmp") + @"
               ,0x" + Dump(@"C:\Windows\シャボン.bmp") + @"
            );
        ";
        cmdINSERT.ExecuteNonQuery();
        cn.Close();
        MessageBox.Show("SQLにバイナリを埋め込み");
    }
    /// <summary>パラメータクエリ</summary>
    private void button3_Click(object sender, EventArgs e) {
        cn.Open();
        OleDbCommand cmdINSERT = cn.CreateCommand();
        cmdINSERT.CommandText = @"
            PARAMETERS P1 OLEOBJECT, P2 OLEOBJECT;
            INSERT INTO TestTable (IMG1, IMG2)
            VALUES ( P1, P2 );
        ";
        OleDbParameter P1 = new OleDbParameter("P1", DbType.Object);
        OleDbParameter P2 = new OleDbParameter("P2", DbType.Object);
        cmdINSERT.Parameters.Add(P1);
        cmdINSERT.Parameters.Add(P2);
    
        P1.Value = File.ReadAllBytes(@"C:\WINDOWS\羽毛.bmp");
        P2.Value = File.ReadAllBytes(@"C:\WINDOWS\大草原の風.bmp");
        cmdINSERT.ExecuteNonQuery();
        cn.Close();
        MessageBox.Show("パラメータクエリでバイナリを渡す");
    }
    /// <summary>画像読み込み</summary>
    private void button4_Click(object sender, EventArgs e) {
        cn.Open();
        OleDbCommand cmdSELECT = cn.CreateCommand();
        cmdSELECT.CommandText = @"
            SELECT TOP 1
                ID, IMG1, IMG2 
            FROM 
                TestTable 
            ORDER BY
                ID DESC
        ";
        OleDbDataReader reader = cmdSELECT.ExecuteReader();
        if (reader.Read()) {
            pictureBox1.Image = LoadImage((byte[])reader.GetValue(1));
            pictureBox2.Image = LoadImage((byte[])reader.GetValue(2));
            MessageBox.Show("ID=" + reader.GetInt32(0));
        }
        cn.Close();
        MessageBox.Show("最後に追加された画像の読み取り");
    }
記事No.55358 のレス /過去ログ92より / 関連記事表示
削除チェック/

■55934  Re[1]: このようなビューを作成したいのですが、できますでしょうか
□投稿者/ 魔界の仮面弁士 -(2010/12/18(Sat) 14:02:02)
    2010/12/18(Sat) 14:09:30 編集(投稿者)

    No55933 (にゃん さん) に返信
    > ・あるテーブルのレコードの時間(長整数型)を+1時間し、それにより日付が変わるようなら日付を+1日にする。
    長整数型の時間というのは、どのようなデータを指していますか?
     Dim tm As Long = Now.ToFileTime()
     Dim hms As Integer = Now.Hour * 10000 + Now.Minute * 100 + Now.Second
     Dim totalSec As Integer = CInt(Now.TimeOfDay.TotalSeconds())

    > ・日付(長整数型)が日曜日ならそのレコードは削除する。
    日曜日の判定はできていますか?


    > 処理スピードがかなり遅くなってしまいます。
    日付整数列や時刻整数列の仕様が分かりませんが、それらを日付型の列にまとめる事はできませんか?
    データベース側に、日付型のフィールドを追加できるのであれば、

    SELECT *, DateColumn + 1/24 AS 日付列 FROM TBL
    WHERE WEEKDAY(DateColumn + 1/24, 1) = 1

    のような問い合わせを行う事で、望むようなビューを得られるかと思います。
    # 日付列(整数)/時刻列(整数)の型定義を変更できない場合は、
    # 日付型フィールドとの連携について考慮する必要がありますけれども。


    SELECT とした結果としてでは無く、テーブルの内容自体を更新するのだとすれば、
    こんな感じでしょうか。

    '日時に+1時間
    cmd = con.CreateCommand()
    cmd.CommandText = "UPDATE TBL SET DateColumn = DateColumn + 1/24"
    cmd.ExecuteNonQuery()

    '日曜日は削除
    cmd = con.CreateCommand()
    cmd.CommandText = "DELETE FROM TBL WHERE WEEKDAY(DateColumn, 1) = 1"
    cmd.ExecuteNonQuery()



    > 現在は直接、そのテーブルにUPDATE、DELETEをしているのですが、
    更新処理を行いたいのでしょうか。それとも、ビューとして結果を得るだけで良いのでしょうか。

    > 仕様変更がたびたびあり、今後もデータが増えていくので、どうしても対応が難しくなってきている状態です。
    話の内容が具体的ではないので、どのような点で困っているのかが見えませんが、
    DataSet で無いと無理というのであれば、選択肢はほぼ無いと思います。

    データ更新が必要だが、SQL で一括処理できず、パフォーマンスも必要という事であれば、
    ADO.NET の利用を避けて
     (案1) DAO でテーブルタイプのRecordsetオブジェクトを使って更新する。
     (案2) ADODB で、adCmdTableDirect 指定のキーセットカーソルを用いて更新する。
    あたりでしょうか。
記事No.55933 のレス /過去ログ94より / 関連記事表示
削除チェック/

■55928  Re[2]: プログレスバー
□投稿者/ vbの質問 -(2010/12/18(Sat) 10:58:36)
    No55927 (魔界の仮面弁士 さん) に返信

    魔界の仮面弁士 さんご回答ありがとうございます。
    申し訳ございません。現状のことばっかり考えていまして、間違った記述をしてしまいました。

    vbコントロールのプログレスバーはフォーム移動中もしょりは問題なく進みます。
    vbコントロールのデザインがいやで、滑らかに表示させたかったので(vb.net2003を使用しています)

    たとえば最初に四角を書いて

    Dim g As Graphics = PictureBox1.CreateGraphics()
    Dim rect As Rectangle

    For i As Integer = 0 To 100000
    rect2 = New Rectangle(20, 20, i * 0.001, 10)
    g.FillRectangle(Brushes.Green, rect)
    Next

    などのような記述をしています。また、滑らかに表示する為にオーナードローという手段を使ってもfor文を使った進捗のさせ方で結局つまずいてしまいまして、他の手段、あるいはなにかアイデアがあればと思っております。よろしくお願いします。わざわざコードを記述いただいてほんとうにありがとうございます。動作は確認しました。(VBコントロール自体は正常にうごきます。すいません。)

記事No.55921 のレス /過去ログ94より / 関連記事表示
削除チェック/

■55929  Re[3]: プログレスバー
□投稿者/ vbの質問 -(2010/12/18(Sat) 11:08:33)
    No55928 (vbの質問 さん) に返信

    魔界の仮面弁士 さんご回答ありがとうございます。
    申し訳ございません。現状のことばっかり考えていまして、間違った記述をしてしまいました。

    > vbコントロールのプログレスバーはフォーム移動中もしょりは問題なく進みます。
    > vbコントロールのデザインがいやで、滑らかに表示させたかったので(vb.net2003を使用しています)
    >
    > たとえば最初に四角を書いて
    >
    > Dim g As Graphics = PictureBox1.CreateGraphics()
    > Dim rect As Rectangle
    >
    > For i As Integer = 0 To 100000
    > rect2 = New Rectangle(20, 20, i * 0.001, 10)    ’rectが正でした。
    > g.FillRectangle(Brushes.Green, rect)          
    > Next
    >
    > などのような記述をしています。また、滑らかに表示する為にオーナードローという手段を使ってもfor文を使った進捗のさせ方で結局つまずいてしまいまして(フォームが移動できないか、進捗が進まないかのいずれかの現象を回避できず)、他の手段、あるいはなにかアイデアがあればと思っております。よろしくお願いします。わざわざコードを記述いただいてほんとうにありがとうございます。動作は確認しました。(VBコントロール自体は正常にうごきます。すいません。)
    >
    >
記事No.55921 のレス /過去ログ94より / 関連記事表示
削除チェック/

■55932  Re[3]: プログレスバー
□投稿者/ 魔界の仮面弁士 -(2010/12/18(Sat) 12:56:06)
    No55928 (vbの質問 さん) に返信
    > vbコントロールのデザインがいやで
    デザインは ProgressBar.Style で変更できますが、Visual Style が有効な場合には、
    Continuous に設定しても Blocks スタイルになってしまうんですよね…。
    
    
    > Dim g As Graphics = PictureBox1.CreateGraphics()
    基本的に、CreateGraphics は使用すべきではありません。
    通常は Paint イベントを利用し、e.Graphics に対して描画処理を記述すべきです。
    
    この場合、「時間のかかる処理」の最中に、任意のタイミングで PictureBox の
    Invalidate メソッドもしくは Refresh メソッドを呼ぶようにします。
    
    
    Invalidate とは、「描画すべきデータが更新されたので、次回の描画タイミングで再描画して欲しい」と
    OS に依頼するためのメソッドです。これにより、Paint イベントが誘発されます。
    
    Refresh メソッドは、Invalidate メソッド + Update メソッドの組み合わせと同じ意味です。
    これは、強制的に再描画を行う必要がある場合に利用されます。
    
    Update メソッドは、「描画の必要があれば、描画処理を実行する」という物です。
    特に再描画が不要な状況では、Update を呼び出しても何も起きませんが、
    再描画が必要とされる状況では、Paint イベント(OnPaint メソッド)が呼び出されます。
    
    
    Private currentValue As Integer
    
    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles PictureBox1.Paint
        Dim rect As New Rectangle(20, 20, Me.currentValue * 0.001, 10)
        e.Graphics.FillRectangle(Brushes.Green, rect)
    End Sub
    
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        'Invalidate を使った場合は、ループ処理の速度は低下しない。
        'ただし、描画は強制ではないため、ループ中には実際の描画処理が行われず、
        'End Sub した後に実行される可能性が高い。
        For Me.currentValue = 0 To 100000
            PictureBox1.Invalidate()
        Next
    End Sub
    
    Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
        'Refresh を使うと、本来は再描画不要なタイミングであっても強制的に描画させる事ができる。
        'ただしその分、ループ処理性能は著しく低下する事になる。
        For Me.currentValue = 0 To 100000
            PictureBox1.Refresh()
        Next
    End Sub
    
    Private Sub Button3_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button3.Click
        '両者を組み合わせた例。基本的には Invalidate を使うようにしておき、
        '時折、強制描画を挟むようにする(回数で制御する他、Timer で Update する手もある)。
        'Update の頻度を変更することでパフォーマンスを調整できるのが利点。
        For Me.currentValue = 0 To 100000
            PictureBox1.Invalidate()
    
            If Me.currentValue Mod 100 = 0 Then
                PictureBox1.Update()   '100回ごとに強制描画
            End If
        Next
    End Sub
    
    
    > for文を使った進捗のさせ方で結局つまずいてしまいまして
    メインスレッドが重い処理を行っている最中は、描画処理が行われなかったり、
    画面操作を受け付けなくなる可能性が高くなります。画面位置の変更などといった
    UI操作を受け付けるようにしたい場合には、重い処理を非同期的に実装する事を検討してみてください。
    
    たとえば、各処理を細かく分割しておき、Timer の Tick イベントで、少しずつ処理を
    進めていくという手法があります。この手法は、時計やアニメーション処理などで利用できます。
    
    一方、長いループ処理を必要とするケースでは、作業用の別スレッドを用意した方が
    望ましいかも知れません。2005 以降では、BackgroundWorker を使うと便利でしょう。
    あるいは、Webサービス化して Asnyc 系メソッドで実行するという選択肢もあります。
    
    
    この他、ループ中で適宜 DoEvents を呼び出すという選択肢もあるのですが、
    DoEvents の利用は、イベント再入を引き起こす可能性があるため、
    意図しない動作となる事がありますので、極力避けた方が無難です。
記事No.55921 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56745  Re[4]: コンボボックスのDataSourceについて
□投稿者/ todo -(2011/01/28(Fri) 17:58:25)
    > しかしコンボボックスのDataSourceにDataTableを設定すると
    > GC.GetTotalMemory(True)のメモリ使用量がずっと増え続けます。

    何バイトですか?

    > まずフォームですが、ShowDialogで表示していないのでDispose不要だと思います。
    > 次にDataTableはコンボボックスのDataSourceに設定しているのでDispose不要だと思っています。

    以下をお試しください。

    ・Form2を重くする実験
    Me.Tag = New Byte(10000) {}

    ・DataTableを重くする実験
    2行→1万行

    ・コンボボックスを重くする実験
    comboBox1.Tag = New Byte(10000) {}
記事No.56734 のレス /過去ログ95より / 関連記事表示
削除チェック/

■56810  Re[7]: コンボボックスのDataSourceについて
□投稿者/ pon -(2011/02/01(Tue) 15:30:02)
    todoさん

    >・Form2を重くする実験
    >Me.Tag = New Byte(10000) {}

    >・DataTableを重くする実験
    >2行→1万行

    >・コンボボックスを重くする実験
    >comboBox1.Tag = New Byte(10000) {}

    以上を試してみました。
    現象は変わらず、★部分をコメントアウトするとメモリ使用はある一定で止まります。
    ★部分を実行するとメモリ使用量は増え続けます。
記事No.56734 のレス /過去ログ95より / 関連記事表示
削除チェック/

■57345  Re[10]: 文字コードの取得
□投稿者/ 魔界の仮面弁士 -(2011/02/23(Wed) 12:16:20)
    No57337 (TAKE さん) に返信
    > 文字集合とは↓これでしょうか?
    文字集合(キャラクターセット)とは、使用できる文字の集まりです。
    大雑把にいえば、使用可能な文字の一覧表だと思っていただければ良いかと。
    
    その上で、それらの文字をどのような符号化方式(エンコード)でバイナリ変換するのか、という話です。
    
    ASP.NET では UTF-8 が使われる事が多いかと思いますが(ケータイ向けサイトは別として)、
    その上で、システム上の制限として使えない文字種を定義する必要があるかどうかですね。
    
    ・どんな文字を使う必要があるのか。
     (外国人名を現地語で入力させる必要があるか、サロゲートペアは許可するか、外字はどうするかなど)
    
    ・それらを何の符号化で保持/出力するのか。
     (DB の文字コードは何か、Shift_JIS データの作成が必要かなど)
    
    
    実際にはこの他、どのフォントを使うかという話もあるのでしょうけれども、
    システムの全体要件が見えないので、それについては触れずにおきます。
    そもそもの話は「文字コード不明のテキストファイルを読み込む」手法についての
    話題だったはずなので、かなり脱線気味ではありますが。
    
    
    脱線ついでに文字集合と符号化方式について述べておくと、たとえば Unicode という文字集合の場合、
    そのひとつの文字集合に対して UTF-8 や UTF-16 といった異なる符号化方式が存在しています。
    
    文字集合としての Unicode については、Unicode 2.1 とか Unicode 4.0.0 といった
    バージョンの違いで扱える文字種が異なります。6.0 以降では、"emoji symbols"
    (いわゆる、携帯電話の絵文字記号)も追加されています。
    
    対応する符号化方式については、UTF-8 とか UTF-16 とか UTF-32 など何種類かありますが、
    とりあえず「あ」の文字を例にとると、この文字は Unicode では U+3042 に割り当てられており、
    その U+3042 を符号化してバイナリ表現に変換した場合、符号化方式によって
      UTF-7    では 2B,4D,45,49,2D
      UTF-8    では E3,81,82
      UTF-16LE では 42,30
      UTF-16BE では 30,42
    のように、異なるバイナリ表現をとるようになっています。
    
    # ちなみに、Windows が Unicode 系 API で採用しているのは UTF-16 であり、
    # System.Text.Encoding.Unicode というのは、UTF-16 の符号化を表しています。
    
    
    UTF-8 の符号化方式でいえば、U+0800〜U+FFFF の範囲の文字が
    xxxxyyyy-yyzzzzzz のビットパターン(2進数表現)で表され、それが
    1110xxxx,10yyyyyy,10zzzzzz というバイト並びに変換される仕様です。
    上記 U+3042 なら、2進表現では 00110000-01000010 になるので、これが
    11100011,10000001,10000010 のビットパターン、すなわち E3,81,82 になる、と。
    
    
    > VBの時代には
    > unicodeに変換すれば
    実際には、その変換が問題になる事もあったりします。(NEC文字などの問題など)
    Win9x系と WinNT 系でも差異がありましたし。まぁ、普段はあまり意識する事は無いと思いますが。
    
    旧VB の文字列は、内部的には UCS-2 相当なのですが、画面やファイルへの入出力処理では
    ローカルのOEMコードに自動的に変換されるため、これが問題を引き起こすことがありました。
    
    たとえば、Shift_JIS (というか、コードページ932)の場合、
    "≒" の文字は、0x8790 と 0x81e0 の二か所に割り当てられていますが、
    Unicode では U+2252 一か所にのみマッピングされています。
    
    そのため、VB6 や VBA においては
     s1 = ChrW(&H2252)
     s2 = Chr(&H81E0)
     s3 = Chr(&H8790)
     s4 = StrConv(ChrB(&H81) & ChrB(&HE0), vbUnicode, &H411)
     s5 = StrConv(ChrB(&H87) & ChrB(&H90), vbUnicode, &H411)
    はいずれも、0x2252 という同一バイナリにエンコードされることになります。
    ゆえに一度変換してしまうと、厳密には元に戻すことができません。
    
    この事情は、C# においても同じことです。.NET にしても 32bit版 VB にしても、
    文字列(String 型変数)は、文字列を UTF-16 のバイナリで管理しているため、
    0x8790 な 2 バイトのテキストファイルと
    0x81e0 な 2 バイトのテキストファイルを Shift_JIS としてデコードした場合、
    その文字はいずれも U+2252 という同じ文字として保持される事になります。
    
    
    TAKE さんが先程あげられた
    > 文字集合とは↓これでしょうか?
    で表された U+2116 "Numero Sign" の文字も同様で、この文字は
    Shift_JIS では 0xfa59 と 0x8782 の 2 つがあったりします。
    
    
    > 簡単に文字数判定できましたが
    > C#は簡単にはいかないようですね。
    『文字数判定』なら、System.Globalization.StringInfo クラスの
    LengthInTextElements プロパティで行えます。
    http://www.atmarkit.co.jp/fdotnet/dotnettips/726countchars/countchars.html
    http://msdn.microsoft.com/ja-jp/ff382735
    
    『バイト数判定』なら、System.Text.Encoding クラスの GetByteCount メソッドですね。
    
    『文字幅の測定』なら、No57203 で shu さんが書かれているように MeasureString メソッド等で。
記事No.57162 のレス / END /過去ログ96より / 関連記事表示
削除チェック/

■57420  Re[2]: WebRequest.GetRequestStreamで例外
□投稿者/ taru -(2011/02/25(Fri) 15:18:51)
    > エラーメッセージは?

    「基になる接続が閉じられました : リモート サーバーに接続できません。」と出ます。

    また、その際のHttpWebRequestのプロパティ値と、WebExceptionのプロパティ値は以下の通りです。

    ■HttpWebRequestのプロパティ値
    ConnectionGroupName=,
    ContentLength=24,
    ContentType=application/x-www-form-urlencoded,
    Credentials=,
    Headers=Content-Type: application/x-www-form-urlencoded,
    Method=POST,
    PreAuthenticate=False,
    Proxy=System.Net.WebProxy,
    RequestUri=http://xxx.xxx.xxx.xxx/aaa.php,  ←(※http://以降は変えています)
    Timeout=100000,

    ■WebExceptionのプロパティ値
    HelpLink=,
    InnerException=,
    Message=基になる接続が閉じられました : リモート サーバーに接続できません。
    Response=,
    Source=System,
    StackTrace= at System.Net.HttpWebRequest.CheckFinalStatus()
    at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult)
    at System.Net.HttpWebRequest.GetRequestStream()
    at Common.CPro.HttpPostData(String url, Hashtable ht, Int32 timeout)   ←(※自作関数です)
    Status=ConnectFailure,
    TargetSite=Void CheckFinalStatus(),


    > HTTPステータスは?
    送信する前で例外が発生しているため、HTTPステータスは取れませんよね?
    (見当違いであればすみません)
記事No.57418 のレス /過去ログ96より / 関連記事表示
削除チェック/

■58087  Re[9]: ASCコードで受け取るサーバに送信したい
□投稿者/ 774RR -(2011/03/25(Fri) 09:23:23)
    String と byte の違いを正しく認識してるのかどうかが不明なのでなんともいえないが
    とりあえず以下の項目は理解できているのだろうか?

    文字セット:どの文字を使い、どの文字は見捨てるのかの合意
    (例:JIS第一水準とか常用漢字とか)
    文字コード:(文字セット中にある)特定1文字に割り振るコード
    (例:ひらがなの「あ」に対して JIS X 0208 は 004 区 02 点というコードを割り振っている)
    符号化方式:文字コードをプログラム上やデータ上で具体的にどう表現するか
    (「あ」の 004 区 02 点 というコードを、SHIFT-jis では 0x82A0 と表現し EUC-jp では 0xA4A2 と表現する)

    ASC コードというのは俺も知らないのだが、仮に ASCII であるとして。
    ASCII は 1960 年代に作られた代物で、上記文字セット・文字コード・符号化方式を
    (意識的な区別をせず)同時に含むもの。
    A という文字に対して、文字コード=表現方式として 7bit 二進数1000001 を使う。
    最近のコンピュータは 7bit データを扱うのが苦手なので、最上位ビットに 0 を補い
    8bit のデータ 0x41 として扱うのが普通になっている。

    これに対して VB は[文字]として 文字セット:UNICODE 符号化方式:UTF-16 を使う。
    VB の String は [文字](の列) を扱うものなので、当然 UTF-16 符号化方式である。
    UTF-16 と ASCII では表現方式が違うので変換が必要。

    ASCII の 0x41 は UNICODE の U+0041 文字になり、 UTF-16 表現すると 0x0041
    ASCII の 0x41 0x42 という [ASCII の文字の列] を
    UTF-16 の 0x0041 0x0042 (UNICODE の U+0041 U+0042) と変換するのか
    UTF-16 の 0x4142 (UNICODE の U+4142) と変換するのか
    UTF-16 の 0x4241 (UNICODE の U+4241) と変換するのか
    そういうあたりは常に意識しておかないとバグっちゃうぞ。
記事No.58005 のレス /過去ログ97より / 関連記事表示
削除チェック/

■58108  Re[3]: x64でPrintDlg
□投稿者/ 焦げ太 -(2011/03/25(Fri) 16:01:38)
    2011/03/25(Fri) 16:08:18 編集(投稿者)

    PrintDlgExで確認中で、
    とりあえず、32bitOS上でPrintDlgExが動作するところまで
    いきましたが、64bitOS上ではどうにもうまくいきません。

    以下のようにやっていますが、hResult に 80070057 が
    返ってきます。エラー値を調べたのですが引数エラーの
    ようです。

    ◆構造体メンバの型がおかしいのでしょうか?

    ◆それと、ググったサイトでPrintDlgExの宣言で
     [In(), Out()]と括弧付きで宣言しているのを見つけたのですが
     [In, Out]とどちらがあっているのでしょうか?
    ※そもそも違いがわかりませんorz

    ◆EXのほうは「PD_PRINTSETUP」がフラグにないのですね。。。
     ボタンを「印刷」→「OK」にしたいところですが、、、
     とりあえずはx64で動作させたいところです。

    //プリンタダイアログEX
    [DllImport("comdlg32.dll", CharSet = CharSet.Auto)]
    private static extern int PrintDlgEx([In, Out] PRINTDLGEX lppd);

    //Flags
    private const Int32 PD_NOSELECTION = 0x4;
    private const Int32 PD_NOPAGENUMS = 0x8;
    private const Int32 PD_PRINTSETUP = 0x40;
    private const Int32 PD_RETURNDC = 0x100;
    private const Int32 PD_HIDEPRINTTOFILE = 0x100000;
    private const Int32 PD_NONETWORKBUTTON = 0x200000;
    private const Int32 PD_NOCURRENTPAGE = 0x800000;

    //戻り値
    private const int PD_RESULT_CANCEL = 0;
    private const int PD_RESULT_PRINT = 1;
    private const int PD_RESULT_APPLY = 2;

    //PRINTDLGEX CLASS
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
    [ComVisible(false)]
    private class PRINTDLGEX
    {
    public Int32 lStructSize;
    public IntPtr hwndOwner;
    public IntPtr hDevMode;
    public IntPtr hDevNames;
    public IntPtr hDC = IntPtr.Zero;
    public Int32 Flags = PD_RETURNDC;
    public Int32 Flags2 = 0;
    public Int32 ExclusionFlags = 0;
    public Int32 nPageRanges = 0;
    public Int32 nMaxPageRanges = 0;
    public IntPtr lpPageRanges = IntPtr.Zero;
    public Int32 nMinPage = 0;
    public Int32 nMaxPage = 0;
    public Int32 Copies = 1;
    public IntPtr hInstance = IntPtr.Zero;
    public IntPtr lpPrintTemplateName;
    public IntPtr lpCallback = IntPtr.Zero;
    public Int32 nPropertyPages = 0;
    public IntPtr lphPropertyPages = IntPtr.Zero;
    public Int32 nStartPage = -1;
    public Int32 dwResultAction = 0;
    }

    void test()
    {
    PrintDocument pd = new PrintDocument(); //<--実際はデフォルトプリンタではないです
    IntPtr hDevMode = pd.PrinterSettings.GetHdevmode();
    IntPtr hDevNames = pd.PrinterSettings.GetHdevnames();

    PRINTDLGEX pdlg = new PRINTDLGEX();
    pdlg.lStructSize = Marshal.SizeOf(pdlg);
    pdlg.hwndOwner = owner.Handle;
    pdlg.hDevMode = hDevMode;
    pdlg.hDevNames = hDevNames;
    pdlg.Flags = PD_HIDEPRINTTOFILE | PD_NOSELECTION | PD_NOCURRENTPAGE | PD_NOPAGENUMS | PD_RETURNDC;
    int hResult = PrintDlgEx(pdlg);
    if ((hResult != 0) || (pdlg.dwResultAction == PD_RESULT_CANCEL))
    {
    return DialogResult.Cancel;
    }
    }
記事No.58038 のレス /過去ログ97より / 関連記事表示
削除チェック/

■58844  Re[1]: メモリを浪費せず大量データをOracleへ反映
□投稿者/ オショウ -(2011/04/28(Thu) 09:27:39)
    > のレコードを読み取り、他のテーブルを参照したり1レコードから子レコードを生成してOracleへ反映しています。

      この処理自体をDataTable上で行っています?
      またやはりDataTable使っているのがメモリ食いの原因かと。

      SQL文1発でUPDATEするような方法書ければ、5000〜10000件づつ構造体配列に
      読み込んで処理するば、速度もそこそこなんとかなるのでは・・・と。

      あと、それでもメモリを食うようであれば、Oracleとの接続以降でインスタン
      スが解放されていないバグがあるとか・・・
      因みに、当初はODP.NETでしたか?ADO.NETで書き直しても同じ・・・とありま
      すが、具体的にどうやっておられたのかを書かないと、上記だけでは、解消に
      いたるコメントを得るのは難しいかと。

    ※ DevPartner Studio Professionalの評価版を使ってザックリとどこが悪いか、
      解析に使うとか・・・昔、そうやってしのいだことあります。

    以上。
記事No.58842 のレス /過去ログ99より / 関連記事表示
削除チェック/

■59200  Re[1]: SQL文で年齢を算定したい
□投稿者/ やじゅ -(2011/05/19(Thu) 01:37:37)
>
    2011/05/19(Thu) 01:44:39 編集(投稿者)

    No59194 (ながり さん) に返信
    > VB.NET、SQLSERVER2000での開発環境になります。
    > テーブル社員マスタに生年月日フィールドがあるのですが、このフィールドを使って年齢を計算したいのですが、どのようにすればいいでしょうか?

    下記サイトによるとOracleで年齢を計算する場合は下記のようになる
    select trunc(指定日付-生年月日)/10000,0) from dual
    select trunc((to_char(sysdate,'yyyymmdd') - 19980913)/10000,0) from dual
    http://ayuayuayu01.seesaa.net/article/106439889.html

    これをSQLServerにするなら、truncは切り捨てなのでROUNDに変換すればいいのでは。
    select ROUND(指定日付-生年月日)/10000,0,1)
    select ROUND(CONVERT(CHAR(10), GETDATE(), 112) - 19980913)/10000,0)

    未検証なので動作しない可能性あり(^^;
記事No.59194 のレス /過去ログ99より / 関連記事表示
削除チェック/

■59407  Re[6]: TreeViewを動的に操作
□投稿者/ ちか -(2011/05/25(Wed) 09:54:06)
    うまくデータの取得ができず、SQLにてSELECT取得する際に、階層にて取得(TreeView表示順)をしてから
    表示しようと教えていただいた物を使ってやっていますが、一番親にまで戻ると次の表示が階層の作りが
    おかしくなってしまっています。

    商品CD   名前  使用商品CD 名前  階層レベル
    100005   AAA   590636   BBB   1
    590636   BBB   301782   CCC   2
    590636   BBB   300221   DDD   2
    590636   BBB   300255   EEE   2
    590636   BBB   300092   FFF   2
    100005   AAA   590666   GGG   1
    590666   GGG   500173   HHH   2
    500173   HHH   300262   III   3
    500173   HHH   390001   JJJ   3
    500173   HHH   302019   KKK   3
    500173   HHH   300469   LLL   3
    500173   HHH   300467   MMM   3
    500173   HHH   300260   NNN   3
    500173   HHH   400313   OOO   3
    590666   GGG   590636   BBB   2
    590636   BBB   301782   CCC   3
    590636   BBB   300221   DDD   3
    590636   BBB   300255   EEE   3
    590636   BBB   300092   FFF   3
    590666   GGG   590638   PPP   2
    590638   PPP   590637   QQQ   3
    590637   QQQ   390001   JJJ   4
    590637   QQQ   300221   DDD   4
    590638   PPP   300255   EEE   3
    100005   AAA   301146   RRR   1
    100005   AAA   400106   SSS   1
    100005   AAA   402375   TTT   1


    dt = this.ObjOracle.GetDataTable(sSql.ToString());

    treeView1.Nodes.Clear();

    treeView1.Select();
    TreeNode _ParentNode = new TreeNode();

    for (int i = 0; i < dt.Rows.Count; i++)
    {
    if (_ParentNode.Text != dt.Rows[i][0].ToString() + "_" + dt.Rows[i][1].ToString())
    {
    if (_ParentNode.Text == string.Empty)
    {
    treeView1.Nodes.Add(dt.Rows[i][0].ToString() + "_" + dt.Rows[i][1].ToString());
    _ParentNode = treeView1.Nodes[0];
    }
    else
    {
    string str = _ParentNode.FullPath;
    if (str.Contains(dt.Rows[i][0].ToString() + "_" + dt.Rows[i][1].ToString()))
    {
    _ParentNode = _ParentNode.Parent;
    }
    else
    {
    _ParentNode = _ParentNode.Nodes.Add(dt.Rows[i][0].ToString() + "_" + dt.Rows[i][1].ToString());
    }
    _ParentNode.Nodes.Add(new TreeNode(dt.Rows[i][2].ToString() + "_" + dt.Rows[i][3].ToString()));
    }
    }
    else
    {
    _ParentNode.Nodes.Add(new TreeNode(dt.Rows[i][2].ToString() + "_" + dt.Rows[i][3].ToString()));
    }
    }
記事No.59207 のレス /過去ログ99より / 関連記事表示
削除チェック/

■60075  WPF progress bar 更新の仕方
□投稿者/ 白 -(2011/06/19(Sun) 00:36:11)

    分類:[.NET 全般] 

    はじめまして。
    白と申します。よろしくお願いいたします。
    Expression Blend4とC#の環境を使っております。

    ボタンを押したら、10満回ループし、その間の進捗状況を
    progressBarで表現したいと思い、下記のプログラムを作りました。
    ただ、再描画がされないのか、ループが終わった後に描画され、
    進捗を描画できません。

    もしご存知の方がいらっしゃたら、教えていただけるとたすかります。
    よろしくお願いいたします。

    以下ソース
    ------------------------------------------------------------------------------

    public partial class MainWindow : Window
    {
    public MainWindow()
    {
    this.InitializeComponent();

    // オブジェクト作成に必要なコードをこの点の下に挿入します。
    }

    private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
    {
    int i = 0;
    testbar.Maximum = 100000;
    for( i= 0;i<100000;i++)
    {
    testbar.Value = i;

    }// TODO: ここにイベント ハンドラーのコードを追加します。
    }
    }

    よろしくお願いいたします。
親記事 /過去ログ100より / 関連記事表示
削除チェック/

■59950  DirectShowでデスクトップのキャプチャーするには
□投稿者/ ひろし -(2011/06/13(Mon) 20:17:48)

    分類:[.NET 全般] 

    OS:WindowsVista HomeEdition
    開発言語:VB2010
    PC:eMachine J3210

    度々お世話になります。

    現在、DirectShow を利用して、動画の再生、録画の機能を持ったアプリケーションを開発しています。
    動画の再生、WEBカメラの映像をwmvに録画するところまでは、なんとか作る事ができました。

    ですが、あと2点ほど、どうしても解決できない問題があります。

    1.デスクトップの内容をwmv型式で録画する。

      正確には、フォームの TransparencyKeyプロパティーにて透過させた状態で、
      そのフォームに映っているものを録画できればと考えています。


    2.wmv型式でのカメラの解像度及びビットレートを変更する。

      解像度については、録画の型式を avi にすると変更できました。
      しかし、wmv型式にすると変更できません。

      ↓変更できる
      result = _captureGraphBuilder.SetOutputFileName(MediaSubType.Avi, fileName, muxFilter, sinkFilter)
      ↓変更できない
      result = _captureGraphBuilder.SetOutputFileName(MediaSubType.Asf, fileName, muxFilter, sinkFilter)


      ビットレートについては、avi、wmv 共にできません。



    以下が解像度及びビットレートを変更する関数の全体です。

    ------------------------------------------------------------------------
    Private Sub SetConfigParms(ByVal iFrameRate As Integer, ByVal bitRate As Integer, ByVal iWidth As Integer, ByVal iHeight As Integer)
    Dim hr As Integer

    Dim IMyInterfaceAttribute As Attribute = Attribute.GetCustomAttribute(GetType(IAMStreamConfig), GetType(GuidAttribute))
    Dim iid As Guid = New Guid(CType(IMyInterfaceAttribute, GuidAttribute).Value)
    Dim o As Object = Nothing
    Dim media As AMMediaType = Nothing
    Dim videoStreamConfig As IAMStreamConfig
    Dim videoControl As IAMVideoControl = DirectCast(_captureFilter, IAMVideoControl)

    ' Find the stream config interface
    hr = _captureGraphBuilder.FindInterface(New DsGuid(PinCategory.Capture), New DsGuid(MediaType.Video), _captureFilter, iid, o)

    videoStreamConfig = DirectCast(o, IAMStreamConfig)
    Try
    If (videoStreamConfig Is Nothing) Then
    Throw New Exception("Failed to get IAMStreamConfig")
    End If

    'フォーマット取得
    hr = videoStreamConfig.GetFormat(media)
    DsError.ThrowExceptionForHR(hr)

    'ビデオヘッダー取得
    Dim vHeader As VideoInfoHeader = New VideoInfoHeader()
    Marshal.PtrToStructure(media.formatPtr, vHeader)

    'サンプルレート設定
    If (iFrameRate > 0) Then
    vHeader.AvgTimePerFrame = CLng(10000000 / iFrameRate)
    End If
    'ビットレート設定
    If bitRate > 0 Then
    vHeader.BitRate = bitRate
    End If
    '幅設定
    If (iWidth > 0) Then
    vHeader.BmiHeader.Width = iWidth
    End If
    '高さ設定
    If (iHeight > 0) Then
    vHeader.BmiHeader.Height = iHeight
    End If

    ' Copy the media structure back
    Marshal.StructureToPtr(vHeader, media.formatPtr, False)

    ' Set the new format
    hr = videoStreamConfig.SetFormat(media)
    DsError.ThrowExceptionForHR(hr)

    DsUtils.FreeAMMediaType(media)
    media = Nothing

    ' Fix upsidedown video
    If (Not videoControl Is Nothing) Then
    Dim pCapsFlags As VideoControlFlags

    Dim pPin As IPin = DsFindPin.ByCategory(_captureFilter, PinCategory.Capture, 0)
    hr = videoControl.GetCaps(pPin, pCapsFlags)
    DsError.ThrowExceptionForHR(hr)

    If (CLng(pCapsFlags & VideoControlFlags.FlipVertical) > 0) Then
    hr = videoControl.GetMode(pPin, pCapsFlags)
    DsError.ThrowExceptionForHR(hr)

    hr = videoControl.SetMode(pPin, 0)
    End If
    End If
    Finally
    Marshal.ReleaseComObject(videoStreamConfig)
    End Try
    End Sub
    ------------------------------------------------------------------------

    ご存知の方、よろしくお願いいたします。
親記事 /過去ログ100より / 関連記事表示
削除チェック/

■60097  Re[1]: DirectShowでデスクトップのキャプチャーするには
□投稿者/ ひろし -(2011/06/20(Mon) 19:54:49)
    質問者のひろしです。

    DirectShowを使ってデスクトップのレコーディングする方法が解決できなかった為
    他の方法で対応することにしました。

    http://www.adp-gmbh.ch/csharp/avi/write_avi.html

    上記ののページを参考にデスクトップのレコーディングする部分は何とか出来ました。
    音声の録音についてはDirectShowを使って、映像とは別々のファイル(avi)に出力し、

    http://homepage1.nifty.com/nekora/soft/howto/avi.html

    上記のページを参考にして、映像と音声を合成すると言う方法で解決しました。

    しかし、またどうしても解決できない問題にぶつかってしまいました。
    デスクトップの映像を録画する際に、何故か上下が反転してしまうのです。
    原因をご存知の方、ご教授よろしくお願いいたします。

    (最悪、bitmap を回転させて AddFram 関数を呼ぶことも考えています・・・)



    private void CreateStream() {
    AVISTREAMINFOW strhdr = new AVISTREAMINFOW();
    strhdr.fccType = streamtypeVIDEO;
    strhdr.fccHandler = _fccHandler_MP4V2;
    strhdr.dwFlags = 0;
    strhdr.dwCaps = 0;
    strhdr.wPriority = 0;
    strhdr.wLanguage = 0;
    strhdr.dwScale = 1;
    strhdr.dwRate = _frameRate; // Frames per Second
    strhdr.dwStart = 0;
    strhdr.dwLength = 0;
    strhdr.dwInitialFrames = 0;
    strhdr.dwSuggestedBufferSize = (uint)(_stride * _height);
    strhdr.dwQuality = 0xffffffff; //-1; // Use default
    strhdr.dwSampleSize = 0;
    strhdr.rect_top = 0;
    strhdr.rect_left = 0;
    strhdr.rect_bottom = _height;
    strhdr.rect_right = _width;
    strhdr.dwEditCount = 0;
    strhdr.dwFormatChangeCount = 0;
    strhdr.szName0 = 0;
    strhdr.szName1 = 0;
    int hr = AVIFileCreateStream(_pFile, out _pStream, ref strhdr);

    if (hr != 0) {
    throw new AviException("AVIFileCreateStream");
    }
    }

    unsafe private void SetOptions() {
    int hr = 0;

    AVICOMPRESSOPTIONS opts = new AVICOMPRESSOPTIONS();
    opts.fccType = 0; //fccType_;
    opts.fccHandler = _fccHandler_MP4V2; //fccHandler_;
    opts.dwKeyFrameEvery = 0;
    opts.dwQuality = 7500; // 0 .. 10000
    opts.dwFlags = 8; // AVICOMRPESSF_KEYFRAMES = 4
    opts.dwBytesPerSecond = 0;
    opts.lpFormat = IntPtr.Zero;
    opts.cbFormat = 0;
    opts.lpParms = new IntPtr(5611280); // IntPtr.Zero;
    opts.cbParms = 120;
    opts.dwInterleaveEvery = 0;


    // 圧縮方法選択ダイアログを表示する場合は以下のコメントをはずす
    //AVICOMPRESSOPTIONS* p = &opts;
    //AVICOMPRESSOPTIONS** pp = &p;
    //IntPtr x = _pStream;
    //IntPtr* ptr_ps = &x;
    //AVISaveOptions(0, 0, 1, ptr_ps, pp);
    //


    // TODO: AVISaveOptionsFree(...)

    hr = AVIMakeCompressedStream(out _psCompressed, _pStream, ref opts, 0);
    if (hr != 0) {
    throw new AviException("AVIMakeCompressedStream");
    }

    BITMAPINFOHEADER bi = new BITMAPINFOHEADER();
    bi.biSize = 40;
    bi.biWidth = (Int32)_width;
    bi.biHeight = (Int32)_height;
    bi.biPlanes = 1;
    bi.biBitCount = 24;
    bi.biCompression = 0; // 0 = BI_RGB
    bi.biSizeImage = (uint)(_stride * _height);
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrUsed = 0;
    bi.biClrImportant = 0;

    hr = AVIStreamSetFormat(_psCompressed, 0, ref bi, 40);
    if (hr != 0) {
    throw new AviException("AVIStreamSetFormat", hr);
    }
    }

    public Bitmap Open(string fileName, UInt32 frameRate, int width, int height) {
    _rect = new Rectangle(0, 0, width, height);
    _frameRate = frameRate;
    _width = (UInt32)width;
    _height = (UInt32)height;

    _bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
    BitmapData bmpDat = _bmp.LockBits(_rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    _stride = bmpDat.Stride;
    _bmp.UnlockBits(bmpDat);

    AVIFileInit();
    int hr = AVIFileOpenW(ref _pFile, fileName, 4097 /* OF_WRITE | OF_CREATE (winbase.h) */, 0);
    if (hr != 0) {
    throw new AviException("error for AVIFileOpenW");
    }

    CreateStream();

    SetOptions();

    return _bmp;
    }

    public void AddFrame() {

    BitmapData bmpDat = _bmp.LockBits(_rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);

    int hr = AVIStreamWrite(
    _psCompressed, _count, 1, bmpDat.Scan0, (int)(_stride * _height), 0, 0, 0);
    //_pStream, _count, 1, bmpDat.Scan0, (int)(_stride * _height), 0, 0, 0);

    if (hr != 0) {
    throw new AviException("AVIStreamWrite");
    }

    _bmp.UnlockBits(bmpDat);

    _count++;
    }

記事No.59950 のレス /過去ログ100より / 関連記事表示
削除チェック/

■60855  Re[1]: WebBrowserのUser Agentを知りたい
□投稿者/ 魔界の仮面弁士 -(2011/07/21(Thu) 11:53:47)
    No60841 (Yuka さん) に返信
    > 多分、インストールされているIEのUser Agentと同じではないかと思うのですが、どうでしょうか?
    UserAgent は変更される可能性もありますよ。
    
    
    > どうすれば知ることができますか?
    
    
    Private Const URLMON_OPTION_USERAGENT As Integer = &H10000001
    Private Const URLMON_OPTION_USERAGENT_REFRESH As Integer = &H10000002
    
    Private Declare Ansi Function UrlMkGetSessionOption Lib "urlmon" _
        (ByVal dwOption As Integer _
        , ByVal pBuffer As StringBuilder _
        , ByVal dwBufferLength As Integer _
        , ByRef pdwBufferLengthOut As Integer _
        , ByVal dwReserved As Integer _
        ) As Integer
    
    Public Function GetUserAgent() As String
        Dim userAgent As New StringBuilder()
        userAgent.Append(" "c, 1024)
        Dim length As Integer = 0
        UrlMkGetSessionOption(URLMON_OPTION_USERAGENT, userAgent, userAgent.Length, length, 0)
        Return userAgent.ToString()
    End Function
記事No.60841 のレス /過去ログ102より / 関連記事表示
削除チェック/

■61420  Re[1]: C# Cos 計算
□投稿者/ Hongliang -(2011/08/12(Fri) 10:08:00)
    6.123 ではなく、6.123(略)e-17 ですよね?
    末尾にe-がついているのは指数表記と言って、10 の x 乗分の 1 を表します。つまり、大体 6.123 * (1/100000000000000000) ですから、0.00000000000000006123 ぐらいです(0の数はちゃんと数えてないので一つ二つ間違ってるかも)。
    // ちなみにマイナスがつかず e17 とかの場合、10 の 17 乗を掛けた値になります。
    Math.PI 自体が誤差を含んでいるので(無理数ですからね)、このくらいは許容範囲ではないでしょうか。

    なお、極めて 0 に近い、または極めて大きい値を浮動小数点数が指数表記にされるのを防ぐには、ToString メソッドに書式を渡します。f に精度指定子を付けたりとか。
    詳しくは MSDN の書式指定文字列というページを参照してください。
記事No.61417 のレス /過去ログ103より / 関連記事表示
削除チェック/

■61421  Re[2]: C# Cos 計算
□投稿者/ terada -(2011/08/12(Fri) 10:09:58)
    No61420 (Hongliang さん) に返信
    > 6.123 ではなく、6.123(略)e-17 ですよね?
    > 末尾にe-がついているのは指数表記と言って、10 の x 乗分の 1 を表します。つまり、大体 6.123 * (1/100000000000000000) ですから、0.00000000000000006123 ぐらいです(0の数はちゃんと数えてないので一つ二つ間違ってるかも)。
    > // ちなみにマイナスがつかず e17 とかの場合、10 の 17 乗を掛けた値になります。
    > Math.PI 自体が誤差を含んでいるので(無理数ですからね)、このくらいは許容範囲ではないでしょうか。
    >
    > なお、極めて 0 に近い、または極めて大きい値を浮動小数点数が指数表記にされるのを防ぐには、ToString メソッドに書式を渡します。f に精度指定子を付けたりとか。
    > 詳しくは MSDN の書式指定文字列というページを参照してください。


    ありがとうございます
記事No.61417 のレス /過去ログ103より / 関連記事表示
削除チェック/

<前の20件 | 次の20件>

<< 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 >>

ヒット件数が多いので過去ログ1〜103 までの検索結果 / 過去ログ104からさらに検索→

パスワード/

- Child Tree -