ちくのう症(蓄膿症)は「菌」が原因!?

C#でユーザーコントロールを作成しています。
※C#のカテゴリーがないので、こちらに質問させていただきます。

既存のコントロールを基底クラスとしているのですが、下記のコードで基底クラスのプロパティであるXXXを使用できないようにしました。

[Browsable(false)]
[Obsolete("使用不可", true)]
public new int XXX { get { return 0; } set { } }

この、XXXに対してアクセスするコードはコンパイルエラーとなり、プロパティウィンドウにも表示されず、一応は使用できないようには出来ました。
ところが、コントロールをフォームに貼り付けて、他の使用可能なプロパティ(YYYプロパティとします)を変更すると、Form.Designer.csのInitializeComponent()に、XXXに値を設定するコードが自動生成されます。当然、そのままコンパイルすればエラーとなります。
※XXXは、YYYの値に連動して値が変化する仕様です。YYYを追加したことでXXXが不要というか、あっては事故のもとになるので、使用不可にしました。

そこで、お教え願いたいのは、Form.Designer.csのInitializeComponent()に、プロパティの値を設定するコードが生成される仕組みです。若しくは、設定するコードが生成されないようにする方法です。

以上よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

例えばTextBoxのMaxLengthだった時


取得は可能だが、設定は許可しない例です。

【コンポーネントの実装】
class Class1 : TextBox
{
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new int MaxLength
{
get { return 0; }
protected set { }
}

private int _yyy;
public int YYY
{
get
{
return this._yyy;
}
set
{
this._yyy = value;
base.MaxLength = this._yyy;
}
}
}


【利用時】
class11.MaxLength = 1;

エラーメッセージ
set アクセサーにアクセスできないため、プロパティまたはインデクサー 'WindowsFormsApplication1.Class1.MaxLength' はこのコンテキストでは使用できません。




EditorBrowsable(EditorBrowsableState.Never)
外部ソリューションで参照された際に、コード入力中に表示されるインテリセンスの候補として出現しなくなります。
勘違いしてはならないのが、同一ソリューション内の他プロジェクトでは効きません。

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
コンポーネントを設置した際、Designerファイルで自動生成されるコードとして除外します。
これを設定することで、Designerファイル上にプロパティの設定コードは自動生成されません。



上記例だと、結果的に以下の動作になります。
 ・Designerファイルで制御文が入ってこない。
 ・インテリセンスに表示されてこない。
 ・直接入力されたとしても、値を設定することはできず、無意味?な値の取得のみ行える。
  (無意味かどうかは実装に応じて・・・)


Obsolete("使用不可", true)は、上記に加えてお好きにどうぞ、という感じです。
Obsolete()はメッセージが適切かどうか微妙では?
操作不能としたいという要望では、上記の方法論の方が適切かもしれません。
    • good
    • 0
この回答へのお礼

早速の回答、ありがとうございました。
試したところ、うまく動作しました。

お礼日時:2015/01/20 18:01

このQ&Aに関連する人気のQ&A

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

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

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

QC#「オブジェクト参照が必要です」(初心者)

Visual C# 2008を学習中なんですが、とりあえず何か作ってみようと思って、パラパラマンガに挑戦してみました。
Form1にpictureBox1を作り、waitを入れてイメージを書き換えるという単純なものです。
ところが実行しようと思ったら、「静的でないフィールド、メソッド、またはプロパティ’WindowsFormApplication1.Form1.pictureBox1’でオブジェクト参照が必要です」というエラーが出ます。その際のフォーカスは、main()内の
Form1.pictureBox1.image = Image.FromFile("motion1.png");
”Form1.pictureBox1”に当てられています。

何が原因と考えられるでしょうか。
もし情報不足であればご指摘いただくか、あるいはこの目的においてやらなければいけないこと、を大雑把に教えていただくだけでも幸いです。
よろしくお願いします。

Aベストアンサー

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具体的な解決方法としては、PictureBoxに初期画像を設定する処理をForm1のコンストラクタでやるのがいいと思います。
その際、redfox63さんがおっしゃられるように
this.pictureBox1
と記述することが必要です。(thisは自分自身のインスタンスを指します)

後は、Windowsフォームで一定間隔での処理をするための「Timerコンポーネント」について調べてみたらいいと思います。

タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)
http://www.atmarkit.co.jp/fdotnet/dotnettips/372formstimer/formstimer.html

MSDNライブラリ Timerクラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.timer.aspx

参考URL:http://www.atmarkit.co.jp/fdotnet/csharp_abc2/index/

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具...続きを読む

QTextBoxに半角数字のみの入力しかできないようにしたい

