1

我即將把所有的頭髮都拉開。不用說,我很沮喪。我在Delphi Prism for .NET中編寫代碼,目前正致力於將我的應用程序的用戶定義屬性保存到應用程序配置文件中。我已經安裝了一切如下。它正在工作,但有些值沒有被保存或檢索。所以,我看着app.config文件,認爲它們都會在那裏,但是我沒有看到文件中保存的任何值與正在檢索的值相匹配。它只有默認值,我放入到Properties.Designer中。有人在網上說過,只有在Delphi Prism IDE之外運行應用程序時,配置文件纔會更新。我做到了,那仍然沒有奏效。我甚至重新啓動了我的電腦,認爲可能是德爾福棱鏡是片狀的,它需要快速休息。即使這樣也行不通。實際保存或寫入的應用程序屬性設置在哪裏?

那麼,值被保存在哪裏 - 在app.config文件或內存中?

(我的代碼可能是波濤洶涌我想獲得的基本設置爲之前我擦亮的代碼我的應用程序的工作。)

這裏是我的Properties.Settings.Designer的圖像:

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文件中看到的不匹配。

Window

回答

4

用戶設置是指可以在每個用戶的基礎上更改/保存的設置。因此,他們是而不是保存在您的app.config中,但在一個名爲user.config的新文件中,該文件保存在%APPDATA%目錄下。在Windows 7機器上,它可能看起來像

c:\ users \ myusername \ appdata \ local \ microsoft \ myassemblyname \ user。配置 (也可能有一些地方的GUID我不記得)

用戶設置也可以在app.config中找到,但這些值作爲默認值時,一個新的user.config文件是第一次創建。

編輯:定位文件的額外信息。我在VS調試器中執行了一個名爲DEA.exe的程序集運行的快速測試,並且user.config最終位於:

C:\ Users \\ AppData \ Local \\ DEA.vshost.exe_Url_sloja2hil2eiypecefjbp1icc1fo50g4 \\ user。配置

有點更多信息可以在MSDN this文件中找到(最後一段的講話明確)

+0

不幸的是,我根本找不到我的計算機系統中任何地方的user.config文件。我甚至在* .config文件中搜索並根據日期和時間對今天的結果進行排序。不過,今天絕對沒有配置文件被更新。搜索結果顯示了很多的administration.config,app.config,ApplicationHost.config等等。該列表太長以至於無法在評論中列出。 – ThN

+1

在http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx下載processmonitor。設置一個過濾器「操作」 - 「是」 - 「writefile」運行你的應用程序,看看它保存的位置(並且讓我們知道,可能對其他人有用) – Eddy

+0

是的!找到了。謝謝。顯然,AppData文件夾是隱藏的。所以,Windows 7搜索工具一起跳過它。所以,我的下一個問題是如果你需要使用預定義的user.config來部署你的軟件,你只需要把這個user.config文件放在exe文件中就可以了。 – ThN

0

我不知道德爾福,但至少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中手動創建值,是否使用了該值?

+1

德爾福棱鏡是基於微軟的Visual Studio。所以,我假設他們都以類似的方式。 – ThN

相關問題