visual studio 2008 express edition
C#3.5
を使用しています。

visual studioのソリューションエクスプローラーのような配置の仕方を真似したいと思っています。
どうやらSplitContainer(境界線を移動できるので)を使ってそうなんですが、
ソリューションエクスプローラー自体は1つのウィンドウのようで
ダブルクリックでSplitContainerの左側に装着したり、離れたりする仕組みのようです。
でもプログラムでウィンドウをSplitContainerに装着するやり方が分かりません・・・

this.splitContainer1.Panel1.Controls.Add(/* ここに new SolutionForm() としたら当然ですがエラーになりました */);

どのように記述すれば良いのでしょうか?

ソリューションエクスプローラーが離れる
http://ranobe.com/up/src/up360865.jpg
SplitContainerの左側に装着に装着
http://ranobe.com/up/src/up360864.jpg

A 回答 (4件)

 こんばんは。

すんません、当方の勉強不足でした。
 その後、調査をしたのですが、スプリッタコンテナのパネルにフォームを追加する事が出来るとの事実を突き止めました。
 修正をした事で、win32apiは綺麗さっぱりとなくなりました。

public partial class Form1 : Form
{
private Form2 toolWindow;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
this.toolWindow = new Form2();
this.toolWindow.Owner = this;
this.toolWindow.Tag = this;
this.toolWindow.Location = new Point(0, 0);
this.toolWindow.Size = this.splitContainer1.Panel1.Size;
this.toolWindow.Show();
}

//スプリッタコンテナのリサイズ枠
private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e)
{
//ウィンドウが着地しているのでリサイズをさせる
int index = this.splitContainer1.Panel1.Controls.IndexOf(this.toolWindow);
if (index != -1)
this.toolWindow.Size = this.splitContainer1.Panel1.ClientSize;
}

public void PostDocking(bool bDocking)
{
this.toolWindow.SuspendLayout();
this.toolWindow.Hide();
//着地させる
if (bDocking)
{
//以下をfalseにしないと例外が飛ぶ
this.toolWindow.TopLevel = false;
this.splitContainer1.Panel1.Controls.Add(this.toolWindow);
this.toolWindow.Location = this.splitContainer1.Panel1.Bounds.Location;
this.toolWindow.Size = this.splitContainer1.Panel1.ClientSize;
this.toolWindow.FormBorderStyle = FormBorderStyle.FixedToolWindow;
}
//宙に浮かせる
else
{
this.toolWindow.FormBorderStyle = FormBorderStyle.SizableToolWindow;
this.toolWindow.Location = this.PointToScreen(this.splitContainer1.Panel1.Location);
this.splitContainer1.Panel1.Controls.Remove(this.toolWindow);
this.toolWindow.TopLevel = true;
}
this.toolWindow.Show();
this.toolWindow.ResumeLayout(true);
}
}

public partial class Form2 : Form
{
public const int WM_NCMOUSEMOVE = 0xA0;
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int WM_NCLBUTTONUP = 0xA2;
public const int WM_NCLBUTTONDBLCLK = 0xA3;
public const int WM_MOUSEMOVE = 0x200;
public const int WM_LBUTTONUP = 0x202;

public const int ST_DOCKING = 0;//着地
public const int ST_NORMAL = 1;//宙刷り
public const int ST_DRAGGING = 2;//ドラッグしている(着地の状態からでないとこのフラグにはならない)

private Point ptDrag;
private int state;

public Form2()
{
InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{
this.state = ST_NORMAL;
}

//ウィンドウプロシージャのオーバーライド
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_MOUSEMOVE:
//ドラッグしていないのでこれ以上進めない
if (this.state != ST_DRAGGING)
break;

//マウスに合わせてフォームを動かす
this.Location = new Point(Cursor.Position.X - (this.Width / 2), Cursor.Position.Y);

return;

case WM_LBUTTONUP:
//ドラッグ移動から復帰
if (this.state == ST_DRAGGING)
{
//キャプチャを外す
this.Capture = false;

//宙に浮いている
this.state = ST_NORMAL;
}
break;

case WM_NCMOUSEMOVE:
//ドラッグしていないので、処理出来ない
if (this.state != ST_DRAGGING)
break;

//さっき摘んだ座標から、現在位置X,Yの何れが5ピクセル以上動いた
if (Math.Abs(this.ptDrag.X - Cursor.Position.X) > 4 ||
Math.Abs(this.ptDrag.Y - Cursor.Position.Y) > 4)
{

//フォームの宙刷りを実際に処理をする
Form1 form = (Form1)this.Tag;
form.PostDocking(false);

//キャプチャをかける
this.Capture = true;

return;
}
break;

case WM_NCLBUTTONDOWN:
//着地していないのでドラッグ出来ない
if(this.state != ST_DOCKING)
break;

//現在のマウス位置を記憶
this.ptDrag = Cursor.Position;

//ドラッグ開始
this.state = ST_DRAGGING;
return;

case WM_NCLBUTTONUP:
//ドラッグ移動が成立しないでボタンが離された
if (this.state == ST_DRAGGING)
//着地になる
this.state = ST_DOCKING;

break;

case WM_NCLBUTTONDBLCLK:
{
//着地していれば宙に浮く
if (this.state == ST_DOCKING)
this.state = ST_NORMAL;
//宙に浮いているので着地する
else
this.state = ST_DOCKING;

//フォームの離脱着を実際に処理をする
Form1 form1 = (Form1)this.Tag;
form1.PostDocking(this.state == ST_DOCKING);
}
return;
}
//システムに処理させる
base.WndProc(ref m);
}
}
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
なるほど、TopLevelを使えば良かったんですね。
ちょっと自分なりにまだ分からないところがあって調べてたんですが、
visual studioの方に完璧に似せる(その必要があるかは疑問ですけど、とりあえず興味深いので)には
まだ疑問なところがいくつかあります。
例えば、上下左右真ん中に現れるアイコンもその一つです
http://ranobe.com/up/src/up361075.jpg
ですが、本題から離れてしまうのとキリがないのと作るのに時間がかかりそうなので
とりあえず締め切りたいと思います。
ここまで作り上げたmachongolaさんに感謝したいのと
まだ自分としては完成させたいので、もしよろしければ次回質問の時にアドバイス頂ければと思います。
ありがとうございました。

