# 画面設計書 10-デバッグプロパティページ

## 概要

本ドキュメントは、F# プロジェクトのデバッグ設定を行う「デバッグプロパティページ」の設計仕様を記述するものです。

### 本画面の処理概要

この画面は、F# プロジェクトのデバッグ実行時の動作（起動アクション、コマンドライン引数、作業ディレクトリ、リモートデバッグなど）を設定するためのプロパティページです。

**業務上の目的・背景**：F# プロジェクトのデバッグ実行を効率的に行うために必要な画面です。起動するプログラムの指定、コマンドライン引数の設定、作業ディレクトリの指定、リモートデバッグの設定など、デバッグセッションの動作を詳細に制御できます。

**画面へのアクセス方法**：ソリューションエクスプローラーで F# プロジェクトを右クリックし、「プロパティ」を選択してプロジェクトプロパティウィンドウを開きます。左側のタブから「デバッグ」を選択することで本画面にアクセスできます。

**主要な操作・処理内容**：
1. 起動アクションの選択（プロジェクト/外部プログラム）
2. 外部プログラムのパス設定
3. コマンドライン引数の設定
4. 作業ディレクトリの設定
5. リモートデバッグの設定
6. ネイティブコードデバッグの有効化
7. SQL Server デバッグの有効化
8. VS ホスティングプロセスの使用設定

**画面遷移**：
- 遷移元：ソリューションエクスプローラー（プロジェクトプロパティ）
- 遷移先画面：同じプロジェクトプロパティ内の他のページ（アプリケーション、ビルド、ビルドイベント、参照パス）へタブ切替で遷移可能

**権限による表示制御**：特になし。プロジェクトの編集権限を持つユーザーが設定を変更可能です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 71 | ブレークポイント解決 | 主機能 | デバッグ時の起動アクション、コマンドライン引数、作業ディレクトリ等の設定 |

## 画面種別

プロパティページ（設定画面）

## URL/ルーティング

Visual Studio 内部プロパティページのため、URLは存在しません。
- GUIDパス: `{9CFBEB2A-6824-43e2-BD3B-B112FEBC3772}`（FSharpDebugPropPageComClass）
- プロパティページパス: プロジェクトプロパティ > デバッグ

## 入出力項目

| 項目名 | 項目種別 | データ型 | 必須 | 説明 |
|--------|----------|----------|------|------|
| StartAction | 入力（ラジオボタン） | prjStartAction | 必須 | 起動アクション（Project/Program） |
| StartProgram | 入力（テキスト） | string | - | 外部プログラムのパス |
| StartArguments | 入力（テキスト） | string | - | コマンドライン引数 |
| StartWorkingDirectory | 入力（テキスト） | string | - | 作業ディレクトリ |
| RemoteDebugEnabled | 入力（チェックボックス） | bool | - | リモートデバッグを有効にするかどうか |
| RemoteDebugMachine | 入力（テキスト） | string | - | リモートマシン名 |
| EnableUnmanagedDebugging | 入力（チェックボックス） | bool | - | ネイティブコードデバッグを有効にするかどうか |
| EnableSQLServerDebugging | 入力（チェックボックス） | bool | - | SQL Server デバッグを有効にするかどうか |
| UseVSHostingProcess | 入力（チェックボックス） | bool | - | VS ホスティングプロセスを使用するかどうか |

## 表示項目

| 項目名 | 表示形式 | 説明 |
|--------|----------|------|
| Start Action セクション | GroupBox | 起動アクションの設定 |
| プロジェクトを開始 | RadioButton | `rbStartProject` - プロジェクトを起動 |
| 外部プログラムを開始 | RadioButton | `rbStartProgram` - 外部プログラムを起動 |
| 外部プログラムパス | TextBox + Browse | `StartProgram` - プログラムパス |
| Start Options セクション | GroupBox | 起動オプションの設定 |
| コマンドライン引数 | TextBox | `StartArguments` - 複数行対応 |
| 作業ディレクトリ | TextBox + Browse | `StartWorkingDirectory` |
| リモートデバッグ有効 | CheckBox | `RemoteDebugEnabled` |
| リモートマシン | TextBox | `RemoteDebugMachine` |
| Enable Debuggers セクション | GroupBox | デバッガ設定 |
| ネイティブコードデバッグ | CheckBox | `EnableUnmanagedDebugging` |
| SQL Server デバッグ | CheckBox | `EnableSQLServerDebugging` |
| VS ホスティングプロセス | CheckBox | `UseVSHostingProcess` |

## イベント仕様

### 1-起動アクション変更

ラジオボタンで起動アクションを変更すると、関連するコントロール（StartProgram など）の有効・無効状態が切り替わります。

### 2-リモートデバッグ有効化

リモートデバッグチェックボックスの状態に応じて、リモートマシン入力欄の有効・無効が切り替わります。

### 3-外部プログラム参照

外部プログラムの参照ボタン押下で、ファイル選択ダイアログ（.exe フィルター）が表示されます。

### 4-作業ディレクトリ参照

作業ディレクトリの参照ボタン押下で、フォルダ選択ダイアログが表示されます。

### 5-設定値の保存

設定変更後、OK ボタン押下または適用ボタン押下で、設定値がプロジェクトユーザーファイル（.fsproj.user）に保存されます。

### 6-検証処理

起動プログラムパス、リモートマシン名、作業ディレクトリに対して入力検証が行われます。

## データベース更新仕様

本画面はデータベースを使用しません。設定値はプロジェクトユーザーファイル（.fsproj.user）に XML 形式で保存されます。

### 操作別データベース影響一覧