タイトルどおりです。
フォームに貼り付けた、TextBoxに、半角数字のみしか入力できないようにしたいです。
000000~999999までのコード(数字)を入力させるようにするわけですが、そのままだと半角英数も全角も入力できてしまいます。

GrapeCity社製のカスタムコントロール「InputMan」の“Number”を用いると簡単なのですが、これだとカーソルがボックス内の右端にきて、一の位から入力が始まってしまいます。
数字は、ボックス内の左側から入力されていくようにしたいのですが、“Number”だとなんか出来なさそう・・・?
(“Number”で左側から入力できるならそれがいいのですが)

そこで、TextBoxを使うことにしたのですが、TextBoxだと、半角数字のみしか入力できないような制限がかけるのかが、わかりません。

もし、お分かりの方がいらっしゃいましたら、ご教授下さいませ。

Aベストアンサー

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ' Ctrl + V
Case &H18 ' Ctrl + X
Case &H1A ' Ctrl + Z
Case Else
KeyAscii = 0
End Select
End Sub

で、いかがでしょうか。

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ...続きを読む

QC#にて別クラスの関数を使いたい

C#にて、別クラスの関数を使用する方法を教えてほしいです。

下記のような、構造体を受け取るメソッドを作りました。

*****************************
private struct MyPoint
{
public int x;
public int y;
}

private void proc1(MyPoint pt)
{
MessageBox.Show("座標:" ; pt.x + "," + pt.y + "実行結果");
}

private void button1_Click(object sender ,System.EventArgs e)
{

MyPoint pt;
pt.x = 10;
pt.y = 20;
proc(pt);
}
*****************************

別のフォームのクラスから、proc1を呼び出したいのですが、やり方がわかりません。
どうか、教えてください。

Aベストアンサー

同じ定義をしたとしても別の名前空間に書いた構造体は同一とはみなされません。

呼び出し先クラスでの構造体を private では無く、public で宣言して下さい。

呼び出し元では、

MyClass.MyPoint pt;

のようにして実体を作ります。

Qファイル出力の場所を指定

現在C++にてhtmlファイルを出力するプログラムを作っているのですが、出力場所を指定することはできるのでしょうか?(現在はそのプログラムソースが保存されている場所と同じファイル内に出力されますが、それをデスクトップに出力するなど。)
もし、方法がありましたら、教えてください。
ソースや参考HPのURLなどのせていただけたらありがたいです。
環境はVisualStudio.NET2003です。
よろしくお願いします。

Aベストアンサー

単にファイル名の前にパスを指定する。

絶対パス指定
fp=fopen("c:/temp/test.txt","w");

相対パス指定
fp=fopen("./hoge/test.txt","w");


デスクトップはOSやユーザによって場所が異なるので、少し面倒です。
XPの場合環境変数を利用してこんな感じで出来ると思います。

例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
FILE *fp;
char fname[1024];
strcpy(fname,getenv("USERPROFILE"));
strcat(fname,"/デスクトップ/test.txt");
fp=fopen(fname,"w");
//処理
fclose(fp);
}

QC# showdialogの戻り値について

お世話になります。

C#2005で開発をしております。
質問内容を以下に記述致します。

FormA及びFormBがあり以下の処理を実行します。
(1)FormAからFormBをShowdialogで呼び出す
(2)FormBにて任意の処理を実行する
(3)FormAがFormBを閉じ、戻り値を受け取る

ここで(3)の時に戻り値をDialogResult以外の戻り値で取得したいのですが、
方法はございますでしょうか。
可能であればint型数値で戻り値を設定したいと考えております。

お手数ですがご教示いただければ幸いに存じます。

以上宜しくお願い申し上げます。

Aベストアンサー

既存のShowDialog()を利用せず、FormBでShowDialog()をオーバーロードすればいいのでは。

【Form1.cs】
Form2 form = new Form2();
int result = form.ShowDialog();
Console.WriteLine(result);

【Form2.cs】
DialogResult result = base.ShowDialog();
if (result == System.Windows.Forms.DialogResult.OK)
{
return 0;
}
else
{
return 1;
}

みたいな。

また、ShowDialog()で制御がFormAに戻ってくるタイミングは、FormBが閉じられた時です。
つまり、(3)の前半部分はShowDialog()では実現できません。

既存のShowDialog()を利用せず、FormBでShowDialog()をオーバーロードすればいいのでは。

【Form1.cs】
Form2 form = new Form2();
int result = form.ShowDialog();
Console.WriteLine(result);

【Form2.cs】
DialogResult result = base.ShowDialog();
if (result == System.Windows.Forms.DialogResult.OK)
{
return 0;
}
else
{
return 1;
}

...続きを読む


人気Q&Aランキング