Pregunta

Actualización: He añadido el código siguiente:


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;

Y he cambiado la función setinifilename (Ver más abajo). No va a crear la estructura de carpetas.

- Finalizar update--

Estoy detrás de los tiempos, sobre qué y qué no hacer. Esta es la forma en que estoy guardando los ajustes para el software. Yo sólo probado en Vista no ha iniciado sesión como administrador, y me da un mensaje de error no se puede escribir archivo ini. Así que supongo que tengo que escribir los datos en una carpeta de datos? Nunca he utilizado Vista / Win7 antes, y quiero que este software sea compatible con Windows 2K +. ¿Qué debo hacer para guardar la configuración. También realmente no quería meterse con el registro, ya que cada poco se agrega a la misma, se ralentiza el ordenador sólo que mucho más ... (o eso parece)

Gracias por cualquier entrada.



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;

¿Fue útil?

Solución

En Vista, el programa no está permitido escribir en el directorio de archivos de programa donde se encuentra el programa.

Ahora tiene que guardar los archivos ini en el directorio de datos de programa.

Una descripción de cómo hacer esto en Delphi se encuentra en: http://www.theabsolute.net/sware/delphivista.html#datafolder

Y para ser Vista / Windows 7 compatible, el resto de la página web será una buena guía.


Para su actualización, puede no CreateDir más de 1 nivel profundo a la vez. Utilice la ForceDirectories función lugar:

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

p.s. No tenga miedo de escribir la configuración del programa al Registro. Eso es lo que el registro es para. De hecho, se maneja adecuadamente ajustes para diferentes usuarios para que cuando diferentes usuarios están conectados. El Registro funciona de la misma manera en el 98 / Vista / 7. Mientras que los archivos ini en realidad han sido depreciados, y ya no son utilizados por Windows.

Usted dice que no quiere meterse con el registro porque "cada poco se agrega a la misma, se ralentiza el ordenador sólo que mucho más". En realidad eso no es cierto. El registro es simplemente una base de datos. Y si es de 10 MB o 100 MB, la diferencia en el tiempo que se necesita para acceder es imperceptible.

Es todas esas compañías que venden programas de Registro Cleaner que están tratando de mantener este cuento va. El uso de sus productos de limpieza puede hacer más daño que bien. Todo lo que necesitan hacer es acabar con una o dos entradas importantes y puede estar en serios caca. Por favor, lea este artículo acerca de los limpiadores del registro , y especialmente la sección "beneficio de rendimiento marginal", que explica correctamente que los problemas de Windows 98 y antes había en el Registro han sido en su mayoría fijos.

Si su programa añade más de 2 o 3 KB al Registro, que será mucho, y es una cantidad insignificante. Utilizar el registro. Hacerlo bien.

Otros consejos

Debe usar el directorio ApplicationData para sus datos de aplicaciones, En Delphi se puede encontrar esta carpeta mediante programación utilizando la función SHGetSpecialFolderLocation cáscara api

Embarcadero tiene una página de preguntas frecuentes en esta, aquí.

Como ya se ha mencionado -. ¡No guardar nada en la carpeta de aplicaciones

Usted debe dividir los valores de configuración en dos partes:

Una pieza que contiene los ajustes que deben trabajar regardlees del usuario -. Esa parte se debe almacenar en COMMON_APPDATA

Una segunda parte que contiene los ajustes individuales de los usuarios (usuarios de la elección personal de fuente etc) - esa parte se debe almacenar en APPDATA

En cuanto a la CreateDir, es cierto que no se puede crear más de un nivel a la vez - sin embargo, Delphi tiene la función ForceDirectories que puede hacer exactamente eso.

por ejemplo. ForceDirectories ( 'C: \ MiCarpeta \ subcarpeta \ SubSubFolder');

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top