お礼日時:2009/05/23 02:45

 こんにちは。

御礼頂きました。

・this.splitContainer1.Panel1にForm2を追加するやり方がわからなくて先に進めません・・・
 Formを追加する事は出来ないと思います。その他、FormのOwnerにコントロールを指定する事も出来ない筈です。
 当方もC++/CLIの方で、其処に行き詰まりました。結局の所、Win32APIのSetParent()を使用するしかありませんでした。
 そう言った理由で、Win32APIを呼び出しています(正攻法では上手くいかないとは、この事です)。
 SetParent()で、スプリッタコンテナのパネル1を宙刷りウィンドウの親に設定しています。こんな感じでしょうか(これ以外は思い浮かびません・・・)。参考資料程度で。

public partial class Form1 : Form
{
public const int SWP_NOSIZE = 1;
public const int SWP_NOZORDER = 4;

[DllImport("user32.dll")]
public static extern int SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, UInt32 uFlags);

[DllImport("user32.dll")]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent);

[DllImport("user32.dll")]
public static extern IntPtr SetCapture(IntPtr hWndCapture);

[DllImport("user32.dll")]
public static extern int ReleaseCapture();

private Form2 toolWindow;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
this.toolWindow = new Form2();
this.toolWindow.Owner = this;
this.toolWindow.Tag = this;
this.toolWindow.Location = new Point(0, 0);
this.toolWindow.Size = this.splitContainer1.Panel1.Size;
this.toolWindow.Show();
}

//スプリッタコンテナのリサイズ枠が伸縮したら
private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e)
{
//ウィンドウが着地しているのでリサイズをさせる
if (this.toolWindow.IsDocking)
this.toolWindow.Size = this.splitContainer1.Panel1.ClientSize;
}

public void PostDocking(bool bDocking)
{
this.toolWindow.SuspendLayout();
//着地させる
if (bDocking == true)
{
this.toolWindow.Hide();
SetParent(this.toolWindow.Handle, this.splitContainer1.Panel1.Handle);
this.toolWindow.FormBorderStyle = FormBorderStyle.FixedToolWindow;
this.toolWindow.Location = this.splitContainer1.Panel1.Bounds.Location;
this.toolWindow.Size = this.splitContainer1.Panel1.ClientSize;
this.toolWindow.Show();
}
//宙に浮かせる
else
{
this.toolWindow.Hide();
SetParent(this.toolWindow.Handle, IntPtr.Zero);
this.toolWindow.FormBorderStyle = FormBorderStyle.SizableToolWindow;
//スプリッタのスクリーン座標を取る
this.toolWindow.Location = this.PointToScreen(this.splitContainer1.Panel1.Location);
this.toolWindow.Show();
}
this.toolWindow.ResumeLayout(true);
}
}

