2010-01-19 10 views
4

Mise à jour: J'ai ajouté le code suivant:Delphi vista fichier ini/xp/win7


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; 

Et j'ai changé la fonction setinifilename (voir ci-dessous). Cela ne créera pas la structure de dossier.

--Fin update--

Je suis en retard, sur ce qu'il faut et ne pas faire. C'est ainsi que je sauvegarde actuellement les paramètres de mon logiciel. Je viens de le tester sur Vista pas connecté en tant qu'administrateur, et il me donne un message d'erreur ne peut pas écrire le fichier ini. Donc je devine que je suis supposé écrire les données dans un dossier de données? Je n'ai jamais utilisé vista/win7 auparavant, et je veux que ce logiciel soit compatible avec Windows 2K +. Que dois-je faire pour enregistrer les paramètres. Je ne voulais vraiment pas jouer avec le registre, parce que chaque petit ajout, ralentit l'ordinateur encore plus ... (ou du moins il semble)

Merci pour toute contribution.



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; 

+0

Voir ma mise à jour (dans ma réponse). Cela devrait le faire fonctionner. – lkessler

+3

Les comptes d'utilisateurs avec des répertoires d'installation en lecture seule sont possibles depuis la première version de Windows NT il y a plus de 15 ans et étaient assez courants dans les environnements d'entreprise. Vous n'avez jamais testé sur un tel compte auparavant. À moins que vous n'utilisiez les fonctions de l'API Vista uniquement (la documentation MSDN indique la version minimale du système d'exploitation nécessaire pour chaque fonction), les techniques utilisées dans les réponses sont certainement compatibles avec Windows 2000 et les versions ultérieures. – mghie

Répondre

8

Dans Vista, votre programme n'est PAS autorisé à écrire dans le répertoire des fichiers du programme où se trouve votre programme.

Vous devez maintenant enregistrer vos fichiers ini dans le répertoire AppData.

Une description de la façon de le faire dans delphi est à: http://www.theabsolute.net/sware/delphivista.html#datafolder

Et pour être Vista/Windows 7 compatible, le reste de cette page Web sera une bonne ligne directrice.


Pour votre mise à jour, vous ne pouvez pas CreateDir plus de 1 niveau de profondeur à la fois. Utilisez le ForceDirectories function à la place:

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

P.S. N'ayez pas peur d'écrire les paramètres du programme dans le registre. C'est ce que le registre est pour. En fait, il gère correctement les paramètres pour les différents utilisateurs pour vous lorsque différents utilisateurs sont connectés. Le registre fonctionne de la même manière dans 98/Vista/7. Alors que les fichiers ini ont été réellement dépréciés et ne sont plus utilisés par Windows.

Vous dites que vous ne voulez pas jouer avec le registre parce que "chaque petit peu que vous ajoutez, ralentit l'ordinateur juste plus". En fait, ce n'est pas vrai. Le registre est simplement une base de données. Et si c'est 10 Mo ou 100 Mo, la différence de temps d'accès est imperceptible.

Toutes ces sociétés vendent des programmes Registry Cleaner qui tentent de faire perdurer ce conte de fées. L'utilisation de leurs nettoyants peut vous faire plus de mal que de bien. Tout ce qu'ils ont à faire est d'effacer une ou deux entrées importantes et vous pouvez être en profond doo-doo. Veuillez lire le this article about Registry Cleaners, et en particulier la section «Marginal performance benefit» qui explique correctement que les problèmes rencontrés par Windows 98 et les versions antérieures ont été corrigés pour la plupart.

Si votre programme ajoute plus de 2 ou 3 Ko au Registre, ce sera beaucoup, et c'est un montant insignifiant. Utilisez le registre. Fais-le bien.

+0

Merci pour l'information, je l'ai ajouté à mon application. – Brad

+5

Ou vous pouvez simplement utiliser 'ForceDirectories()' (dans l'unité 'FileCtrl') au lieu de' CreateDir() 'pour créer la structure en un seul appel. – mghie

+0

@mghie: Merci. Je ne me connaissais pas sur la fonction ForceDirectories. J'ai mis à jour ma réponse. – lkessler

4

Vous devez utiliser le répertoire ApplicationData pour vos données d'applications, Dans Delphi vous pouvez trouver ce dossier à l'aide programatically la coquille fonction api SHGetSpecialFolderLocation

Embarcadero ont une page FAQ sur ce point, here.

2

Comme déjà mentionné - Ne sauvegardez rien dans le dossier de l'application.

Vous devez diviser vos paramètres de configuration en deux parties:

Une partie contenant les paramètres qui doivent travailler regardlees de l'utilisateur - cette partie doit être stocké dans COMMON_APPDATA.

une seconde partie contenant les paramètres des utilisateurs individuels (utilisateurs de choix personnels de police, etc.) - cette partie doit être conservé dans APPDATA

Quant au CreateDir, il est vrai que vous ne pouvez pas créer plus d'un niveau à un Cependant, Delphi a la fonction ForceDirectories qui peut faire exactement cela.

par exemple. ForceDirectories ('C: \ MyFolder \ SubFolder \ SubSubFolder');

+1

+1. Il convient de souligner que la première partie de 'COMMON_APPDATA' devrait être considérée en lecture seule par l'application. L'installateur peut écrire tout ce qui est nécessaire, il aura les permissions appropriées. Les modifications ultérieures ne peuvent être effectuées que par des utilisateurs disposant de privilèges suffisants, qui doivent être vérifiés ou une élévation doit être demandée. – mghie

+0

Vous avez raison. J'enregistre habituellement SystemSettings et DefaultUserSettings dans COMMON_APPDATA. Au démarrage, je charge le SystemSsettings - et vérifie si l'utilisateur actuel a UserSettings dans son APPDATA. Sinon, je vais charger les paramètres par défaut de COMMON_APPDATA et les enregistrer aux utilisateurs APPDATA - maintenant prêt à l'emploi. – TechnoCowboy

+1

Vous pouvez utiliser l'appdata de l'utilisateur defaul pour créer automatiquement les paramètres initiaux d'un utilisateur app_data lors de la création d'un nouvel utilisateur (cela ne fonctionne pas pour les utilisateurs déjà existants). –

Questions connexes