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

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

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

全過去ログを検索

<< 0 | 1 | 2 | 3 >>
■62928  Re[20]: プログラムの練習問題をゆっくりと考えていきます
□投稿者/ 堀江伸一 -(2011/11/10(Thu) 17:45:41)
    上記の考え方をそのまま実装してみたところコード実行速度5位メモリ使用量低で正答できました。
    ここから先の高速化とかはあまり考えてないので。
    もし高速化できそうなところがあったらご指摘ください。
    
    
    #include<stdio.h>
    #include<string.h>
    
    const int A=0;//二人をAさんBさんとする
    const int B=1;
    
    void setData(int n){
    	int memo[2][5002];//[次にもらうのがAさん=0 Bさん=1][Aさんがここまででもらった個数]=最小切断時間
    	int next[2][5002];//次の切断箇所の検討
    	int cutTimes[10001];//切断時間
    	int cutTime,herf=n/2,nowTime;
    	int up;
    
    	for(int i=0;i<n-1;i++)scanf("%d",&cutTimes[i]);
    	
    	memset(memo,127,sizeof(memo));//足される切断秒数は10000なのでオーバーフローしない
    	memo[A][1]=0;//計算しやすいようAさんが1個目を取得した状態から始める
    	
    	for(int turn=0;turn<n-1;turn++){
    		memset(next,127,sizeof(next));//ダミーデータ
    		cutTime=cutTimes[turn];//切断箇所をずらしていく
    
    		up=turn+1>herf?herf:turn+1;//上限
    		for(int k=1;k<=up;k++){
    			nowTime=memo[A][k];//Aさん
    			
    			//切断せずAさんが続けてもらう
    			next[A][k+1]=nowTime;
    			
    			//切断して次はBさんがもらう
    			next[B][k]=nowTime+cutTime;
    		}
    		for(int k=1;k<=up;k++){
    			//Bさんの番
    			nowTime=memo[B][k];
    			//Bさんが続けてもらう
    			next[B][k]=next[B][k]>nowTime?nowTime:next[B][k];
    			
    			//Aさんがもらう
    			nowTime+=cutTime;
    			next[A][k+1]=next[A][k+1]>nowTime?nowTime:next[A][k+1];
    		}
    		memcpy(memo,next,sizeof(next));
    	}
    	nowTime=memo[A][herf]>memo[B][herf]?memo[B][herf]:memo[A][herf];
    	
    	printf("%d\n",nowTime);
    }
    
    int main(){
    	int n;
    	scanf("%d",&n);
    	setData(n);
    	while(scanf("%d",&n)!=EOF){
    	}
    }
記事No.62667 のレス /過去ログ105より / 関連記事表示
削除チェック/

■62960  Re[26]: プログラムの練習問題をゆっくりと考えていきます
□投稿者/ 堀江伸一 -(2011/11/13(Sun) 14:44:21)
    2011/11/14(Mon) 13:33:35 編集(投稿者)

    ダンジョンの問題難しいです。

    まず回復地点の選定は回復回数も考慮に入れたナップザック問題になってるので、貪欲法で最も回復量の大きい所から使えるわけではない可能性が高い。

    地下4階でHP0になり地下3階でHP最大値-まで2回で回復したことにして下り地下5階でもHP0になったので、地下3階はMax寸前まで回復したので意味なし今度は地下2階で回復していたことにすると地下3階で回復した分を無効化しないといけない。
    この場合地下3階より上の階は無視すべきなのかもしれない?

    地下10001階で大量回復できる地点があるなら地下10000階まではぎりぎりで進むなんて場合もある。
    ある階で回復するかしないかは先の階や前の階を考慮しないといけない。

    地下十万階あるのでナップザック法でも計算量が多くなる。
    難しいです。

    何かコロンブスの卵的発想一つなのかもしれません。
    上記のように難しい問題なのですがどなたか良いアイディアをお願いします。
記事No.62667 のレス /過去ログ105より / 関連記事表示
削除チェック/