public partial class Form2 : Form
{
public const int WM_NCMOUSEMOVE = 0xA0;
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int WM_NCLBUTTONUP = 0xA2;
public const int WM_NCLBUTTONDBLCLK = 0xA3;
public const int WM_MOUSEMOVE = 0x200;
public const int WM_LBUTTONUP = 0x202;

public const int ST_DOCKING = 0;//着地
public const int ST_NORMAL = 1;//宙刷り
public const int ST_DRAGGING = 2;//ドラッグしている(着地の状態からでないとこのフラグにはならない)

private Point ptDrag;
private int state;

public Form2()
{
InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{
this.state = ST_NORMAL;
}

//ウィンドウプロシージャのオーバーライド
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_MOUSEMOVE:
//ドラッグしていないのでこれ以上進めない
if (this.state != ST_DRAGGING)
break;

//マウスに合わせてフォームを動かす
Form1.SetWindowPos(this.Handle, IntPtr.Zero,
Cursor.Position.X - (this.Width / 2), Cursor.Position.Y, 0, 0,
Form1.SWP_NOZORDER | Form1.SWP_NOSIZE);
return;

case WM_LBUTTONUP:
//ドラッグ移動から復帰
if (this.state == ST_DRAGGING)
{
//キャプチャを外す
this.Capture = false;

//宙に浮いている
this.state = ST_NORMAL;
}
break;

case WM_NCMOUSEMOVE:
//ドラッグしていないので、処理出来ない
if (this.state != ST_DRAGGING)
break;

//さっき摘んだ座標から、現在位置X,Yの何れが5ピクセル以上動いた
if (Math.Abs(this.ptDrag.X - Cursor.Position.X) > 4 ||
Math.Abs(this.ptDrag.Y - Cursor.Position.Y) > 4)
{

//フォームの宙刷りを実際に処理をする
Form1 form = (Form1)this.Tag;
form.PostDocking(false);

//キャプチャをかける
this.Capture = true;

return;
}
break;

case WM_NCLBUTTONDOWN:
//着地していないのでドラッグ出来ない
if(this.state != ST_DOCKING)
break;

//現在のマウス位置を記憶
this.ptDrag = Cursor.Position;

//ドラッグ開始
this.state = ST_DRAGGING;
return;

case WM_NCLBUTTONUP:
//ドラッグ移動が成立しないでボタンが離された
if (this.state == ST_DRAGGING)
//着地になる
this.state = ST_DOCKING;

break;

case WM_NCLBUTTONDBLCLK:
{
//着地していれば宙に浮く
if (this.state == ST_DOCKING)
this.state = ST_NORMAL;
//宙に浮いているので着地する
else
this.state = ST_DOCKING;

//フォームの離脱着を実際に処理をする
Form1 form1 = (Form1)this.Tag;
form1.PostDocking(this.state == ST_DOCKING);
}
return;
}
//システムに処理させる
base.WndProc(ref m);
}

//着地しているかどうかを示すプロパティ
public bool IsDocking
{
get { return this.state != ST_NORMAL; }
}
}
    • good
    • 0

 こんばんは。

御礼頂きました。
・visual studioの方は移動させようとする瞬間に親ウィンドウからソリューションエクスプローラーを切り離しているのでしょうか?
 VisualStudioをじっくりと観察してみましたが、着地している状態から、キャプションバーを摘んで一定量動かした瞬間、宙に浮かせ、更にキャプチャをかけて、マウスの動きに合わせて移動している見たいですので、其の通りだと思います。
 まあ、フローティング系のウィンドウは兎に角、面倒で、ややこしく成りましたが、一応そんな感じになりました。
 ダブルクリックで、着地⇔宙刷り
 着地状態から、マウスで摘んで、一定量動くと、宙刷りになってマウスと一緒に移動します。
 参考資料程度で。

//メインウィンドウ
public partial class Form1 : Form
{
public const int SWP_NOSIZE = 1;
public const int SWP_NOZORDER = 4;

[DllImport("user32.dll")]
public static extern int SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, UInt32 uFlags);

[DllImport("user32.dll")]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent);

[DllImport("user32.dll")]
public static extern IntPtr SetCapture(IntPtr hWndCapture);

[DllImport("user32.dll")]
public static extern int ReleaseCapture();

private Form2 toolWindow;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
this.toolWindow = new Form2();
this.toolWindow.Owner = this;
this.toolWindow.Tag = this;
this.toolWindow.Location = new Point(0, 0);
this.toolWindow.Size = this.splitter1.Size;
this.toolWindow.Show();
}

