Fichier ini

Résolu
Signaler
Messages postés
133
Date d'inscription
mercredi 4 janvier 2006
Statut
Membre
Dernière intervention
7 septembre 2010
-
 jlen100 -
Bonjour,

J'ai une form1 :

Code:,
----

uses unit2;
procedure TForm1.FormCreate(Sender: TObject);
begin
{Police récupérée dans le fichier "Options.opt"}
LoadFont(FileName: String; Section: string);
Dans un unit 2 :

Code:,
----

uses IniFiles;
procedure LoadFont(FileName: String; Section: string);
begin
Try
filename:=(ExtractFilepath(application.ExeName)+ 'Options.opt','Sections Options') ;

J'ai un message d'erreur. Pourquoi ?

23 réponses

Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
Salut yannba,

I. "J'ai un message d'erreur. Pourquoi ?"
Il faut absolument que tu précises quel message d'erreur tu obtiens, s'il survient à la compilation ou à l'exécution, et sur quelle ligne s'arrête le compilateur.

II. Explique ce que tu cherches à faire au final,
histoire que l'on ait une idée de ce que tu veux réaliser avec le code que tu donnes...
Que cherches-tu à faire par l'intermédiaire de ce code ? Lire une section d'un fichier ini ?

III. le code :
filename:= (ExtractFilepath(application.ExeName)+ 'Options.opt','Sections Options') ;
n'est pas correct... Cela revient au même que d'utiliser cette syntaxe : FileName := 'xxxx' , 'xxxx';
Pourquoi mettre une virgule ????

IV. Proposition
La même que Cirec... A condition que l'on ait bien compris ce que tu comptais faire. On peut cependant encore faire une légère modif, comme ça on supprime la déclaration de la variable Ini et on évite de réécrire Ini. à chaque fois que l'on veut procéder à une lecture/écriture :
uses
IniFiles;
var
FileName, FontName : string;

FileName : = ExtractFilepath(application.ExeName)+'Options.opt';
with TIniFile.Create(FileName) do try
FontName := ReadString('SectionOptions', 'Font', 'Arial'); // Récupère le nom de la police stocké dans la valeur Font de la section SectionOptions du fichier ini, ou attribue la police Arial comme donnée par défaut si la valeur n'existe pas dans le fichier ini
[...]
finally
Free;
end;