■64670  TCP/IP通信について
□投稿者/ tomoya -(2012/12/15(Sat) 11:05:22)

    分類:[VB.NET/VB2005 以降] 

    お世話になります。
    現在、TCP/IP通信によってデータの送受信を行いたいと考えているのですが、
    PC側より相手機器にTCP/IP通信を行うとエラーが生じてしまいます。
    (PC側の開発環境はVisual Basic2010 Expressを利用しています。)

    相手機器は「ASCIIコード交信」を選択しているので、ASCIIコードに文字列を変換して
    送信しなければ行けないのだと思うのですが、そのための手法を教えていただきたく
    思っています。

    送信コマンドは、
    ”500000FF03FF000018001004010001M*0001000008”
    を送信したいと思っています。


    別の機器同士でのTCP/IP送受信は正常に完了するため、相手機器の設定は間違って
    いないと思います。
    PC側からオープンとクローズ処理は完了できるため、コマンドの送信方法が間違って
    いるものと考えています。

    説明下手で申し訳ありませんが、よろしくお願いいたします。
親記事 /過去ログ109より / 関連記事表示
削除チェック/

■65667  Re[3]: イベントハンドラを直接呼ばない理由
□投稿者/ doragora -(2013/03/13(Wed) 18:08:15)
記事No.65581 のレス /過去ログ111より / 関連記事表示
削除チェック/