public void PostDocking(bool bDocking)
{
this.toolWindow.SuspendLayout();
//着地させる
if (bDocking == true)
{
this.toolWindow.Hide();
SetParent(this.toolWindow.Handle, this.splitter1.Handle);
this.toolWindow.FormBorderStyle = FormBorderStyle.FixedToolWindow;
SetWindowPos(this.toolWindow.Handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
this.toolWindow.Show();
}
//宙に浮かせる
else
{
this.toolWindow.Hide();
SetParent(this.toolWindow.Handle, IntPtr.Zero);
this.toolWindow.FormBorderStyle = FormBorderStyle.SizableToolWindow;
//スプリッタのスクリーン座標を取る
Point ptScreen = this.PointToScreen(this.splitter1.Location);
SetWindowPos(this.toolWindow.Handle, IntPtr.Zero, ptScreen.X, ptScreen.Y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
this.toolWindow.Show();
}
this.toolWindow.ResumeLayout(true);
}
}

//宙刷り又は着地のウィンドウ
public partial class Form2 : Form
{
public const int WM_NCMOUSEMOVE = 0xA0;
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int WM_NCLBUTTONUP = 0xA2;
public const int WM_NCLBUTTONDBLCLK = 0xA3;
public const int WM_MOUSEMOVE = 0x200;
public const int WM_LBUTTONUP = 0x202;

public const int ST_DOCKING = 0;//着地
public const int ST_NORMAL = 1;//宙刷り
public const int ST_DRAGGING = 2;//ドラッグしている(着地の状態からでないとこのフラグにはならない)

private Point ptDrag;
private int state;

public Form2()
{
InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{
this.state = ST_NORMAL;
}

//ウィンドウプロシージャのオーバーライド
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_MOUSEMOVE:
//ドラッグしていないのでこれ以上進めない
if (this.state != ST_DRAGGING)
break;

//マウスに合わせてフォームを動かす
Form1.SetWindowPos(this.Handle, IntPtr.Zero,
Cursor.Position.X - (this.Width / 2), Cursor.Position.Y, 0, 0,
Form1.SWP_NOZORDER | Form1.SWP_NOSIZE);
return;

case WM_LBUTTONUP:
//ドラッグ移動から復帰
if (this.state == ST_DRAGGING)
{
//キャプチャを外す
this.Capture = false;

//宙に浮いている
this.state = ST_NORMAL;
}
break;

case WM_NCMOUSEMOVE:
//ドラッグしていないので、処理出来ない
if (this.state != ST_DRAGGING)
break;

//さっき摘んだ座標から、現在位置X,Yの何れが5ピクセル以上動いた
if (Math.Abs(this.ptDrag.X - Cursor.Position.X) > 4 ||
Math.Abs(this.ptDrag.Y - Cursor.Position.Y) > 4)
{

//フォームの宙刷りを実際に処理をする
Form1 form = (Form1)this.Tag;
form.PostDocking(false);

//キャプチャをかける
this.Capture = true;

return;
}
break;

case WM_NCLBUTTONDOWN:
//着地していないのでドラッグ出来ない
if(this.state != ST_DOCKING)
break;

//現在のマウス位置を記憶
this.ptDrag = Cursor.Position;

//ドラッグ開始
this.state = ST_DRAGGING;
return;

case WM_NCLBUTTONUP:
//ドラッグ移動が成立しないでボタンが離された
if (this.state == ST_DRAGGING)
//着地になる
this.state = ST_DOCKING;

break;

case WM_NCLBUTTONDBLCLK:
{
//着地していれば宙に浮く
if (this.state == ST_DOCKING)
this.state = ST_NORMAL;
//宙に浮いているので着地する
else
this.state = ST_DOCKING;

//フォームの離脱着を実際に処理をする
Form1 form1 = (Form1)this.Tag;
form1.PostDocking(this.state == ST_DOCKING);
}
return;
}
//システムに処理させる
base.WndProc(ref m);
}
}
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
試してみましたが、ほぼ理想的な動作になったのですが、
visual studioの方と比較すると、
Form2はsplitter1のサイズに合わせるというより
splitter1に横のスクロールバーが現れてるようです。
境界線を広げてForm2の横幅を超えると、
Form2自体が横に大きくなっているのではないかと考えられます。

(クリックしたまま境界線を右に移動してる最中です)
http://ranobe.com/up/src/up361300.jpg

そこでsplitter1で実行時に境界線を動かすことができなかったので、
splitContainer1に書き換えて試そうとしたのですが、
初めの疑問に戻って申し訳ないのですが、
this.splitContainer1.Panel1にForm2を追加するやり方がわからなくて先に進めません・・・
一応
this.splitContainer1.Panel1.Controls.Add(this.toolWindow);
これで実行はできるのですが、ダブルクリックして装着しようとすると
「トップレベルのコントロールをコントロールに追加できません。」
というエラーになります。
AutoScroll属性をtrueにして、境界線がForm2の幅を越したら
Form2を横に伸ばすというプログラムになると思うのですが、
machongolaさんのsplitContainer1を使ったやり方ももしよろしかったら見せて頂けないでしょうか?

お礼日時:2009/05/22 02:55

 こんばんは。

用はフローティングツールウィンドウの事でしょうか。
 此れは、正攻法では無理でしょう・・・。
 過去何回か実装した事がありますが、本当の所、VisualStudioがどの様に実現しているのかは分かりません。
 一応以下で、同じ動きはしますが、座標の計算などアバウトに済ませています。
 その他にも、着地した時は移動出来ない様にしなければならない、たまに消えてしまう等(SetParent()の後にSetWindowLong()でスタイルをWS_CHILDに設定していないからかもしれないです)課題は山積していますが、取り敢えずは参考資料程度で。

