Pergunta

Atualizar:Eu adicionei o seguinte código:


function TSettingsForm.AppDataPath: string;
 //CSIDL_APPDATA  Individual user Data
//CSIDL_COMMON_APPDATA  Common to Computer Data
  // works so long as people have at least IE 4.  (and Win95 or better)
var
   r: Bool;
   path: array[0..Max_Path] of Char;
begin
   r := ShGetSpecialFolderPath(0, path, CSIDL_APPDATA, False) ;
   if r then result := path
   else result := '';
end;

E mudei a função setinifilename (veja abaixo).Isso não criará a estrutura de pastas.

--Fim da atualização--

Estou atrasado sobre o que fazer e o que não fazer.É assim que estou salvando as configurações do meu software.Acabei de testá-lo no Vista sem fazer login como administrador e recebi uma mensagem de erro: não é possível gravar o arquivo ini.Então, acho que devo gravar os dados em uma pasta de dados?Nunca usei o Vista/win7 antes e quero que este software seja compatível com Windows 2K+.O que devo fazer para salvar as configurações.Eu também não queria mexer no registro, porque cada pedacinho que você adiciona a ele deixa o computador ainda mais lento...(ou assim parece)

Obrigado por qualquer contribuição.



procedure TSettingsForm.setinifilename;
var filename:string;
    Path:string;
  begin
    filename:='key.ini';
    path:=AppDataPath+'\MyCompanyName\ProductName\';
    if NOT DirectoryExists(path) then
        CreateDir(path);
    inifilename:= path+filename;
  end;

procedure TSettingsForm.SaveSettings;
var
 appINI:  TIniFile;

begin
    appINI := TIniFile.Create(inifilename) ;
try
    low:= Trunc (edt_low.value);
    high:=Trunc (edt_high.value);
    appINI.WriteInteger('SPEED','LOW',low);
    appINI.WriteInteger('SPEED','HIGH',high);
    appINI.WriteString('PROXY','SERVER',edtProxyServer.Text);
    appINI.WriteString('PROXY','PORT',edtProxyPort.Text);
    appINI.WriteString('PROXY','USERNAME',edtProxyUserName.Text);
    appINI.WriteString('PROXY','PASSWORD',edtProxyPass.Text);

//    status.text:='Saved Data';
  finally
    appIni.Free;
  end;
end;
 procedure TSettingsForm.GetSettings;
Var
  appINI : TIniFile;
begin
  appINI := TIniFile.Create(inifilename) ;
  try
    //if no last user return an empty string
    edt_low.value:= appINI.ReadInteger('SPEED','LOW',0);
    edt_high.value:= appINI.ReadInteger('SPEED','HIGH',0);
    low:= Trunc (edt_low.Value);
    high := Trunc (edt_high.Value);

    edtProxyServer.Text:=appINI.ReadString('PROXY','SERVER','');
    edtProxyPort.Text:=appINI.ReadString('PROXY','PORT','0');
    edtProxyUserName.Text:=appINI.ReadString('PROXY','USERNAME','');
    edtProxyPass.Text:= appINI.ReadString('PROXY','PASSWORD','');
  finally
    appINI.Free;
  end;
 end;

Foi útil?

Solução

No Vista, seu programa NÃO tem permissão para gravar no diretório de arquivos de programas onde seu programa está localizado.

Agora você precisa salvar seus arquivos ini no diretório AppData.

Uma descrição de como fazer isso em delphi está em:http://www.theabsolute.net/sware/delphivista.html#datafolder

E para ser compatível com Vista/Windows 7, o restante da página da web será uma boa orientação.


Para sua atualização, você não pode CreateDir com mais de 1 nível de profundidade de uma só vez.Use o Função ForceDirectories em vez de:

    path:=AppDataPath+'\MyCompanyName\ProductName\'; 
    if NOT DirectoryExists(path) then
      ForceDirectories(path);

p.s.Não tenha medo de gravar as configurações do programa no Registro.É para isso que serve o registro.Na verdade, ele lida adequadamente com as configurações de diferentes usuários quando diferentes usuários estão logados.O Registro funciona da mesma forma em 98/Vista/7.Considerando que os arquivos ini foram depreciados e não são mais usados ​​pelo Windows.

Você diz que não quer mexer no registro porque "cada pouquinho que você adiciona a ele deixa o computador ainda mais lento".Atualmente isso não é verdade.O registro é simplesmente um banco de dados.E se for 10 MB ou 100 MB, a diferença de tempo de acesso é imperceptível.

São todas aquelas empresas que vendem programas de limpeza de registro que estão tentando manter esse conto de fadas funcionando.Usar seus produtos de limpeza pode fazer mais mal do que bem.Tudo o que eles precisam fazer é eliminar uma ou duas entradas importantes e você pode estar em apuros.Por favor leia este artigo sobre limpadores de registro, e especialmente a seção "Benefício marginal de desempenho", que explica corretamente que os problemas que o Windows 98 e versões anteriores tiveram com o Registro foram em sua maioria corrigidos.

Se o seu programa adicionar mais de 2 ou 3 KB ao Registro, isso será muito e é uma quantidade insignificante.Use o registro.Faça certo.

Outras dicas

Você deve usar o diretório ApplicationData para os dados do seu aplicativo; em Delphi, você pode encontrar esta pasta programaticamente usando a função da API Shell ShgetSpecialFolderLocation

Embarcadero tem uma página de perguntas frequentes sobre isso, aqui.

Como já mencionado - não salve nada na pasta do aplicativo.

Você deve dividir suas configurações em duas partes:

Uma parte que contém as configurações que devem funcionar considerando o usuário - essa parte deve ser armazenada em Common_appdata.

Uma segunda parte que contém as configurações individuais dos usuários (Usuários Escolha pessoal da fonte etc.) - essa parte deve ser armazenada no AppData

Quanto ao criado, é verdade que você não pode criar mais de um nível de cada vez - no entanto, o Delphi tem a função forcecedirectoria que pode fazer exatamente isso.

por exemplo, forcedirectories ('c: myFolder subfolder subsubFolder');

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top