.NET DataGridViewで行末尾追加を実現するには?

.NET DataGridViewで行末尾に、行追加できないようです。以下の行追加試しました。

AIによると DataSource を追加しないといけないと言われます。ちょっと面倒すぎです。別の手を考えました。

追加用のダミー末尾を追加して、見せないようにします。コード例は CLI です。

private: System::Windows::Forms::DataGridView^  dgrdSend;

  ・・・中略・・・
 
private: System::Void Form1_Load(  System::Object^  sender,  System::EventArgs^  e) 
{
  ・・・中略・・・
	dgrdSend->RowCount = 2;
	dgrdSend->Rows[0]->Cells[1]->Value = "1000";	// デフォルト送信データ行
	dgrdSend->Rows[0]->Cells[2]->Value = "0";
	dgrdSend->Rows[1]->Height = 0;				// 送信データ行追加用ダミー(Addで末尾追加未サポのため)
	dgrdSend->Rows[1]->ReadOnly = true;
	// dgrdSend->Rows[1]->Visible = false;   -> エラーになる
	// dgrdSend->Rows[1]->Resizable = false; -> エラーになる
	dgrdSend->AllowUserToResizeRows = false;	// 全体に行リサイズ変更はOK
  ・・・中略・・・
}

		int		selectedRowSndData;			// 選択中の送信データ行

/* ****************************************************************************
 * 機能名 : 送信データ追加
 * ***************************************************************************/
private: System::Void menuAddSendItem_Click(
	System::Object^ sender, 
	System::EventArgs^ e 
) {
	selectedRowSndData ++;
	dgrdSend->Rows->Insert( selectedRowSndData, 1 );
}

/* ****************************************************************************
 * 機能名 : 送信データ挿入
 * ***************************************************************************/
private: System::Void menuInsertSendItem_Click(
	System::Object^ sender, 
	System::EventArgs^ e 
) {
	dgrdSend->Rows->Insert( selectedRowSndData, 1 );
}

実行結果です。

VB6/VBA 留意点まとめ【随時更新中】

極まれに使用するVB6/VBAにて他言語と異なる点の留意事項覚え書きです。

IDE上でUI配列が使用できる。.NETではなくなっている。

UI配列にuboundは使えない。ubound(text()) はNG、TextLever.UBound がただしい。

UI配列はアクセスしなければ欠番があってもよい。

他言語と比べ、配列は宣言数+1つ確保される。

フォームエディタで編集すると時間がかかる場合は、フォーム部はコード手打ちしても良い。

MSComm は、内部バッファに一定byte蓄積しないと受信イベントが発生しない模様。

TextBoxで入力禁止にするには、KeyDown と KeyPress でキーコード値引数を 0 に上書きする。

アプリの終了は “End” である。

Buildスイッチは、#Const XXXX、 #if XXXX then ~ #end if である。

unsignedは使えない。(これはjavaも同じ)

ラベルはデフォルト不透明だが、透明を指定するこができる。UIが重なるが文字はみだし策で大きくしておきたいとき重宝する。

Longは 2,147,483,647 どまりだが、CDec関数( 10 進型 (Decimal) )を使えば128bitまで表現できる。しかし変数としての型はなく工夫して使う必要がある。

配列引数を渡すときは、変数() である。

Win10以降では、管理者で実行した方がよい。多分レジストリ書込みを行っている。

長いイベント内でbrakeするとき、イベント先頭で一次brekeしないと、brakeしない場合あり。

挙動がおかしいときは、IDEを再起動する必要性が高い。

コードエディタのUNDOは一回しか効かない。複数戻したいとはき、プロジェクト解放 を行う。

フォームエディタのUNDO無い。戻したいとはき、プロジェクト解放 を行う。

フォームエディタで複数UIを選択する場合は、選択矩形領域に部分的かかっているUIも選択される。

外部エディタでコード修正したときは、Project 解放し、再読み込みすること。

タブ表示は無いので IDETab アドインを使う。

全検索はないので、greovb アドインを使う。

マウスホイールスクロールは無いので VB6IDEAddAutoScroll アドインを使う。

コード行番号を表示はないので、VB6IDEAddLineNumbers アドインを使う。

前回開いていたウインドウをリセットしたい場合は、.vbw を削除する。

Visual Basic 6 sp6 がインストール失敗するとき’25

2000年前後一世を風靡した Visual Basic 、まだMSDNでは配布され、ランタイムの実行もwin11サポートされています。 初期のwin11に Visual Basic 6 sp6 はインストール済みですが、新規に別win11にインストールが必要になりインストールしてみました。そのメモです。

MSDNよりエンタープライズ版をDLしインストール。終了時にエラー( ダンマリ状態だったかも )が出ましたが、IDE自体は起動でき Build もOK。win10でもこんなにすんなりいかなかった記憶があります。これでよかったのでしょうか?

VB6の最終Services pack である SP6 をインストールします。インストーラは現在通常公開されていないようです。保存していた公開当時のものをインストールしますが失敗します。管理者権限、XP-SP3互換モードでもダメ。

users\AppData/Loca/temp にも Windows\Temp にも インベントビューア にもどこにもログが残らずヒント無し。

SP6 は MSDN にはまだ公開されており、そちらでインストールを試みます。こちらは細かくバージョンが分かれているみたいです。しかし解消せず。

いろいろ見ていくと、VB6本体の実行ファイル類はインストールされていますが、本体インストール時に最後にエラーが発生したため、Windowsの管理上は未インストールになっているようですね。困った状態です。

一時アンインストール