//メインのウィンドウ
public partial class Form1 : Form
{
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent);

private bool bDocking;ドッキングしているかどうか
private Form toolWindow;//宙を浮くForm2の事

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
this.toolWindow = new Form2();
this.toolWindow.Owner = this;
this.toolWindow.Tag = this;
this.toolWindow.Location = new Point(0, 0);
this.toolWindow.Size = this.splitter1.Size;
this.toolWindow.Show();
}

public void PostDocking()
{
//スプリットの上にいれば、宙に浮かす
if (this.bDocking)
{
this.toolWindow.Hide();
this.toolWindow.Location = new Point(0, 0);
this.toolWindow.Size = this.splitter1.Size;

SetParent(this.toolWindow.Handle, IntPtr.Zero);
this.toolWindow.WindowState = FormWindowState.Normal;

this.toolWindow.Show();
this.bDocking = false;
}
//宙に浮いていれば、スプリットの上につける
else
{
this.toolWindow.Hide();
SetParent(this.toolWindow.Handle, this.splitter1.Handle);
this.toolWindow.WindowState = FormWindowState.Maximized;

this.toolWindow.Location = new Point(0, 0);
this.toolWindow.Size = this.splitter1.Size;
this.toolWindow.Show();
this.bDocking = true;
}
}
}

//此方が宙に浮いたりするウィンドウ
public partial class Form2 : Form
{
private const int WM_NCLBUTTONDBLCLK = 0xA3;

public Form2()
{
InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{

}

//ウィンドウプロシージャのオーバーライド
protected override void WndProc(ref Message m)
{
//キャプションのダブルクリック
if (m.Msg == WM_NCLBUTTONDBLCLK)
{
Form1 form = (Form1)this.Tag;
form.PostDocking();
return;
}
//システムに処理させる
base.WndProc(ref m);
}
}
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
なるほど、一般的なやり方として知られているわけじゃなかったんですね。
machongolaさんのコードで試してみましたが、たしかにそれっぽいかんじになりました。
visual studioの方との違いとして、ソリューションエクスプローラー(Form2に相当)は
着地した時は移動出来ないというより移動させようとすると下の図のようになり、

(マウスカーソルは写っていませんが、ソリューションエクスプローラーの頭をクリックしたままの状態です)
http://ranobe.com/up/src/up361075.jpg
ソリューションエクスプローラーがSpliterから飛び出して、完全に独立しているようです。

machongolaさんの方は、Spliterの中に入り込んでる状態です。
http://ranobe.com/up/src/up361076.jpg

visual studioの方は移動させようとする瞬間に親ウィンドウからソリューションエクスプローラーを切り離しているのでしょうか?
つまり
>this.toolWindow.Owner = this;
の部分を変更しているのかなと思うのですが

お礼日時:2009/05/21 01:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC#経過時間の求め方

C#経過時間の求め方

お世話になっております。
初歩的な質問かもしれないので申し訳ないのですが、
やり方がわからなかったため質問させていただきます。

現在日時から定義の時間を引いた経過時間を求めたいのですが、やり方がわかりません。

現在、以下のようにやっているのですが、
データ型の規定を外れてしまうためエラーになってしまいます。

---------------------------------------------
string date = "2010/09/25";
string time = "13:00:00";

string[] b = {};
string[] c = {};
DataTime a;

b = date.Split('/');
c = time.Split(':');
a = DateTime.Now.AddYears(-int.Parse(b[0]));
a = DateTime.Now.AddMonths(-int.Parse(b[1]));
a = DateTime.Now.Add(new TimeSpan(-int.Parse(b[2]), -int.Parse(c[0]), -int.Parse(c[1]), -int.Parse(c[2])));
---------------------------------------------

経過時間を求めたいので、
○時間○分だけでも表示できるようにしておきたいです。

何か適切な方法はありませんでしょうか?
ご回答頂ければありがたく思います。

宜しくお願い致します。

C#経過時間の求め方

お世話になっております。
初歩的な質問かもしれないので申し訳ないのですが、
やり方がわからなかったため質問させていただきます。

現在日時から定義の時間を引いた経過時間を求めたいのですが、やり方がわかりません。

現在、以下のようにやっているのですが、
データ型の規定を外れてしまうためエラーになってしまいます。

---------------------------------------------
string date = "2010/09/25";
string time = "13:00:00";

string[] b = {};
string[] c = {};
DataTime a;...続きを読む

Aベストアンサー

まず,できることなら日付と時刻をSystem.StringではなくSystem.DateTimeで持たせてください。
それができないならば,計算前にSystem.DateTime型に変換してしまってください。

MSDN: DateTime.ParseExact メソッド (System)
http://msdn.microsoft.com/ja-jp/library/system.datetime.parseexact.aspx
MSDN: DateTime.TryParseExact メソッド (System)
http://msdn.microsoft.com/ja-jp/library/system.datetime.tryparseexact.aspx
MSDN: DateTime.Subtraction 演算子 (DateTime, DateTime) (System)
http://msdn.microsoft.com/ja-jp/library/1905yhe2.aspx

example)
var target = DateTime.ParseExact(date + " " + time, "yyyy/MM/dd HH:mm:ss", CultureInfo.InvariantCulture);
var result = DateTime.Now - target;
Console.WriteLine("{0}時間{1}分", (int)result.TotalHours, result.Minutes);

