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

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

C# と VB.NET の入門サイト

Re[3]: クラスについてまた教えてください。


(過去ログ 29 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■13863 / inTopicNo.1)  クラスについてまた教えてください。
  
□投稿者/ ポンデC# (4回)-(2008/02/05(Tue) 20:19:29)

分類:[C#] 

こんばんわ。
C#でのクラスについて悪戦苦闘しています。
現在、鉄にネジを切る加工の計算を自動化するために、簡単なソフトを作っています。

先ずFormを2つ作ります。(Form1とForm2)
Form1にはTextBoxがあり
入力値(例えば「M8」の穴と言うTextBoxと「2個」と言うTextBox)があります
Form2のほうには、ボール盤などの機械の加工条件を入力してあるTextBoxがあります。
Form1の計算開始ボタンをクリックすると、その入力値に沿った計算を新規に作ったクラスで計算をさせ、
Form1のラベルに計算結果を表示するという仕組みです。
知りたいことは、クラスの意味合いはなんとなくわかってきなつもりなのですが、
新規にクラスを作成し、計算結果をインスタンス化させるようにしたいのですが、
Form2で入力してある加工条件の値(TextBox1.Text)を
クラスで変数化した、変数「穴径」に代入するにはどのようにしたらよいでしょうか?
下記のように、本を見ながらやっているのですが、うまくいきません。
下記のコードも本を見よう見真似でやったのであっているかわかりません。

クラスでのコード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sill計算ツール
{
    class Class1
    {
        //フィールドの設定(穴径のデータを保持する為のフィールド)
        //(クラス内で宣言される変数をフィールドと言う)
        //publicは他のクラスからもアクセスすることが可能
    //privateな為プロパティを作成する。
        private int 穴径;

        //プロパティの作成
        //他クラスからのデータを受けられるようにする。
        public int Name
        {
            get
            {
                return 穴径;
            }
            set
            {
                穴径 = value;
            }
        }

        //メソッドの作成
        public int GetHole()
        {
            //returnはメソッドの実行を終了し、呼び出し側のメソッドに制御を戻す
            return ((穴径) - 2);
        }
    }
}

クリックでのイベント(計算開始)

namespace Sill計算ツール
{
    public partial class Sill計算Form : Form
    {
        public Sill計算Form()
        {
            InitializeComponent();
        }
    
    private void btn計算開始_Click(object sender, EventArgs e)
        {
            Class1 Person = new Class1();

            Person.Name = ←ここでForm2のTextプロパティを取得するのではないのですか?
        }
    }        
}

宜しくお願い致します。

引用返信 編集キー/
■13866 / inTopicNo.2)  Re[1]: クラスについてまた教えてください。
□投稿者/ やじゅ (107回)-(2008/02/05(Tue) 20:56:00)
No13863 (ポンデC# さん) に返信

インスタンス化まで理解されているなら、
あとはForm2のインスタンスを使って、セットしてあげればよいよ

引用返信 編集キー/
■13876 / inTopicNo.3)  Re[2]: クラスについてまた教えてください。
□投稿者/ Jitta on the way (18回)-(2008/02/06(Wed) 07:52:16)
No13866 (やじゅ さん) に返信
> ■No13863 (ポンデC# さん) に返信
>
> インスタンス化まで理解されているなら、
> あとはForm2のインスタンスを使って、セットしてあげればよいよ
>

やじゅさんにじゃないけど

質問者さんは、マイクロソフト的分類で言うところの「専門家」ではない人ですかね?開発がおもな仕事ではなく、他の仕事の専門家なんだけど、仕事の助けになるツールを作る人。
そういう方々に対して、開発者と同じように接すると、ちと厳しい面もあるかなぁ?と、ふと思ったのでした。


インスタンス化が理解できていても、アクセス識別子まで理解できているかどうかはわかりませんよね?
引用返信 編集キー/
■13880 / inTopicNo.4)  Re[3]: クラスについてまた教えてください。
□投稿者/ ポンデC# (5回)-(2008/02/06(Wed) 09:48:35)
No13876 (Jitta on the way さん) に返信
> ■No13866 (やじゅ さん) に返信
> 質問者さんは、マイクロソフト的分類で言うところの「専門家」ではない人ですかね?開発がおもな仕事ではなく、他の仕事の専門家なんだけど、仕事の助けになるツールを作る人。

