- 題名: C#でVB6のような構造体の動的配列
- 日時: 2004/09/30 17:27:48
- ID: 6421
- この記事の返信元:
- (なし)
- この記事への返信:
- [6422] Re[1]: C#でVB6のような構造体の動的配列2004/09/30 17:31:45
- ツリーを表示
■No6423に返信(mitaさんの記事)
> ご指摘のサイトのTipsは事前に拝見した上で質問させていただきました。
> 普通の1次元配列のようなものは確かにわかったのですが、私が
> どうしてもわからないのは構造体での動的配列です。
> お手数ですがよろしくお願いいたします。
リンク先と同じ手口で伸ばすことできたんだけどなぁ。
で、使いやすく関数化するとこうなるのかなぁ。
private void button1_Click(object sender, EventArgs e) {
StructHoge[] tSource = new StructHoge[15];
StructHoge[] tDest;
for (int i = 0; i <= 14; i++) {
tSource[i].Code = (i + 1) * i;
tSource[i].Name = "名前" + i.ToString();
}
tDest = ReDimPreserveStructHoge(tSource, 20);
}
private StructHoge[] ReDimPreserveStructHoge(StructHoge[] tSource, int iSize) {
StructHoge[] tReturn;
int iLength;
if (tSource == null) {
return null;
}
tReturn = new StructHoge[iSize];
iLength = tSource.Length;
if (iLength > iSize) {
iLength = iSize;
}
Array.Copy(tSource, tReturn, iLength);
return tReturn;
}
# それとも、もっと高度なことでしたか?
■No6429に返信(mitaさんの記事)
> (Form1のクラスレベルの変数として、tSourceを定義できる
> のでしょうか??)
アクセシビリティの概念をお勉強されることをお勧めしますが、お答えします。
私のソースですと、ローカルスコープ変数なのはお判りになられますでしょうか?
ローカルスコープということは、そのメソッド内でしか参照できません。
「Form1のクラスレベル」というのは、モジュール変数(Form1のプライベートな変数)となります。
ですので、
> Form1というクラスで処理するとして、Form1のロード処理で
> StructHoge[] tSource = new StructHoge[15];
> を記述し、ボタンのクリックイベントで
> StructHoge[] tDest;
> tDest = ReDimPreserveStructHoge(tSource, 20);
>
> みたいなことは出来るのでしょうか??
当然、簡単にできます。
これはtSourceをメソッド外に追い出せばよいのです。
> (VB6でいうと、フォームモジュールのモジュールレベル変数として
> 構造体変数を定義して、フォームロードでその変数に初期値を代入し、
> ボタンクリックでその変数に加算していく、という処理をしたい
> のです)
よく判っていらっしゃるではないですか。
そういうことです。
一応、Button1を押下することでどんどん配列の要素が増えるサンプルソースを載せておきますね。
Source:-------------------------------------------------------------------
internal class FormMain : System.Windows.Forms.Form {
/* プライベート メンバ 変数として定義 */
private StructHoge[] m_tHoge = new StructHoge[0];
/* m_tHogeの配列を1つずつ伸ばすButton */
private void button1_Click(object sender, EventArgs e) {
m_tHoge = ReDimPreserveStructHoge(m_tHoge, m_tHoge.Length + 1)
}
}
--------------------------------------------------------------------------
ちなみに先ほどの配列を伸ばすメソッドですが、以下のようにすべきでした。
未割当ての場合は、nullを返すのではなく、伸ばした結果を返すべきでした。m(_ _)m
また、この関数、Array型でできると汎用性が広がるんですが...。
キャストが巧く出来ないようで...残念。
Source:-------------------------------------------------------------------
private StructHoge[] ReDimPreserveStructHoge(StructHoge[] tSource, int iSize) {
StructHoge[] tReturn;
int iLength;
if (tSource == null) {
return new StructHoge[iSize];
}
tReturn = new StructHoge[iSize];
iLength = tSource.Length;
if (iLength > iSize) {
iLength = iSize;
}
Array.Copy(tSource, tReturn, iLength);
return tReturn;
}
--------------------------------------------------------------------------
分類:[.NET]
いつも参考にさせていただいています。
C#について1つ質問させて下さい。
VB6での下記のような構造体の動的配列のようなことを、
C#で実現できるのでしょうか??
実現方法は構造体でもクラスでも構いません。
Module1
Type A
intSample as Integer
strSample as String
End Type
Public SampleData() as A
Form1のForm Load
Redim SampleData(1)
SampleData(1).intSample = 111
SampleData(1).strSample = "ああああ"
Form1の登録ボタンクリックイベント
Redim Preserve SampleData(Ubound(SampleData)+1)
SampleData(Ubound(SampleData)).intSample = 222
SampleData(Ubound(SampleData)).strSample = "いいいい"
大まかに上記のような処理です。
(登録ボタンを押すたびに配列を1つずつ増やすイメージです)
どうしても実現方法がわからなくて悩んでいます。
どなたかお判りになる方がおられましたらご教授いただけます
でしょうか。よろしくお願いいたします。