まず,できることなら日付と時刻をSystem.StringではなくSystem.DateTimeで持たせてください。
それができないならば,計算前にSystem.DateTime型に変換してしまってください。

MSDN: DateTime.ParseExact メソッド (System)
http://msdn.microsoft.com/ja-jp/library/system.datetime.parseexact.aspx
MSDN: DateTime.TryParseExact メソッド (System)
http://msdn.microsoft.com/ja-jp/library/system.datetime.tryparseexact.aspx
MSDN: DateTime.Subtraction 演算子 (DateTime, DateTime) (System)
http://ms...続きを読む

QVisual Studio 2005で

現在、会社(建設会社)でVisual Studio 2005 Professionalを購入し、従来使用していたMicrosoft Accessで作成した業務アプリケーションの移行を計画中です。

そこで、Visual Studioには様々な開発言語が組み込まれていますが、どれを使うのがよいか決めかねています。

Accessを使っていたのであれば、VisualBasicが賢明だとは思うのですが、最近C言語を扱える中途採用者を採用し、上司がC言語での作り変えを要求しています。

理由は、AccessよりC言語の方が速いとか安定しているというものと、今後C言語で作り変えたものを他社に販売する計画があるからです。

Accessで作成したアプリケーションは、サーバにmdbを置いて、複数のクライアントでデータを入力するものです。
入力されたデータを管理者が一覧で閲覧できたり、承認したりする機能もあります。

このような形態のアプリケーションを果たして、
何で作り変えていけばいいのでしょうか

ちなみにその中途採用者は、あくまでC言語を扱っていただけでVisualC++やVisualC#は初めてでして、ほぼ初心者なんです。

そのこと、上司は知らないし…

現在、会社(建設会社)でVisual Studio 2005 Professionalを購入し、従来使用していたMicrosoft Accessで作成した業務アプリケーションの移行を計画中です。

そこで、Visual Studioには様々な開発言語が組み込まれていますが、どれを使うのがよいか決めかねています。

Accessを使っていたのであれば、VisualBasicが賢明だとは思うのですが、最近C言語を扱える中途採用者を採用し、上司がC言語での作り変えを要求しています。

理由は、AccessよりC言語の方が速いとか安定しているというものと、今後C言語...続きを読む

Aベストアンサー

まずVS2005のVBは.NET系で
VB6までと違いすぎる言語です。
でVBAはVB6までの言語に近いです。
後、CとC++ですがCを拡張した物が
C++と言いたいですがその拡張部分がやっかいです。
オブジェクト指向を理解してさらにVC++でMFCアプリとして
.NET系でなくてWindowsネイティブアプリを作るとなると
MFCについての知識も必要です。
場合によってはWin32APIそのものを知る必要があります。

>Accessで作成したアプリケーションは、サーバにmdbを置いて、複数のクライアントでデータを入力するものです。
>入力されたデータを管理者が一覧で閲覧できたり、承認したりする機能もあります。

それともしも本格的にやるならDBとしてアクセスは選択肢から外しますけどね。
オラクル、MS SQL Server
フリーならMySQL,PostgreSQL(フリーだが両方ともアクセスより優秀)

QC#でのデータ転送時間

C#で、System.Net.Sockets.TcpListenerとSystem.Net.Sockets.TcpClientを使用し、転送時間の計測をしているのですが、データ量を変更(byte数:60000、90000、120000、150000)しても転送時間が殆ど変わりません。
こういうものなのでしょうか?
どなたかご存知でしたら、教えてください。

Aベストアンサー

C#はあまり詳しくないんですが最適化のために.NETが自前でプールしているんじゃないでしょうか。

QVisual studioで作成したexeファイル

Visual C# express editionで作成したプログラムをビルドしてexeファイルが出来上がりました。

C#学習のために、パスワードなどを管理するようなプログラムを作成してみたのですが、
exeをメモ帳で開いてビックリ、自分が作成したクラス、メソッド、メンバの名前がバレバレです。

私にはできないのですが、これはリバースエンジニアリングされた場合には、簡単に解読されてしまいますか?

