1

髪の毛を一気に引っ張るつもりです。言うまでもなく、私はイライラしています。Delphi Prism for .NET 内でコーディングを行っており、現在、アプリケーションのユーザー定義プロパティをアプリケーション構成ファイルに保存する作業を行っています。次のようにすべてをセットアップしました。機能していますが、一部の値が保存または取得されていません。そのため、app.config ファイルを調べて、それらがすべて存在すると考えましたが、ファイルに保存されている値が、取得されている値と一致することはありませんでした。Properties.Designer に入力したデフォルト値のみが含まれています。Delphi Prism IDE の外部でアプリケーションを実行する場合にのみ、設定ファイルが更新されると誰かがオンラインで言いました。そして、私はそうしましたが、それでもうまくいきませんでした。Delphi Prism が不安定で、すぐに休憩する必要があるのではないかと考えて、コンピューターを再起動することさえしました。それでもうまくいきませんでした。

では、値は app.config ファイルまたはメモリのどこに保存されているのでしょうか?

(私のコードは途切れ途切れかもしれません。コードを磨く前に、アプリの基本的なセットアップを機能させようとしています。)

私のProperties.Settings.Designerの画像は次のとおりです。

プロパティ.設定.デザイナー

app.config ファイルは次のとおりです。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="MillenniaMono.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <userSettings>
        <MillenniaMono.Properties.Settings>
            <setting name="baseDir" serializeAs="String">
                <value>00:00:00</value>
            </setting>
            <setting name="SoftKey" serializeAs="String">
                <value>$6e1eaffa</value>
            </setting>
            <setting name="OnTop" serializeAs="String">
                <value>False</value>
            </setting>
            <setting name="StartExpanded" serializeAs="String">
                <value>True</value>
            </setting>
            <setting name="HideOnStart" serializeAs="String">
                <value>False</value>
            </setting>
            <setting name="DXCommLocation" serializeAs="String">
                <value>50, 50</value>
            </setting>
            <setting name="InputBoxLocation" serializeAs="String">
                <value>50, 50</value>
            </setting>
            <setting name="MainFormLocation" serializeAs="String">
                <value>50, 50</value>
            </setting>
            <setting name="OutputUnitLocation" serializeAs="String">
                <value>50, 50</value>
            </setting>
            <setting name="SysErrorDlgLocation" serializeAs="String">
                <value>50, 50</value>
            </setting>
            <setting name="UnitDuplicateLocation" serializeAs="String">
                <value>50, 50</value>
            </setting>
            <setting name="UnitsLocation" serializeAs="String">
                <value>50, 50</value>
            </setting>
            <setting name="UnitSelectLocation" serializeAs="String">
                <value>50, 50</value>
            </setting>
            <setting name="CommStatusLocation" serializeAs="String">
                <value>50, 50</value>
            </setting>
            <setting name="UnitsWinSize" serializeAs="String">
                <value>703, 300</value>
            </setting>
            <setting name="DXComm_TypeDX" serializeAs="String">
                <value>0</value>
            </setting>
            <setting name="DXComm_Comport" serializeAs="String">
                <value>0</value>
            </setting>
            <setting name="DXComm_Baud" serializeAs="String">
                <value>1200</value>
            </setting>
            <setting name="DXComm_Parity" serializeAs="String">
                <value>0</value>
            </setting>
            <setting name="DXComm_RetryInt" serializeAs="String">
                <value>0</value>
            </setting>
            <setting name="DXComm_TimeOutDelay" serializeAs="String">
                <value>0</value>
            </setting>
            <setting name="DXComm_ScanTime" serializeAs="String">
                <value>0</value>
            </setting>
            <setting name="DXComm_Offline_Pct" serializeAs="String">
                <value>0</value>
            </setting>
            <setting name="DXComm_Online_Pct" serializeAs="String">
                <value>0</value>
            </setting>
            <setting name="DXComm_ControlCycleCount" serializeAs="String">
                <value>0</value>
            </setting>
            <setting name="DXComm_LockTimeDelay" serializeAs="String">
                <value>0</value>
            </setting>
        </MillenniaMono.Properties.Settings>
    </userSettings>
</configuration>