VB6インストール済みPCから以下レジストリエントリと file をコピーすると、インストール扱いにすることができました。

  • HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Visual Basic 6.0 Enterprise Edition (jpn)
  • C:\Program Files (x86)\Microsoft Visual Studio\VB98\Setup\1041\setup.stf

しかしこの状態で SP6 を試しにインストールしましたが同じ結果でした。仕方なくアンインストールします。

他WEB記事を拝見かすると以下のオプションでインストールするようです。

SP6のインストール3

これで SP6 が正しく入りました。一見インストールできたように見えるのはトラップですね。

SP6 以降のリリースされた Windows Update を手動実行します。まだダウンロードセンターにおいてあるようです。

  • VB60SP6-KB3096896-x86-JPN.msi ※2024版がでているようです。こちらはローカルドライブから実行のみ可でした。

上記は、VB60SP6-KB2708437-x86-JPN.msi の内容も含まれているようです。

  • VisualBasic6-KB896559-v1-JPN.exe もあるようです。mscomctl.ocx comctl32.ocx  が更新されると記載されていますが、Visual Studio下の.ocxのpropertyを見る限りは変わってないように見えます。検索するとofficeに入っているのが最新みたいです。しかし SysinternalsSuitevmapユーティリティ を見る限りIDEにロードされる .ocx は旧い方ですね。

以上でセットアップが完了しました。

なおIDE初回起動時は、管理者権限で一度起動したほうがいいようです。

VB6からExeclを呼出すとき、CLSIDは各バージョンで同じか?

VB6アプリを再ビルドしたいと相談があり調べました。ExeclをVB6から操作するとき、COMコンポーネント( Windows上で世界でユニークなオブジェクトを示すID:CLSIDとそのインターフェイスをレジストリに登録することで呼出すソフトウェアコンポーネント) として Execl.exe を登録して呼出すようです。※イマドキではもっと簡単に Python でも可能なようです。

Dim execlApp   As Excel.Application 
Dim execlBook As Excel.Workbook 
Dim execlSheet As Excel.Worksheet

Set execlApp = CreateObject("Excel.Application")


これをBuildする場合、Execlの本体が必要なようです。Execlはバージョン毎に収録先が異なります。Execl2024の場合、設定は以下のようになります。

紐づけられるCOMコンポーネントはバージョンが明示されています。.VBP をみると、

CLSID00020430-0000-0000-C000-000000000046 のようです。内部バージョンは 2.0

アプリが複数のWindows PCで実行されると、そのPC毎に Execl の格納先とバージョンは異なるハズです。通常この設定を行うと、アプリ実行時、このパス固定参照されるか、レジストリ上に登録されている同じコンポーネントが呼び出されます。EXECLバージョン毎にCLSIDは同じなのでしょうか? .VBP で管理されるライブラリバージョンが一致しなくても動作するのでしょうか?


オリジナルの参照設定と .VBP をみると、Execl 2007 (内部version12)でした。CLSIDは同じですが、内部バージョンは1.6 でした。


試しに Execl 2003(内部version11) を設定してみた結果です。CLSIDは同じ、内部バージョンは1.5


以下動作結果です。

PCBuild時のExecl設定呼出されたExecl
Win11 Execl2003 & 2024同居20032024
Win11 Execl2003 & 2024同居20072024
Win11 Execl2003 & 2024同居20242024
Win11 Execl2003のみ20032003
Win11 Execl2003のみ20072003
Win11 Execl2003のみ20242003

動作原理をまとめると、

  • CLSIDの一致はみるが、バージョンは照合しない。
  • 上位互換性はあり。
  • 複数Execlがインストールされている場合は、新しいExeclの方が呼び出される。
  • VB6 IDE用のExeclバージョンは問われない。

ただし、新しいExeclで追加されたオブジェクト、methodは使えないのでしょうから、開発時のExeclに近いバージョンを使った方が無難と思います。( methodインターフェイスがかわるとmethodのCLSIDが変わるが、VBAオブジェクトヘルプにもmethod毎に対応バージョンまでは明記されておらず、それらを全部調べるのは現実的ではないため )

しかしながら、.NETアプリでありながら、COMコンポーネントあわせもつEXEを作れるんですね。

Windowsで削除or圧縮してよさげな場所

クリーンアップでも消えず、弊方がファイルがたまってよく削除するフォルダの覚書です。削除によってトラブルが発生する可能性はゼロではないため、十分に試してください。

パスコメント
C:\MSOCacheMS-Offiecの何かインストラの模様、気持ち圧縮Folderにしておくと無難。
C:\ProgramData\Package Cache.NET系パッケージのinstallerの模様。win10->11時に削除TRY中。win10->11時に削除TRY中。
C:\Windows\Tempほぼほぼ支障なし
C:\Windows\Downloaded Installations気持ち圧縮Folderにしておくと無難。
C:\Windows\InstallerUninstallしないソフトなら削除していい。気持ち圧縮Folderにしておくと無難。
C:\Windows\SoftwareDistribution気持ち圧縮Folderにしておくと無難。
C:\Windows\SoftwareDistribution\Download古いものなら削除しても大体よさげ。圧縮Folderにしておくと無難。
C:\Users\*\AppData\Local\tempほぼほぼ支障なし
C:\Users\*\AppData\Local\Package Cache削除して様子見中
C:\Users\*\AppData\Local\Packages古いものなら削除しても大体よさげ。圧縮Folderにしておくと無難。
C:\Users\*\manabu_yamamoto.renesas\e2_installer\cache削除して様子見中