DOBON.NET DOBON.NETプログラミング掲示板過去ログ

MSFlexGridとAxMSFlexGridについて

環境/言語:[VB.net]
分類:[.NET]

Titleについて質問させてください。

VB6.0の時にMSFlexGrid型で宣言された変数のindexプロパティを
使っていましたが、VB.NETへアップグレードしたところ、AxMSFlexGrid型に
変更されました。こちらはindexプロパティがないためエラーが出てしまいます。

MSFlexGridとAxMSFlexGridの違いや、エラーの対処法を
(又は関連するサイト)ご教授頂けませんか?
よろしくお願いします。
たいちさん、こんにちは。

> VB6.0の時にMSFlexGrid型で宣言された変数のindexプロパティを
> 使っていましたが、VB.NETへアップグレードしたところ、AxMSFlexGrid型に
> 変更されました。こちらはindexプロパティがないためエラーが出てしまいます。

.NETでは、VB6のように単純にコントロールの配列を宣言することは出来ません。
よって、indexでアクセスしているFlexGrid[]をそれぞれ別名で定義するか、
こちらのサイト(どぼんさん)のコントロールの配列を作る記事を参考にして
みてください。

> MSFlexGridとAxMSFlexGridの違いや、エラーの対処法を
.NETでOCXを使用するとAxのついたラッパー(仲介役)が作成されます。
FlexGridはもともとVB用OCXですので、.NETで使用するための仲介役が
自動的に作成されるんです。
これにより、メソッド名はVBでの名前とは変わっているものもあります。
たとえば、VB6でTextMatrixで取得、設定できたものは.NETでは
setTextMatrixとgetTextMatrixのように変わっています。

また、ColWidthなどのFlexGrid内部のサイズに関しても注意が必要です。
FlexGridではTwipを使用しているため、Pixel->Twipへの変換が必要です。
これはWindowsのフォントサイズ(dpi)設定により変化してしまうので
厄介です。(1インチ=1440twip)
標準のdpiで使用されるのなら設定したいPixel*15でほぼ望んだピクセル
になります。
補足です。

Pixel->Twipはこんな感じです。

Graphics g = this.CreateGraphics();
float pixPerInchX =g.DpiX;
axMSFlexGrid1.set_ColWidth(1,(int)(10*1440/pixPerInchX));

これでセル幅は10ピクセルになります。
ゆ さん
早速の詳しいお返事、ありがとうございます!

コントロール配列か。。記事を読んで、今慌てて勉強中です。
自動でできてしまうラッパークラスだったからヘルプにも載っていないのか〜。
ところで、すみませんが、MSFlexGridは、その1つのコントロールで
配列になるのですか?いまいちイメージがつかめません。
ちなみに、私が悩んでいるのは、以下のようなソースです。

 Public Sub SetDBAction(ByRef Grid1 As AxMSFlexGridLib.AxMSFlexGrid, ByRef lngRow As Integer, ByRef intTiming As Short)
  Dim intJ As Short
  Dim lngIdx As Integer
  Dim lngColor As Integer
  Dim intIdx As Short
 With Grid1
'TODO AxInterop.MSFlexGridLib.dllの中に設定されている
intIdx = .Index
'グリッド格納の構造体配列のINDEXを取得
lngIdx = CInt(.get_TextMatrix(lngRow, gintColArrIdx))


よろしくお願いします。
> ところで、すみませんが、MSFlexGridは、その1つのコントロールで
> 配列になるのですか?いまいちイメージがつかめません。
> ちなみに、私が悩んでいるのは、以下のようなソースです。
VB6の場合は、同じコントロールをフォームに配置するときに、
コントロール配列にしますか?とダイアログが出てきて、「はい」
を選択すると、同名のコントロールのindexプロパティに0,1....
と配列のインデックスが付加されます。
これが.NETではなくなっています。(FlexGridに限らず)
よって、もとのソースではFlexGridを複数同じ名前で配列にして使用していると
思います。

.NETではindexというプロパティそのものが無くなっていますので、
いままでindex=0と1で宣言されていたものはFlexGrid0、FlexGrid1として宣言
しなおしたりする必要があります。

もし元のソースでコントロールのTagプロパティを使用していないなら、
.NETではTagプロパティに元のindexの値をあらかじめ設定しておき、
xxx=.indexをxxx=.Tagとしてやってもいいかもですね^^;
> よって、もとのソースではFlexGridを複数同じ名前で配列にして使用していると
> 思います。

ゆ さん
ありがとうございます!コントロール配列についてもよく分かりました!
タブコントロールの上にFlexGridがあったので、全然別ものかと思っていましたが、
よくよく見てみたら同じ名前でした。これが、コントロール配列なんですね。

> もし元のソースでコントロールのTagプロパティを使用していないなら、
> .NETではTagプロパティに元のindexの値をあらかじめ設定しておき、
> xxx=.indexをxxx=.Tagとしてやってもいいかもですね^^;

エラーの対処法まで聞いてしまってすみません、そして教えていただいて
ありがとうございます!
Tagプロパティに何も設定されていなかったので、この方法で
対処させていただきます。
こういうテもあるんですね。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板