例えばメンバ変数にパスワードをキャッシュしておくPasswordstringなんて変数名があったらすぐにメモリ上から探せたりするでしょうか?

よろしくお願いします。

Aベストアンサー

簡単に解読できるようですね。
とりあえず、↓を読まれることをお勧めします。
http://www.atmarkit.co.jp/fdotnet/tools/dotfuscator/dotfuscator_01.html

QC# で一定時間待機するのにCPUを消費しない方法

C# で一定時間待機するのにSleepメソッドを使用しますが、
Sleepメソッド使用中はCPUを大量に消費します。

CPUを消費しない方法はあるのでしょうか?

ただしクラス内でのコーディングとし、
フォーム内使用のTimerメソッドは使用しないとします。
(クラス内であればTimerメソッドは使用OKとします。)

Aベストアンサー

どのようなコードをお書きなのでしょう?

int n = 0;
while( n < 1000 )
{
  Thread.Sleep( 100 );
  n++;
  Application.DoEvents();
  label1.Text = n.ToString();
}

フォームにボタンとラベルを貼って上記のコードをボタンのClickイベントに記述して実行した際に
タスクマネージャのパフォーマンスタブで確認してみましたが
ほとんど影響が無いように思います

本当に作成中のアプリのCPU使用率が上がってしまっているのでしょうか

QVisual Studio,NETのアカデミック版って

Visual Studio,NETのアカデミック版って学生が購入できるそうですが、学生を卒業した後には業務とかで使用できなくなるのですか?

Aベストアンサー

>例えばいつか自分が独立開業したときもその会社名義で買いなおさないとまずいのでしょうか??

その時分には、現行のバージョンが古いものとなっており、業務には使えないものとなっているでしょう。そのため、業務用であれば、会社で購入することになってしまうと思います。