返信ありがとうございます。
Jitta on the way さんの言うとおりその通りです。
私は、製造会社の生産管理課で仕事をしており、作業者への時間の割り振りをしています。
そこで、誰でもが同じ時間を割り振れるよう計算ソフトを作ろうと考えました。
趣味でプログラムに興味があるくらいなので、まだ全然細かいところは解りません。

もう少し、頑張ってみます。

>インスタンス化が理解できていても、アクセス識別子まで理解できているかどうかはわかりませんよね?

今度は、アクセス識別子ですね。
引用返信 編集キー/
■13881 / inTopicNo.5)  Re[4]: クラスについてまた教えてください。
□投稿者/ よねKEN (118回)-(2008/02/06(Wed) 10:02:46)
ツッコミだけで恐縮ですが、

> インスタンス化が理解できていても、アクセス識別子まで理解できているかどうかはわかりませんよね?

Jittaさんが別のものを指しておっしゃっていたら的外れな指摘ですが、
public, protected, internal, private等のことを指しておっしゃっているのであれば、
アクセス修飾子(Access Modifier)ですね。

アクセス修飾子 (C# リファレンス)
http://msdn2.microsoft.com/ja-jp/library/wxh6fsc7(VS.80).aspx

引用返信 編集キー/
■13882 / inTopicNo.6)  Re[1]: クラスについてまた教えてください。
□投稿者/ Algol (1回)-(2008/02/06(Wed) 10:32:04)
初めまして。
Algolと申します。

ちょぴっと分かり難かったので書かれている内容を分解し箇条書きにしたいと思います。
この様な感じでよいでしょうか?

1.条件
 ・開発環境はVS2008?(using System.Linq; から推測)
 ・フォームが2つ、計算をするクラスが1つ
 ・フォーム1には、「M8」と「2個」の2つの入力ができる。計算結果を表示できる。
 ・フォーム2には、「加工条件」が入力できる。

2.動作
 ・当初はフォーム1が表示され、「計算開始」が押されると計算クラスが生成され計算結果を表示する。

3.不明点
・フォーム2はどこで生成され表示しているか?(結構重要)
 > フォーム1のロードイベント?Program.csのMain()内?それとも別の場所?
・入力内容は数字のみ?
・入力値及び計算結果は表示後どうしたいか?保持する?保持しない?(結果値を含め再利用するかしないか)

出来れば不明点をお答えいただくと回答しやすいです。
よろしくお願いします。

引用返信 編集キー/
■13887 / inTopicNo.7)  Re[5]: クラスについてまた教えてください。
□投稿者/ Jitta on the way (19回)-(2008/02/06(Wed) 11:51:07)
No13881 (よねKEN さん) に返信
> ツッコミだけで恐縮ですが、
>
>>インスタンス化が理解できていても、アクセス識別子まで理解できているかどうかはわかりませんよね?
>
> Jittaさんが別のものを指しておっしゃっていたら的外れな指摘ですが、
> public, protected, internal, private等のことを指しておっしゃっているのであれば、
> アクセス修飾子(Access Modifier)ですね。
>
> アクセス修飾子 (C# リファレンス)
> http://msdn2.microsoft.com/ja-jp/library/wxh6fsc7(VS.80).aspx
>


その通り。フォロー サンクス。


> 「専門家」ではない人ですかね?
ここも可笑しい。
「専門家」な人ではないでしょうか?
引用返信 編集キー/
■13893 / inTopicNo.8)  Re[2]: クラスについてまた教えてください。
□投稿者/ ポンデC# (6回)-(2008/02/06(Wed) 12:25:52)
No13882 (Algol さん) に返信

Algoさんありがとうございます。
下記に詳細を記述します。
宜しくお願い致します。

> 1.条件
>  ・開発環境はVS2008?(using System.Linq; から推測)

開発環境はVisual C#2008 Express Edition です。(サイトより無料でダウンロードしました。)