該当なし（プロジェクトユーザーファイルを直接更新）

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|--------------|------|----------------|----------|
| PPG_DebugTitle | タイトル | デバッグ | ページタイトル |
| PropPage_ProgramNonexistent | 警告 | 指定されたプログラムが存在しません | 外部プログラムが見つからない場合 |
| PropPage_NeedExternalProgram | 警告 | 外部プログラムを指定してください | パスが空の場合 |
| PropPage_NotAnExeError | 警告 | .exe ファイルを指定してください | 拡張子が .exe でない場合 |
| PropPage_RemoteMachineBlankError | 警告 | リモートマシン名を指定してください | リモートデバッグ有効時にマシン名が空 |
| PropPage_WorkingDirError | 警告 | 作業ディレクトリが存在しません | 無効なディレクトリ |

## 例外処理

| 例外状況 | 処理内容 |
|----------|----------|
| プロジェクトファイル読み込み失敗 | エラーメッセージを表示 |
| 設定保存失敗 | エラーメッセージを表示し、ロールバック |
| 無効なプログラムパス | 警告メッセージを表示 |
| 無効なリモートマシン名 | 警告メッセージを表示 |

## 備考

- 本画面は VB.NET で実装されています（`DebugPropPage.vb`）
- `DebugPropPage` クラスは `PropPageUserControlBase` を継承
- 設定は `ControlDataFlags.PersistedInProjectUserFile` フラグによりユーザーファイルに保存
- `MultilineTextBoxRejectsEnter` カスタムコントロールでコマンドライン引数を複数行入力可能
- 設定変更は即座に適用されず、OK または適用ボタンで確定されます
- リモートデバッグ時はローカルファイルパスの検証がスキップされます

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

まず、プロパティページで管理されるプロパティデータの構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | DebugPropPage.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/DebugPropPage.vb` | クラス定義と継承関係（18-20行目） |
| 1-2 | DebugPropPage.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/DebugPropPage.vb` | コントロール宣言（59-82行目） |

**読解のコツ**: `DebugPropPage` は `PropPageUserControlBase` を継承しており、プロパティページ共通の機能を利用しています。

#### Step 2: プロパティバインディングを理解する

プロジェクトプロパティと UI コントロールのバインディングを理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | DebugPropPage.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/DebugPropPage.vb` | `ControlData` プロパティ（327-346行目） |

**主要処理フロー**:
1. **331行目**: `StartArguments` プロパティのバインディング
2. **332行目**: `StartWorkingDirectory` プロパティのバインディング
3. **333行目**: `StartProgram` プロパティのバインディング
4. **334-336行目**: `StartAction` のカスタムバインディング（Set/Get メソッド）
5. **337-341行目**: デバッガ関連プロパティのバインディング

#### Step 3: カスタムコントロールを理解する

複数行テキスト入力用のカスタムコントロールを理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | DebugPropPage.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/DebugPropPage.vb` | `MultilineTextBoxRejectsEnter` クラス（297-323行目） |

**主要処理フロー**:
- **304-306行目**: コンストラクタで Multiline を true に設定
- **308-314行目**: `IsInputChar` オーバーライドで Enter キーを入力として拒否
- **316-322行目**: `ProcessDialogChar` オーバーライドで Enter キーを処理

#### Step 4: イベントハンドラを理解する

UI イベントに対応する処理を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | DebugPropPage.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/DebugPropPage.vb` | 各種イベントハンドラ（462-557行目） |

**主要処理フロー**:
- **462-488行目**: `rbStartAction_CheckedChanged` - 起動アクション変更時
- **499-527行目**: `StartWorkingDirectoryBrowse_Click` - 作業ディレクトリ参照
- **529-540行目**: `RemoteDebugEnabled_CheckedChanged` - リモートデバッグ有効化
- **542-557行目**: `StartProgramBrowse_Click` - 外部プログラム参照

### プログラム呼び出し階層図

```
Visual Studio プロジェクトプロパティ
    │
    ├─ FSharpDebugPropPageComClass
    │      │
    │      ├─ Title プロパティ → "Debug"
    │      ├─ ControlType プロパティ → DebugPropPage 型
    │      └─ CreateControl() → DebugPropPage インスタンス
    │
    └─ DebugPropPage
           │
           ├─ PropPageUserControlBase を継承
           │
           ├─ ControlData プロパティ
           │      └─ PropertyControlData[] でプロパティバインディング
           │
           ├─ ValidationControlGroups プロパティ
           │      └─ 検証グループの定義
           │
           ├─ ValidateProperty メソッド
           │      └─ 入力値の検証ロジック
           │
           └─ イベントハンドラ群
                  ├─ rbStartAction_CheckedChanged
                  ├─ StartWorkingDirectoryBrowse_Click
                  ├─ RemoteDebugEnabled_CheckedChanged
                  └─ StartProgramBrowse_Click
```

### データフロー図

```
[入力]                    [処理]                         [出力]

ユーザー設定変更 ───▶ DebugPropPage ─────────────▶ プロパティ値
                              │
                              ▼
                    PropertyControlData ─────────▶ 検証処理
                              │                    (ValidateProperty)
                              ▼
                    PropPageUserControlBase ─────▶ プロジェクトユーザーファイル
                              │                     (.fsproj.user)
                              ▼
                    デバッグセッション ────────────▶ 起動設定
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| DebugPropPage.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/DebugPropPage.vb` | ソース | プロパティページ実装 |
| PropPageUserControlBase.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/PropPageUserControlBase.vb` | ソース | 基底クラス |
| PropertyControlData.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/PropertyControlData.vb` | ソース | プロパティデータ管理 |
| SR.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/SR.vb` | ソース | 文字列リソース |
| HelpKeywords.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/HelpKeywords.vb` | ソース | ヘルプキーワード定義 |