app.config に書き込むコードは次のとおりです。

  if ReadWrite then
  begin
      RetryIni := Int32(RetrySpin.value);
      OfflinePct := int32(OfflineSpin.value);
      ScanTime := int32(ScanSpin.value);
      OnlinePct := int32(OnlineSpin.value);
      timeoutDelay := int32(TimeoutSpin.Value);
      ControlCycleCount := int32(ControlSpin.value);
      LockTimeDelay := Int32(LockTime.value);

      with commsetting := Millenniamono.Properties.Settings.Default do
      begin
        commsetting.DXComm_TypeDX := TypeDXCard.SelectedIndex;
        commsetting.DXComm_Comport := Commport.SelectedIndex;
        commsetting.DXComm_Baud:=BaudRate.SelectedIndex;
        commsetting.DXComm_Parity := int32(EvenParity.Checked = true);
        commsetting.DXComm_RetryInt:=RetryIni;
        commsetting.DXComm_TimeOutDelay:=timeOutDelay;
        commsetting.DXComm_ScanTime:=ScanTime;
        commsetting.DXComm_Offline_Pct:=OfflinePct;
        commsetting.DXComm_Online_Pct:=onlinepct;
        commsetting.DXComm_ControlCycleCount:=ControlCycleCount;
        commsetting.DXComm_LockTimeDelay:=LockTimeDelay;
        commsetting.Save;
      end;
  end;

コードの読み取りは次のとおりです。

TypeDXCard.SelectedIndex:= commsetting.DXComm_TypeDX;
Commport.SelectedIndex:=CommSetting.DXComm_Comport;

case commsetting.DXComm_Baud of
1200: BaudRate.SelectedIndex:=0;
2400: BaudRate.SelectedIndex:=1;
4800: Baudrate.SelectedIndex:=2;
9600: BaudRate.SelectedIndex:=3;
19200: BaudRate.SelectedIndex:=4;
38400: BaudRate.SelectedIndex:=5;
57600: BaudRate.SelectedIndex:=6;
115200: BaudRate.SelectedIndex:=7;
else BaudRate.SelectedIndex:=0;
end;

case commsetting.DXComm_Parity of 
0: begin EvenParity.Checked:=true; NoneParity.Checked:=false; end;
1: begin NoneParity.Checked:=true; EvenParity.Checked:=false; end;
else begin EvenParity.Checked:=true; NoneParity.Checked:=false; end;
end;

RetrySpin.Value:=Commsetting.DXComm_RetryInt;
RetryIni := RetrySpin.Value;

TimeOutSpin.Value:=CommSetting.DXComm_TimeOutDelay;
TimeOutDelay := TimeOutSpin.Value;

ScanSpin.Value:=CommSetting.DXComm_ScanTime;
ScanTime := ScanSpin.Value;

OfflineSpin.Value:=CommSetting.DXComm_Offline_Pct;
OfflinePct:=OfflineSpin.Value;

OnlineSpin.Value:=Commsetting.DXComm_Online_Pct;
OnlinePct:=OnlineSpin.Value;

Controlspin.Value:=Commsetting.DXComm_ControlCycleCount;
ControlCycleCount:=Controlspin.Value;

LockTime.Value:=Commsetting.DXComm_LockTimeDelay;
LockTimeDelay := LockTime.Value;
  end;

表示または取得される実際の値は次のとおりです。いくつかの値を保存して読み戻すように任意に設定しましたが、app.config ファイルに表示されているものと一致しません。

窓

4

2 に答える 2

4

ユーザー設定は、ユーザーごとに変更/保存できる設定を意味します。そのため、それらはapp.config には保存されませんが、user.config という新しいファイルに保存され、そのファイルは %APPDATA% ディレクトリの下に保存されます。Windows 7マシンでは、おそらく次のようになります

c:\users\myusername\appdata\local\microsoft\myassemblyname\user.config (思い出せない場所に GUID があるかもしれません)

ユーザー設定は app.config にもありますが、これらの値は、新しい user.config ファイルが初めて作成されるときにデフォルト値として使用されます。

編集: ファイルの場所に関する追加情報。DEA.exe というアセンブリの vs デバッガーで簡単なテストを実行したところ、user.config は次のようになりました。

C:\Users\\AppData\Local\\DEA.vshost.exe_Url_sloja2hil2eiypecefjbp1icc1fo50g4\\user.config

もう少し詳しい情報は、このmsdn ドキュメント (具体的にはコメントの最後の段落) にあります。

于 2011-08-18T20:10:04.487 に答える
0

Delphi についてはわかりませんが、少なくとも c# は設定デザイナーから実際のコード ファイルを生成します。

[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("foo")]
public string bar {
    get {
        return ((string)(this["bar"]));
    }
    set {
        this["bar"] = value;
    }
}

Delphi も同様のファイルを生成すると思います。
デフォルト値は属性としてエンコードされます。app.config で何も指定されていない場合、デフォルト値が使用されます。app.config には何も書き込まれません。
C# の場合、デザイナーは app.config に対応する既定値を作成しようとしますが、それらが削除された場合は、から既定値DefaultSettingValueAttributeが使用されます。

app.config で手動で値を作成した場合、その値は使用されますか?

于 2011-08-18T19:59:03.690 に答える