>  ・フォームが2つ、計算をするクラスが1つ
>  ・フォーム1には、「M8」と「2個」の2つの入力ができる。計算結果を表示できる。
>  ・フォーム2には、「加工条件」が入力できる。

その通りです。

>
> 2.動作
>  ・当初はフォーム1が表示され、「計算開始」が押されると計算クラスが生成され計算結果を表示する。

はい。その通りです。

>
> 3.不明点
> ・フォーム2はどこで生成され表示しているか?(結構重要)

フォーム2は基本的には表示しません。
機械加工の設定を変えたいときにだけ、フォーム2を表示し、メンテナンスを行います。
(ドリルの回転数、送りスピードなど)

> ・入力内容は数字のみ?

はい、数字のみです。

> ・入力値及び計算結果は表示後どうしたいか?保持する?保持しない?(結果値を含め再利用するかしないか)

計算結果は、表示後、保持しません、アプリ終了後に破棄されます。
ただ、加工条件のフォーム2では、設定を変更したら、そのデータをセーブできるようにしたいです。


引用返信 編集キー/
■13909 / inTopicNo.9)  Re[3]: クラスについてまた教えてください。
□投稿者/ Algol (2回)-(2008/02/06(Wed) 14:19:58)
2008/02/06(Wed) 14:34:47 編集(投稿者)
No13893 (ポンデC# さん) に返信
なるほど。
ありがとうございます。

それであれば、アプリケーション設定のユーザー・スコープをつかってみてください。

これで、設定の保存と値渡しがいっぺんに解決出来て一石二鳥かと思います。

使い方はこちらです
http://msdn2.microsoft.com/ja-jp/library/k4s6c3a0(VS.80).aspx
http://www.atmarkit.co.jp/fdotnet/dotnettips/558appsettings/appsettings.html
2番目のアドレスは2005の説明ですが、2008でも設定方法は同じなので問題ないかと思います。

「アプリケーション設定 ユーザー・スコープ」でググると他にも出てきますので調べてみてください。

アプリケーション設定の用法としては、
1.設定用のフォーム2を表示し、アプリケーション設定に値を保存する。できれば即使用出来る数値として。
2.フォーム1等で計算する時に、アプリケーション設定から値を取得し計算する。

となります。

次にロジックの作成方法ですが、上記アプリケーション設定を使用した場合2つほど方法があります。
注:ネームスペースは省略してます。手順にエラー処理は考慮してません。

1.もしメソッドを再利用しない(フォーム1以外でも計算式を使用しない)場合は、計算用クラスを
作成せずフォーム1のメンバとして計算ボタンのクリック イベントを使用したほうが良いでしょう。

//form1.cs
//表示フォーム
public partial class Form1 : Form
{
    //その他 略

    private void button_Click(object sender, EventArgs e)
    {
        //手順
        //1.アプリケーション設定の取得
        //2.計算
        //3.結果の表示
    }

}

2.メソッドを再利用したい(フォーム1以外でも計算式を使用する)場合は、共通クラスを作成し
Staticなメソッドとして作成して利用する方が良いかと思います。この場合、クラスをインスタンス化する
必要はありません。
ただ注意として、メソッドからは直接フォーム1の内容を読むことは出来ません。なので、メソッドに
引数をつけフォーム1の内容をメソッド実行時に渡してください。

注:下のサンプルは、整数型(int)の値としてます。小数があるなら浮動小数点型もしくは
decimal型を使用すると良いでしょう。

Staticメソッドについては、「"C#" static メソッド」でググって下さい。

//form1.cs
//表示フォーム
public partial class Form1 : Form
{
    //その他 略

    private void button_Click(object sender, EventArgs e)
    {
        //手順
        //1.画面の入力値を文字列から数値への変換
        int intTemp = (変換し代入する);

        //2.共通クラスの結果の表示
        xxxLabel.Text = Commmon.GetHoleSize(intTemp).ToString();
    }

}

//common.cs
//各フォーム共通使用クラス
public class Common
{
    public static int GetHoleSize(int value)
    {
        //手順
        //1.アプリケーション設定の取得
        //2.計算
        //3.結果を返す
        return xxx;
    }
}

他にもロジックはありますが、この様な感じにすると良いかと思います。

#スペルミス修正(汗

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -