1

我要一下子把我所有的头发都拔掉。不用说,我很沮丧。我在 Delphi Prism 中为 .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 的新文件中,并且该文件保存在 de %APPDATA% 目录下。在 Windows 7 机器上,它可能看起来像

c:\users\myusername\appdata\local\microsoft\myassemblyname\user.config (我不记得的地方可能还有一些 guid)

用户设置也可以在 app.config 中找到,但是当第一次创建新的 user.config 文件时,这些值将用作默认值。

编辑:有关定位文件的额外信息。我在 vs 调试器中对名为 DEA.exe 的程序集进行了快速测试,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 回答