Где на самом деле сохраняются или записываются настройки свойств приложения? - PullRequest
1 голос
/ 18 августа 2011

Я собираюсь вырвать все мои волосы одновременно.Излишне говорить, что я разочарован.Я пишу код в Delphi Prism для .NET и в настоящее время работаю над тем, чтобы пользовательские свойства моего приложения были сохранены в файле конфигурации приложения.Я настроил все следующим образом.Это работает, но некоторые значения не сохраняются и не восстанавливаются вообще.Итак, я заглянул в файл app.config, думая, что все они будут там, но я не увидел, чтобы какие-либо значения, сохраненные в файле, соответствовали полученным значениям.Он имеет только значения по умолчанию, которые я поместил в Properties.Designer.Кто-то сказал онлайн, что файл конфигурации будет обновляться только при запуске приложения вне Delphi Prism IDE.И я сделал, это все еще не сработало.Я даже перезагрузил свой компьютер, думая, что, может быть, Delphi Prism ненадежный и ему нужен быстрый перерыв.Даже это не сработало.

Итак, где сохраняются значения - в файле 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

Ответы [ 2 ]

4 голосов
/ 19 августа 2011

Пользовательские настройки - это настройки, которые можно изменять / сохранять для каждого пользователя.Поэтому они не сохраняются в вашем app.config, а в новом файле с именем user.config, и этот файл сохраняется в каталоге de% APPDATA%.На компьютере под управлением Windows 7 это, вероятно, выглядит примерно так:

c: \ users \ myusername \ appdata \ local \ microsoft \ myassemblyname \ user.config (там также может быть какой-то гид, который я не могу вспомнить)

Пользовательские настройки также можно найти в файле app.config, но эти значения используются в качестве значений по умолчанию при первом создании нового файла user.config.

EDIT: дополнительная информация о поиске файла.Я провел быстрый тест в отладчике vs для сборки под названием DEA.exe, и файл user.config оказался в:

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

Немного больше информации можно найти в этом документе MSDN (последний абзац примечаний конкретно)

0 голосов
/ 18 августа 2011

Я не знаю о 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, это значение используется?

...