@+
Nico { http://www.ni69.new.fr/ }

<hr size ="2" width="100%">
N'oubliez pas de cliquer sur Réponse Acceptée lorsque la réponse vous convient !
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
Bon c'est pas grave,
alors tu fait comme ça :

Dans la partie Interface de L'unit2 tu déclares tes variables comme suit :

Var
Form2 : TForm2;
ColorForm, ... :integer;

Implémentation

Procedure LoadFont(FileName: String; Section: string);
var ListeOptions: TIniFile;
begin
Try
ListeOptions:= TIniFile.Create(FileName);
ColorForm:=ListeOptions.ReadInteger(Section, 'ColorForm', Ici tu mets une couleur par défaut );
...
finally
ListeOptions.Free ;
end;
End;

et dans Unit1

uses unit2;
//Var ColorForm, ... :integer; Ne pas redéclarer les variables elle sont accessibles grâce à Uses Unit2
procedure TForm1.FormCreate(Sender: TObject);
begin
{Police récupérée dans le fichier "Options.opt"}
LoadFont(ExtractFilepath(application.ExeName)+ Options.opt','Sections Options');
Form1.Color: = ColorForm;
...
end;

@+
Cirec
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
Salut,

Essaye comme ça :
procedure LoadFont(FileName: String; Section: string);
Var Ini : TIniFile;
begin
filename:= ExtractFilepath(application.ExeName)+ 'Options.opt';
Ini := TIniFile.Create(FileName);
Try
..... // ici le code qui va lise l'info
Finally
Ini.Free
End;
End;

@+
Cirec
Messages postés
133
Date d'inscription
mercredi 4 janvier 2006
Statut
Membre
Dernière intervention
7 septembre 2010

Avant que tu me repondes, j'ai modifié comme ceci :

uses unit2;
Var ColorForm, ... :integer;
procedure TForm1.FormCreate(Sender: TObject);
begin
{Police récupérée dans le fichier "Options.opt"}
LoadFont(ExtractFilepath(application.ExeName)+ Options.opt','Sections Options');
Form1.Color:=ColorForm;
...
end;

Dans l'unit 2 :
uses inifiles;
Var ColorForm, ... :integer;

procedure LoadFont(FileName: String; Section: string);
var ListeOptions: TIniFile;
begin
Try
ListeOptions:=TIniFile.Create(FileName);
ColorForm:=ListeOptions.ReadInteger(Section, 'ColorForm', ColorForm);
...
finally
ListeOptions.Free ;
end;

Lorsque je fais F7, le prog lit bien les infos dans mon unit2, mais ne les applique pas dans ma form1 ...
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
Salut,
C'est Normal, tu as deux fois ColorForm une fois dans Unit1 et une fois dans Unit2 pour le compilateur c'est deux variables totalement différentes.
Exxayse comme ceci :

uses unit2;
//Var ColorForm, ... :integer;
procedure TForm1.FormCreate(Sender: TObject);
begin
{Police récupérée dans le fichier "Options.opt"}
Form1.Color:= LoadFont(ExtractFilepath(application.ExeName)+ Options.opt','Sections Options');
...
end ;

Dans l'unit 2 :
uses inifiles;
//Var ColorForm, ... :integer;

Function LoadFont(FileName: String; Section: string): Integer;
var ListeOptions: TIniFile;
begin
Try
ListeOptions: =TIniFile.Create(FileName);
Result:=ListeOptions.ReadInteger(Section, 'ColorForm', Ici tu mets une couleur par défaut);
...
finally
ListeOptions.Free ;
end;
End;

@+
Cirec
Messages postés
133
Date d'inscription
mercredi 4 janvier 2006
Statut
Membre
Dernière intervention
7 septembre 2010

Je ne peux pas faire une function car, j'ai plusieurs données à récupérer :
ex :
ColorPanneaux:=ListeOptions.ReadInteger(Section, 'ColorPanneaux', ColorPanneaux);
FontNameAffichage:=ListeOptions.ReadString(Section, 'FontNameAffichage', FontNameAffichage);
FontColorAffichage:=ListeOptions.ReadInteger(Section, 'FontColorAffichage', FontColorAffichage);
FontSizeAffichage:=ListeOptions.ReadInteger(Section, 'FontSizeAffichage', FontSizeAffichage);
FontStyleAffichage:=ListeOptions.ReadInteger(Section, 'FontStyleAffichage', FontStyleAffichage);

et beaucoup d'autres encore ...
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
Oula, je n'avais vu que le premier message de Cirec avant de poster...
Je n'avais pas rafraîchi la fenêtre

@+
Nico { http://www.ni69.new.fr/ }

<hr size="2" width="100%">
N'oubliez pas de cliquer sur Réponse Acceptée lorsque la réponse vous convient !
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
No problèmo,
elles se complètent de toutes manières

donc tu peux faire une combinaison des deux réponses c'est comme tu veux

@+
Cirec
Messages postés
133
Date d'inscription
mercredi 4 janvier 2006
Statut
Membre
Dernière intervention
7 septembre 2010

C'est bon ca roule !!!! merci à vous deux
Messages postés
133
Date d'inscription
mercredi 4 janvier 2006
Statut
Membre
Dernière intervention
7 septembre 2010

Il veut pas prendre : reponse acceptée !!!!!!!!
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
Clique sur Réponse Acceptée s.t.p Merci

c'est fait pour et ça permet aux autres de savoir tout de suite si il y a eut une réponse satisfaisante où non à cette question

@+
Cirec
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
ah dans ce cas tu peux le signaler aux Admins en leurs donnant le lien et le navigateur utilisé

@+
Cirec
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
Menu "Contact" / "Contacter les admins"...

@+
Nico { http://www.ni69.new.fr/ }

<hr size="2" width="100%">
N'oubliez pas de cliquer sur Réponse Acceptée lorsque la réponse vous convient !
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Ne vous inquiétez pas, le problème de validation de réponse est en cours de résolution.
En attendant, je le fais pour vous

<hr color="#008000">Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
Merci Delphiprog

@+
Nico { http://www.ni69.new.fr/ }

<hr size="2" width="100%">
N'oubliez pas de cliquer sur Réponse Acceptée lorsque la réponse vous convient !
Messages postés
133
Date d'inscription
mercredi 4 janvier 2006
Statut
Membre
Dernière intervention
7 septembre 2010

Merci Delphiprog. Mais, j'avais envoyé un mail à l'administrateur ...
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
Yannba,

regarde à coté du pseudo de Delphiprog il y a écris Admin CS ce qui veut dire Admiministrateur Codes-Sources

@+
Cirec
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
lol,

regarde à coté du pseudo de Delphiprog il y a écris Admin CS ce qui veut dire Administrateur Codes-Sources

@+
Cirec
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
un petit tip vite fait, a propos des couleurs dans un Tini :

Un Tcolor est un integer (Rgb(gnah,gnah,gnah) renvoi un cardinal, mais ca marche comme un integer). le lien entre R, G & B et la valeur (integer) de cette couleur c'est:

RGB(r,g,b) = r + 256 x g + (256 x 256) x b

Ca peut toujours servir pour faire des tests vite fait.
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
Salut,
ou encore :
Color := (R or (G shl 8) or (B shl 16));

et pour l'inverse :
R : = Byte(Color);
G := Byte(Color Shr 8);
B : = Byte(Color Shr 16);

@+
Cirec