Q一定時間でPostBackさせたい(ASP.NET C#)

いつもお世話になっております。

おそらく簡単なことなので自力で解決しようとしているのですが、4時間ほど悩んでいますので、お力をお貸し下さい。

VS2003
C# ASP.NET Webアプリケーション


ある画面を一定時間毎に切り替えたいと考えています。
同じ画面で引数を変えて表示を変えるので、PostBackさせれば良いかと思っています。

そこで、以下のようなコードを書きました。

private void Page_Load(object sender, System.EventArgs e)
{
// ページを初期化するユーザー コードをここに挿入します。
if (!IsPostBack)
{
Timer timTest = new Timer();
timTest.Elapsed += new ElapsedEventHandler(OnTimedEvent);
timTest.Interval = 2000;
timTest.Enabled = true;
timTest.AutoReset = true;
lblOnOff.Text = timTest.Enabled.ToString();
timTest.Start();
}
}


private void OnTimedEvent(object source, ElapsedEventArgs e)
{
***********
}

この「***********」の部分で処理とPostBackをしたいのですが、
何を書けばうまくPostBackできるのかが分かりません。

ご存知の方がいらっしゃいましたら、教えてください。

宜しくお願いいたします。

いつもお世話になっております。

おそらく簡単なことなので自力で解決しようとしているのですが、4時間ほど悩んでいますので、お力をお貸し下さい。

VS2003
C# ASP.NET Webアプリケーション


ある画面を一定時間毎に切り替えたいと考えています。
同じ画面で引数を変えて表示を変えるので、PostBackさせれば良いかと思っています。

そこで、以下のようなコードを書きました。

private void Page_Load(object sender, System.EventArgs e)
{
// ページを初期化するユーザー コードをここに挿入...続きを読む

Aベストアンサー

お世話になります。

これは、記述されているコードをみると
実際に行われているのはサーバー側のタイマ処理ですね。

クライアントから 一定時間ごとに サーバーへ
PostBack したいのであれば、
クライアント側のタイマを使わないと
まずいだろうと思います。

参考URL:http://www9.plala.or.jp/oyoyon/html/script/timeout.html

QVisual Studio 2008 評価版イメージのハッシュ

毎度のことながら OKWave のカテゴライゼーションが変で適切なカテゴリがないことと、質問に出てくる用語も知らない人に別カテゴリで変レスされてしまいましたので、ここで質問させてください。

下記 2 つのファイルをいくつかのダウンロード マネージャで何度かダウンロードしたのですが、ダウンロード途上でファイルが壊れてしまいます。回線品質が悪いのか、なぜ壊れるかはとりあえずおいといて質問です。

インストールやその後の試用で問題ない方、複数回ダウンロードされた方でそれぞれの回のハッシュが一致した方など、状況的に壊れていないであろうと推定されるファイルの SHA1、ないし MD5 ハッシュをそれぞれのイメージについて教えてください。もしくは、Microsoft がハッシュをどこかで公開しているなら、その場所でもよいです (見つかりませんでした; Microsoft がなぜそのくらいしてくれないのか不思議です)。

VS2008ProEdition90dayTrialJPNX1435988.iso
Visual Studio 2008 Professional Edition (90 日間評価版)
http://www.microsoft.com/downloads/details.aspx?FamilyId=83C3A1EC-ED72-4A79-8961-25635DB0192B&displaylang=ja

VS2008MSDNLibraryJPNX1425418.iso
MSDN Library for Visual Studio 2008
http://www.microsoft.com/downloads/details.aspx?familyid=6FF3BC60-32C8-4C22-8591-A20BF8DFF1A2&displaylang=ja

毎度のことながら OKWave のカテゴライゼーションが変で適切なカテゴリがないことと、質問に出てくる用語も知らない人に別カテゴリで変レスされてしまいましたので、ここで質問させてください。

下記 2 つのファイルをいくつかのダウンロード マネージャで何度かダウンロードしたのですが、ダウンロード途上でファイルが壊れてしまいます。回線品質が悪いのか、なぜ壊れるかはとりあえずおいといて質問です。

インストールやその後の試用で問題ない方、複数回ダウンロードされた方でそれぞれの回のハッシュ...続きを読む

Aベストアンサー

>> ...変レスされて...
何を勘違いしてどんなレスが付いたか想像に難くありません。困ったものですね。。

で、それぞれ落としてみました。以下の通りです。

VS2008ProEdition90dayTrialJPNX1435988.iso
filesize: 4151320576
sha1sum : f5c242bb3812282d9f9cb34d98adb3d35eddb1d9
md5sum : c922506a40426433ee0e3d0fbd712cd2

VS2008MSDNLibraryJPNX1425418.iso
filesize: 2584350720
sha1sum : 23846b5a33c9712d7c885b63d56028c9693a8bbc
md5sum : eeef9b4f0dc06d82edd0c872eabb21bd

落ちてくる間にこんなwikiを見つけました
http://amayus.com/wiki/?Microsoft+MD5
「Visual Studio 2008 Professional Edition」 の方はこのwikiに掲載されている値と全く相違が無かったので、1回しか落としてません。
「MSDN Library」の方はホストとクライアントを変えて計2回落としましたが同じハッシュ値が得られました。 また、残念ながらこれらのソフトウェアを動かせる環境を持っていないため、試用はおろかインストールさえ出来ないので、あくまでもイメージファイルのchecksumだけしか御報告できません。すみません。

重ねて、肝心のファイルが壊れる件については何もわからないので申し訳ないです。回線品質によるものが一番怪しいとは思いますが、もし可能ならば落ちて来た(来つつある)ファイルを書き込む先として指定するデバイスやファイルシステムを変えてお試しになっては如何でしょうか。(別のHDDへとか、NTFS上にあるフォルダでなくext3上のディレクトリへ[この場合ext3を使える環境での操作ですが]、など)
#そんなことで改善なんかするものなのか甚だ疑わしいですが(^^;

御参考のひとつにでもなれば幸いです

>> ...変レスされて...
何を勘違いしてどんなレスが付いたか想像に難くありません。困ったものですね。。

で、それぞれ落としてみました。以下の通りです。

VS2008ProEdition90dayTrialJPNX1435988.iso
filesize: 4151320576
sha1sum : f5c242bb3812282d9f9cb34d98adb3d35eddb1d9
md5sum : c922506a40426433ee0e3d0fbd712cd2

VS2008MSDNLibraryJPNX1425418.iso
filesize: 2584350720
sha1sum : 23846b5a33c9712d7c885b63d56028c9693a8bbc
md5sum : eeef9b4f0dc06d82edd0c872eabb21bd

落ちて...続きを読む

QC#の0.98fの様な表記方法について質問です。

C#の0.98fの様な表記方法について質問です。

現在、C#を学習しています。
教材に0.98fの表記がでてきたのですが、説明文がありませんでした。

上記の様な
 数値 + アルファベット
の表記方法の意味を教えてください。

Aベストアンサー

Microsoftはちゃんと仕様を公開してましてね。

http://msdn.microsoft.com/en-us/library/aa691085%28v=VS.71%29.aspx

>A real literal suffixed by F or f is of type float.

Fもしくはfの付いた実数リテラルはfloat型である。

#多分ECMA-374にもあるけど、オンラインで見られたほうが楽なんで。
http://www.ecma-international.org/publications/standards/Ecma-334.htm

QVisual Studio 2005 academic edition・・・

プログラミングを勉強する為にVisual Studio 2005 academic editionを買おうと思っているのですが、これと一緒に買ったら良い本はありますか?

Aベストアンサー

使う言語は何ですか?C言語であれば著者が大原英郁の「C言語の基礎」というものがわかりやすく挫折しにくいと思います。もしある程度C言語を使えるならば他のほうがよいかもしれないです。


人気Q&Aランキング

おすすめ情報