■66151  C# でビット反転の方法を教えて下さい
□投稿者/ ビビット -(2013/04/03(Wed) 20:21:40)

    分類:[C#] 

    お世話になります。

    string s = "1001000101100";
    とあるとき、下位1バイトを反転して1を加え、
    結果的に16進数D4を得たいのですが、
    どうにもやり方がわかりません。


    以下、考え方だけですが(違っていたらご指摘ください)
    ・反転するのですから、0110111010011となる
    ・下位1バイトなので、11010011 が対象。
    ・これに1を加えると、11010100 となる。


    「~」を使うのだとは思うのですが、
    初心者なのでどう表現すればよいか分かりません。
    ご教授いただけませんでしょうか?


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

■66160  Re[3]: C# でビット反転の方法を教えて下さい
□投稿者/ shu -(2013/04/04(Thu) 16:17:42)
    No66158 (ビビット さん) に返信

    No66151

    > string s = "1001000101100";
    > とあるとき、下位1バイトを反転して1を加え、
    > 結果的に16進数D4を得たいのですが、
    を見ると私の提示した処理だとD4にはならずかと言って結果以外の
    過程には合っているような気がします。
    D4を求めるには
    下位1バイトを取り出して反転し1を加えるか
    反転して1を加えてから下位1バイトを取り出す
    必要があるかと思います。

    実際にやりたいことに合わせ変更を加える必要がありそうです。
記事No.66151 のレス /過去ログ112より / 関連記事表示
削除チェック/

■66179  Re[4]: C# でビット反転の方法を教えて下さい
□投稿者/ ビビット -(2013/04/06(Sat) 22:09:59)
    No66160 (shu さん) に返信
    > ■No66158 (ビビット さん) に返信
    >
    > No66151
    >
    >>string s = "1001000101100";
    >>とあるとき、下位1バイトを反転して1を加え、
    >>結果的に16進数D4を得たいのですが、
    > を見ると私の提示した処理だとD4にはならずかと言って結果以外の
    > 過程には合っているような気がします。
    > D4を求めるには
    > 下位1バイトを取り出して反転し1を加えるか
    > 反転して1を加えてから下位1バイトを取り出す
    > 必要があるかと思います。
    >
    > 実際にやりたいことに合わせ変更を加える必要がありそうです。


    ご返信ありがとうございます。
    ちゃんとご教授頂いた方法でd4を得ることができていますよ。


    >>string s = "1001000101100";
    の下位1バイト
    string s2 = "00101100";


    ここで、教えていただいた


    UInt32 a = Convert.ToUInt32(s2, 2);
    UInt32 b = ((a & 0xFFFFFF00) | (~(a & 0xFF) & 0xFF)) + 1;
    String result = Convert.ToString(b, 16);

    最後だけ16進数にしています。
記事No.66151 のレス / END /過去ログ112より / 関連記事表示
削除チェック/

■66180  Re[5]: C# でビット反転の方法を教えて下さい
□投稿者/ shu -(2013/04/06(Sat) 22:35:59)
    No66179 (ビビット さん) に返信
    > ご返信ありがとうございます。
    > ちゃんとご教授頂いた方法でd4を得ることができていますよ。
    >
    >
    > >>string s = "1001000101100";
    > の下位1バイト
    > string s2 = "00101100";
    >
    >
    > ここで、教えていただいた
    >
    >
    > UInt32 a = Convert.ToUInt32(s2, 2);
    > UInt32 b = ((a & 0xFFFFFF00) | (~(a & 0xFF) & 0xFF)) + 1;
    > String result = Convert.ToString(b, 16);
    >
    s2が下位1バイトを取り出す処理と同等のことを行っているので
    そういうことであれば、
    bの計算で
    ((a & 0xFFFFFF00) |
    部分は不要で、sからs2を求める処理もいらないです。
記事No.66151 のレス / END /過去ログ112より / 関連記事表示
削除チェック/

■67572  Re[2]: VS2010Expressインストール
□投稿者/ επιστημη -(2013/08/10(Sat) 09:22:09)
>
記事No.67570 のレス /過去ログ114より / 関連記事表示
削除チェック/

■74446  複合主キーへの対応
□投稿者/ ainax -(2014/12/30(Tue) 18:27:12)

    分類:[データベース全般] 

    C#, Visual Studio 2013 Commnunity Update4, EF6.0

    お世話になります。

    Entityframework のデータベースの設計についてご相談したいと思い投稿させて頂きました。

    現在、 CSV からデータを読み込み Entityframewrok のモデルへとインポートするということをしています。

    CSV の種類と項目は下記のような感じです。

    【発注元CSV】
    発注元コード, 発注元名
    100, A社
    101, B社
    102, C社

    【納品先CSV】
    納品先コード, 納品先名, 発注元コード, 発注元名
    1, 東京, 100, A社
    2, 千葉, 100, A社
    3, 神奈川, 100, A社
    1, 東京, 101, B社
    2, 神奈川, 101, B社
    3, 長野, 101, B社
    1, 東京, 102, C社
    2, 北海道, 102, C社

    【オーダーCSV】
    オーダーNo, オーダー詳細No, 発注元コード, 発注元名, 納品先コード, 納品先名
    10001, 1, 100, A社, 1, 東京
    10001, 2, 100, A社, 2, 千葉
    10002, 1, 101, B社, 1, 東京
    10003, 1, 102, C者, 2, 北海道
    10004, 1, 100, A社, 0, (空文字)

    上記の CSV のインポート先に下記のようなモデルを使っています。

    class 発注元
    {
    [Key]
    public int コード {get; set;}
    public string 名前 {get; set;}

    public virtual ICollection<納品先> 納品先s {get ;set;}
    }

    class 納品先
    {
    [Key, Column(Order = 0)]
    public int コード {get; set;}
    [Key, Column(Order = 0)]
    public int 発注元コード {get; set;}
    public string 名前 {get; set;}

    [ForeignKey("発注元コード")]
    public virtual 発注元 発注元 {get ;set;}
    public virtual ICollection<オーダー> オーダーs {get; set;}
    }

    class オーダー
    {
    [Key, Column(Order=0)]
    public int オーダーNo {get; set;}
    [Key, Column(Order=1)]
    public int オーダー詳細No {get; set;}
    [ForeignKey("納品先"), Column(Order=2)]
    public int 発注元コード {get; set;}
    [ForeignKey("納品先"), Column(Order=3)]
    public int 納品先コード { get; set;}

    public virtual 納品先 納品先 {get; set;}
    }

    処理的には、オーダー CSV から発注元コードと納品先コードの組み合わせを全て抽出し、
    発注元モデルと納品先モデルへと登録後、

    改めて、オーダー CSV の発注元名と納品先名を除いた No とコードを上記のモデルに入れています。

    理想的には、下記のようなオーダーモデルに入れて、

    class オーダー
    {
    [Key, Column(Order=0)]
    public int オーダーNo {get; set;}
    [Key, Column(Order=1)]
    public int オーダー詳細No {get; set;}

    public virtual 発注元 発注元 {get; set;}
    public virtual 納品先 納品先 {get; set;}
    }

    オーダーからの発注元と納品先の情報の取得を分かりやすくしたいのですが、
    発注元はともかく納品先が複合キーになっているので、出来ない状態です。

    なにか Fluent API 等で対処できるといいなと思って探っている状態なのですが・・・

    もっと良いモデルの設計や、Fulent API の設定等で何かあれば、ご助言を頂けると幸いです。

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

■75338  Re[2]: SQLServer2000→2008R2 へのデータ以降
□投稿者/ 魔界の仮面弁士 -(2015/03/16(Mon) 21:28:59)
    2015/03/16(Mon) 21:53:28 編集(投稿者)

    No75337 (魔界の仮面弁士) に追記
    >> -2257.5999999999999 ⇒ -2257.6
    >> 546.29999999999995 ⇒ 546.3
    > バージョンが違うことで、文字列化したときに異なる値に見えてしまうだけで、
    > 実際には同じ値ということはないでしょうか。

    念のために試算。

    たとえば、float(24) の範囲で、「-2257.6」の近似値をバイナリ表現してみます。
    有効桁数 24 bit の 2 進小数で表すので、近傍値はこのあたりになります。

     (a) -100011010001.100110011000 → 10進数の -2257.599609375 に相当
     (b) -100011010001.100110011001 → 10進数の -2257.599853515625 に相当
     (c) -100011010001.100110011010 → 10進数の -2257.60009765625 に相当
     (d) -100011010001.100110011011 → 10進数の -2257.600341796875 に相当
     (e) -100011010001.100110011100 → 10進数の -2257.6005859375 に相当

    ※SQL Server の内部的には、おそらく「c」のバイナリで格納されると思います。


    一方、最大精度の float(53) が使われていたと仮定すると、
    有効桁数 53bit なので、このあたりですね。
     (x) -100011010001.10011001100110011001100110011001100110010
     (y) -100011010001.10011001100110011001100110011001100110011
     (z) -100011010001.10011001100110011001100110011001100110100

    上記の 2 進小数を 10 進小数に直してみると、こうなります。

     (X) -2257.5999999999994543031789362430572509765625
     (Y) -2257.59999999999990905052982270717620849609375
     (Z) -2257.600000000000363797880709171295166015625


    今回の「-2257.5999999999999」も「-2257.6」も、
    もっとも近い値は Y の値ですから、
    実際は両値とも、同じバイナリであると言えるでしょう。


    === 以下蛇足 ===

    上記だけ見ると、X と Y は 17 桁ぐらいの精度をもっているかのようにも
    見えますが、それはたまたたま、そういう数値域にあったというだけです。

    内部的には、最大でも「53 bit 分」の有効桁数しかありません。

    「53 bit」で表せる値の範囲は、符号無し10進整数で「0〜9007199254740991」の
    範囲です。すなわち約 15.9 桁が、最大精度ということですね。

    この15桁(53bit)の数値列に対し、何桁目に小数点を打つのかという形で
    値を管理しているのが、『浮動小数点型』である float(53)型 です。

    === 蛇足ここまで ===


    もしも、10 進数表記での誤差を抑える必要があるのなら、float ではなく、
    『固定小数点型』である decimal 型を使ってみてください。
    これならば誤差が出る心配はありません。

    元データが float 型である以上、今更型を変更してみたところで、
    既存のデータの誤差を解消できるわけではありませんが、
    今後の事を考えれば、データ型を見直すことも必要かと。
記事No.75335 のレス /過去ログ126より / 関連記事表示
削除チェック/

■81893  レコードのSELECT,UPDATE処理時の排他制御について
□投稿者/ あさ -(2016/11/19(Sat) 10:33:09)

    分類:[ASP.NET (VB)] 

    2016/11/19(Sat) 13:14:38 編集(投稿者)
    2016/11/19(Sat) 11:04:51 編集(投稿者)

    レコードのSELECT,UPDATE処理時の排他制御について

    お世話になります。
    ASP.NET(VB),Windows10,SQLServer2014で開発しています。

    ある予約システムを作成しています。
    以下のような予約一覧テーブル(分かりやすくするために簡略化します)があるとします。
    予約Noはオートナンバーです。

    予約一覧テーブル
    予約No 部屋No 氏名
    10000  1    鈴木
    10001  2    山田
    10002  3    佐藤

    新たに予約を行う際には、いきなりUPDATEではなく、
    まずは部屋NoのMax値(ここでは3)をSELECTして、
    +1をして、部屋数の定数内であることを確認し、それから、
    UPDATE(INSERTによる)します。

    一般的に、テーブル更新時の排他制御はASP.NETの場合、
    更新時のオプティミスティックロックで行うとのことですが、
    部屋Noは主キーではないため、
    以下のような同時更新が成立してしまうのではないかと考えます。

    予約No 部屋No 氏名
    10000  1    鈴木
    10001  2    山田
    10002  3    佐藤
    10003  4    木村
    10004  4    森田

    こうなってしまいますと、部屋No=4が重複していまい、ダブルブッキングになってしまいます。

    そこで、他のユーザーがSELECT,UPDATE(INSERTによる)のトランザクション処理を行っている間は、
    他のユーザーは待機する、ようにしたいのですが、
    (これはペシミスティックロックということになりますでしょうか)
    今現在他のユーザーが処理中であるということを他ユーザーが知るための実装方法には、
    どのようなものがありますでしょうか。

    不勉強で申し訳ありません。

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

    ※例えば、すごく単純ですが、このような方法はいかがでしょうか。
    この目的のためにApplication変数を使うのは、
    サーバーへの負担が大きいでしょうか。

    SELECT,UPDATE(INSERTによる)処理に、
    以下のコードを加える。

    If Application("yoyakutyu") IsNot Nothing Then
      If Application("yoyakutyu")="他のユーザーが予約処理中" Then
        MsgBox("ただいま他のユーザーが予約処理中です。")
       Exit Sub
    End If
    Else
      Application("yoyakutyu")="他のユーザーが予約処理中"
      (SELECT,UPDATE(INSERTによる)処理)
      Application.Remove("yoyakutyu")
    End If

親記事 /過去ログ140より / 関連記事表示
削除チェック/

■81975  Re[1]: レコードのSELECT,UPDATE処理時の排他制御について
□投稿者/ Jitta -(2016/11/26(Sat) 08:44:37)
    No81893 (あさ さん) に返信
    > ある予約システムを作成しています。

     ここに書かれているのは「予約をする」ことのみです。
    では、「約が実行された」時は、どうするのでしょうか。

    > 以下のような予約一覧テーブル(分かりやすくするために簡略化します)があるとします。
    > 予約Noはオートナンバーです。
    >
    > 予約一覧テーブル
    > 予約No 部屋No 氏名
    > 10000  1    鈴木
    > 10001  2    山田
    > 10002  3    佐藤
    >
    > 新たに予約を行う際には、いきなりUPDATEではなく、
    > まずは部屋NoのMax値(ここでは3)をSELECTして、
    > +1をして、部屋数の定数内であることを確認し、それから、
    > UPDATE(INSERTによる)します。

    簡略化してあるということですが。
    当然、日付があるのでしょう。
    連泊するときは、どうなるのでしょうか。1日ごとに1レコード使うのか、ということです。
    その場合、2泊目は、部屋Noは、どうするのでしょうか。
    1日目の予約が1件、2日目の予約が0件の場合、1日目の部屋Noは2になります。2日目の部屋Noは何番?
    ここで「2」にすると、2日目が1日目になる人の部屋Noはどうなる?
    また、1,2,3と予約が埋まった後、2の人がキャンセルしたら?

    と、コードを考える前に考えなければならないことが、まだまだあるように思います。
記事No.81893 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82040  Re[2]: レコードのSELECT,UPDATE処理時の排他制御について
□投稿者/ あさ -(2016/12/02(Fri) 10:24:35)
    No81975 (Jitta さん) に返信

    ご返事遅れましてすみません。
    今回作成している予約システムは、宿泊業のものではなく、
    一時保育に関するものでして。
    なので、基本的には当日1日の特定時間のみ使用、1日ごとの利用になります。
    もし、連続で予約を入れたい場合は、それぞれの予約で、部屋NOも
    変わり得ます。
    予約が確定された、予約者が実際に来た、預けた、迎えに来た、精算して終了した、
    の各段階をフラグで管理します。

    これらのことを踏まえまして、お答えします。

    > 1日目の予約が1件、2日目の予約が0件の場合、1日目の部屋Noは2になります。2日目の部屋Noは何番?
    2日目の部屋NOは1になります。

    > ここで「2」にすると、2日目が1日目になる人の部屋Noはどうなる?
    2日目の予約で部屋NO「2」が埋まっている場合、「1」が空いていれば「1」になります。
    「1」が空いてなければ「3」になります。
    実際のコードでは、すでに埋まっている部屋NOを昇順で並べ、空きがあるかを検索、空きがなければ+1します。

    > また、1,2,3と予約が埋まった後、2の人がキャンセルしたら?
    2の人がキャンセルした場合は、次の予約は「2」に入ります。

    ありがとうございます。

    > ■No81893 (あさ さん) に返信
    >>ある予約システムを作成しています。
    >
    >  ここに書かれているのは「予約をする」ことのみです。
    > では、「約が実行された」時は、どうするのでしょうか。
    >
    >>以下のような予約一覧テーブル(分かりやすくするために簡略化します)があるとします。
    >>予約Noはオートナンバーです。
    >>
    >>予約一覧テーブル
    >>予約No 部屋No 氏名
    >>10000  1    鈴木
    >>10001  2    山田
    >>10002  3    佐藤
    >>
    >>新たに予約を行う際には、いきなりUPDATEではなく、
    >>まずは部屋NoのMax値(ここでは3)をSELECTして、
    >>+1をして、部屋数の定数内であることを確認し、それから、
    >>UPDATE(INSERTによる)します。
    >
    > 簡略化してあるということですが。
    > 当然、日付があるのでしょう。
    > 連泊するときは、どうなるのでしょうか。1日ごとに1レコード使うのか、ということです。
    > その場合、2泊目は、部屋Noは、どうするのでしょうか。
    > 1日目の予約が1件、2日目の予約が0件の場合、1日目の部屋Noは2になります。2日目の部屋Noは何番?
    > ここで「2」にすると、2日目が1日目になる人の部屋Noはどうなる?
    > また、1,2,3と予約が埋まった後、2の人がキャンセルしたら?
    >
    > と、コードを考える前に考えなければならないことが、まだまだあるように思います。
記事No.81893 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82041  Re[3]: レコードのSELECT,UPDATE処理時の排他制御について
□投稿者/ あさ -(2016/12/02(Fri) 10:24:50)
    No82040 (あさ さん) に返信
    > ■No81975 (Jitta さん) に返信
    >
    > ご返事遅れましてすみません。
    > 今回作成している予約システムは、宿泊業のものではなく、
    > 一時保育に関するものでして。
    > なので、基本的には当日1日の特定時間のみ使用、1日ごとの利用になります。
    > もし、連続で予約を入れたい場合は、それぞれの予約で、部屋NOも
    > 変わり得ます。
    > 予約が確定された、予約者が実際に来た、預けた、迎えに来た、精算して終了した、
    > の各段階をフラグで管理します。
    >
    > これらのことを踏まえまして、お答えします。
    >
    >>1日目の予約が1件、2日目の予約が0件の場合、1日目の部屋Noは2になります。2日目の部屋Noは何番?
    > 2日目の部屋NOは1になります。
    >
    >>ここで「2」にすると、2日目が1日目になる人の部屋Noはどうなる?
    > 2日目の予約で部屋NO「2」が埋まっている場合、「1」が空いていれば「1」になります。
    > 「1」が空いてなければ「3」になります。
    > 実際のコードでは、すでに埋まっている部屋NOを昇順で並べ、空きがあるかを検索、空きがなければ+1します。
    >
    >>また、1,2,3と予約が埋まった後、2の人がキャンセルしたら?
    > 2の人がキャンセルした場合は、次の予約は「2」に入ります。
    >
    > ありがとうございます。
    >
    >>■No81893 (あさ さん) に返信
    > >>ある予約システムを作成しています。
    >>
    >> ここに書かれているのは「予約をする」ことのみです。
    >>では、「約が実行された」時は、どうするのでしょうか。
    >>
    > >>以下のような予約一覧テーブル(分かりやすくするために簡略化します)があるとします。
    > >>予約Noはオートナンバーです。
    > >>
    > >>予約一覧テーブル
    > >>予約No 部屋No 氏名
    > >>10000  1    鈴木
    > >>10001  2    山田
    > >>10002  3    佐藤
    > >>
    > >>新たに予約を行う際には、いきなりUPDATEではなく、
    > >>まずは部屋NoのMax値(ここでは3)をSELECTして、
    > >>+1をして、部屋数の定数内であることを確認し、それから、
    > >>UPDATE(INSERTによる)します。
    >>
    >>簡略化してあるということですが。
    >>当然、日付があるのでしょう。
    >>連泊するときは、どうなるのでしょうか。1日ごとに1レコード使うのか、ということです。
    >>その場合、2泊目は、部屋Noは、どうするのでしょうか。
    >>1日目の予約が1件、2日目の予約が0件の場合、1日目の部屋Noは2になります。2日目の部屋Noは何番?
    >>ここで「2」にすると、2日目が1日目になる人の部屋Noはどうなる?
    >>また、1,2,3と予約が埋まった後、2の人がキャンセルしたら?
    >>
    >>と、コードを考える前に考えなければならないことが、まだまだあるように思います。
記事No.81893 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82955  Re[2]: バイナリエディタでDoubleを探す方法
□投稿者/ 魔界の仮面弁士 -(2017/02/21(Tue) 11:14:29)
    No82952 (774RR さん) に追記
    > 1.000000000000 と
    > 0.999999999999 と
    > 1.000000000001 とは違う数値になっちゃう。
    
    1.000000000001 は、内部的には (2^0 +2^-40 +2^-44 +2^-45 +2^-48 +2^-49) 相当ですね。
    
    「^」は、VB/VBA の冪演算子。(C# だと Math.Pow)
    
    
    Double バイナリを 2 進数で表記
    
    1.000000000000 → 0 01111111111 0000000000000000000000000000000000000000000000000000
    0.999999999999 → 0 01111111110 1111111111111111111111111111111111111101110011010001
    1.000000000001 → 0 01111111111 0000000000000000000000000000000000000001000110011000
    
    0.99999999999999978 → 0 01111111110 1111111111111111111111111111111111111111111111111110
    0.99999999999999989 → 0 01111111110 1111111111111111111111111111111111111111111111111111
    1.00000000000000000 → 0 01111111111 0000000000000000000000000000000000000000000000000000
    1.00000000000000020 → 0 01111111111 0000000000000000000000000000000000000000000000000001
    
    
    上記の Double バイナリを 10進小数に復元
    
    1.000000000000 →  1.00000000000000000000000000000000000000000000000000000
    0.999999999999 →  0.99999999999900002212172012150404043495655059814453125
    1.000000000001 →  1.00000000000100008890058234101161360740661621093750000
    
    0.99999999999999978 → 0.99999999999999977795539507496869191527366638183593750
    0.99999999999999989 → 0.99999999999999988897769753748434595763683319091796875
    1.00000000000000000 → 1.00000000000000000000000000000000000000000000000000000
    1.00000000000000020 → 1.00000000000000022204460492503130808472633361816406250
記事No.82950 のレス /過去ログ141より / 関連記事表示
削除チェック/

■83034  Re[1]: C#で他アプリにALT+"Fキー"などの押した状態を送信
□投稿者/ 魔界の仮面弁士 -(2017/02/27(Mon) 23:36:51)
    2017/02/28(Tue) 09:47:25 編集(投稿者)

    No83033 (ぼっさっさ さん) に返信
    > PostMessage(hwnd, 0x0100, 0x41, 0);で、aボタンを押した状態などは送信できますが、

    0x0100(WM_KEYDOWN) を送りつけているようですが、
    WM_CHAR で受け取るウィンドウもあれば、GetAsyncKeyState で判定するウィンドウもあるので、
    SendInput API とか SendKeys とかでキーストロークを投げつけたほうが汎用的かも知れません。
    非アクティブなウィンドウが相手だと使えないですが。


    > 「ALT + F」の同時押し状態はどのように送信できるのでしょうか。教えてください。

    PostMessage にしても PostThreadMessage にしても、

    WM_KEYDOWN で ALT 送信
    WM_KEYDOWN で F 送信
    WM_KEYUP で F 送信
    WM_KEYUP で ALT 送信

    じゃないですかね。

    …違った。Alt なので WM_SYSKEYDOWN の方ですね。


    ひとまず手元のアプリには、こんな感じで送れました。
    手抜きなので、LParam に渡す lKeyData は数値を直接記載しています。


    PostMessage(hWnd, WM_SYSKEYDOWN, Keys.Menu, 0x20380001);
    PostMessage(hWnd, WM_SYSKEYDOWN, Keys.F, 0x20210001);
    PostMessage(hWnd, WM_SYSCHAR, 'f', 0x20210001);
    PostMessage(hWnd, WM_SYSKEYUP, Keys.F, 0xE0210001);
    PostMessage(hWnd, WM_KEYUP, Keys.Menu, 0xC0380001);
記事No.83033 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83037  Re[2]: C#で他アプリにALT+"Fキー"などの押した状態を送信
□投稿者/ ぼっさっさ -(2017/02/28(Tue) 21:54:38)
    ご回答ありがとうございます。

    メモ帳を操作するために
    以下のように
    IntPtr hwnd = GetDesktopWindow();
    // メモ帳のウインドウハンドル取得
    hwnd = FindWindowEx(hwnd, IntPtr.Zero, "notepad", null);
    // メモ帳ウインドウ内の「edit」ウインドウのハンドル取得
    hwnd = FindWindowEx(hwnd, IntPtr.Zero, "edit", null);

    PostMessage(hWnd, WM_SYSKEYDOWN, Keys.Menu, 0x20380001);
    PostMessage(hWnd, WM_SYSKEYDOWN, Keys.F, 0x20210001);

    ALT+Fの操作ができました。

    ちなみにLPARAMの値は、何を表していますでしょうか。
    どこで調べるとよいでしょうか。

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

■83044  Re[3]: C#で他アプリにALT+"Fキー"などの押した状態を送信
□投稿者/ 魔界の仮面弁士 -(2017/03/01(Wed) 01:18:52)
    No83037 (ぼっさっさ さん) に返信
    > IntPtr hwnd = GetDesktopWindow();
    > hwnd = FindWindowEx(hwnd, IntPtr.Zero, "notepad", null);
    > hwnd = FindWindowEx(hwnd, IntPtr.Zero, "edit", null);

    Alt + F の送出なら、edit まで辿らなくても
    notepad に直接送り付ければ十分かも。


    > PostMessage(hWnd, WM_SYSKEYDOWN, Keys.Menu, 0x20380001);
    > PostMessage(hWnd, WM_SYSKEYDOWN, Keys.F, 0x20210001);

    hWnd ではなく
    hwnd だったのでは?


    > ちなみにLPARAMの値は、何を表していますでしょうか。
    > どこで調べるとよいでしょうか。
    LPARAM の値はメッセージによって異なります。
    WM_SYSKEYDOWN の場合はこちらをご覧ください。
    https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms646286.aspx


    今回の場合は 32bitの整数で、各ビットに以下の意味があります。

     16bit (0〜15bit目) キーリピート数(今回は 0x1)
     8bit (16〜23bit目) スキャンコード
     1bit (24bit目) 拡張キーが押されたかどうか(今回は 0)
     4bit (25〜28bit目) 未使用(0 固定)
     1bit (29bit目) コンテキストコード
     1bit (30bit目) 直前にキーが押されていたか(今回は 0)
     1bit (31bit目) 変換状態(0 固定)


    キーリピートは、キーを押し続けたときにカウントアップされる値です。

    スキャンコードはキーに割り当てられた番号です。たとえばこんな値。
      Esc キーなら 0x01
      A キーなら 0x1E
      S キーなら 0x1F
      D キーなら 0x20
      F キーなら 0x21
      G キーなら 0x22
      Alt キーなら 0x38

    拡張キーは、たとえば日本語109キーボードの場合、
    左 Alt の時は 0、右 Alt の時は 1 です。

    コンテキストコードは、Alt キーが押下されているかを示します。


    > PostMessage(hWnd, WM_SYSKEYDOWN, Keys.Menu, 0x20380001);
    > PostMessage(hWnd, WM_SYSKEYDOWN, Keys.F, 0x20210001);
    この場合、両者の LParam はスキャンコード(16〜23bit目)のみが異なっており、
    前者は 0x38、後者は 0x21 が指定されているというわけです。



    > メモ帳を操作するために

    あえて API を使わず、マネージコードのみで操作してみました。

    private void button1_Click(object sender, EventArgs e)
    {
      foreach (var p in Process.GetProcessesByName("notepad"))
      {
        var title = p.MainWindowTitle;
        var desktop = this.CreateAccessibilityInstance().Parent.Parent;
        var window = desktop.Navigate(AccessibleNavigation.FirstChild);
        while (window != null)
        {
          if (window.Role == AccessibleRole.Window && window.Name == title)
          {
            window.Select(AccessibleSelection.TakeFocus);

            var notepadItem = window.Navigate(AccessibleNavigation.FirstChild);
            while ((notepadItem = notepadItem.Navigate(AccessibleNavigation.Next)) != null)
            {
              if (notepadItem.Role == AccessibleRole.MenuBar)
              {
                var menu = notepadItem.Navigate(AccessibleNavigation.FirstChild);
                while (menu != null)
                {
                  if (menu.Name == "ファイル(F)")
                  {
                    menu.DoDefaultAction();
                    return;
                  }
                  menu = menu.Navigate(AccessibleNavigation.Next);
                }
              }
            }
          }
          window = window.Navigate(AccessibleNavigation.Next);
        }
      }
    }
記事No.83033 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83054  Re[4]: C#で他アプリにALT+"Fキー"などの押した状態を送信
□投稿者/ ぼっさっさ -(2017/03/01(Wed) 20:45:37)
    ご回答ありがとうございます。

    >>Alt + F の送出なら、edit まで辿らなくても
    >>notepad に直接送り付ければ十分かも。


    > PostMessage(hWnd, WM_SYSKEYDOWN, Keys.Menu, 0x20380001);
    > PostMessage(hWnd, WM_SYSKEYDOWN, Keys.F, 0x20210001);

    Alt + F以外の場合は、PostMessageで実行する方法は、
    Alt + Eや Alt + Vなどは、
    hwnd = FindWindowEx(hWnd, IntPtr.Zero, "edit", null);
    がなしではできないでしょうか。




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

<前の20件 | 次の20件>

<< 0 | 1 | 2 | 3 >>

パスワード/

- Child Tree -