stephanesvh
Messages postés24Date d'inscriptionvendredi 25 juillet 2003StatutMembreDernière intervention15 février 2004
-
13 janv. 2004 à 23:32
stephanesvh
Messages postés24Date d'inscriptionvendredi 25 juillet 2003StatutMembreDernière intervention15 février 2004
-
16 janv. 2004 à 20:45
salut a tous
j'ai un soucis pour la restoration des données sauvegarder, quelqu'un peut m'aider ??
procedure TForm1.btnSaveEditsClick(Sender: TObject);
var
slSauvegarde:TStringList;
i : integer ;
begin
SaveDialog.Execute ;
slSauvegarde:=TStringList.Create;
Try
For i:=0 to ComponentCount - 1 do
if Components[i] is Tedit then
begin
slSauvegarde.Add(TEdit(Components[i]).Name+'='+TEdit(Components[i]).Text);
end;
slSauvegarde.SaveToFile(SaveDialog.FileName);
Finally
slSauvegarde.Free;
End;
end;
// Procedure de restoration des données
procedure TForm1.btnReloadEditsClick(Sender: TObject);
Var i : integer ;
slOuverture:TStringList;
begin
OpenDialog.Execute ;
slOuverture:=TStringList.Create;
For i:=0 to ComponentCount - 1 do
if Components[i] is Tedit then
begin
slOuverture.LoadFromFile(OpenDialog.FileName);
end;
yvemoreau
Messages postés308Date d'inscriptionmardi 11 juin 2002StatutMembreDernière intervention26 septembre 2008 14 janv. 2004 à 06:40
procedure TForm1.btnSaveEditsClick(Sender: TObject);
var
slSauvegarde:TStringList;
i : integer ;
begin
if(SaveDialog.Execute=false)then exit;
slSauvegarde:=TStringList.Create;
Try
For i:=0 to ComponentCount - 1 do
if Components[i] is Tedit then
begin
slSauvegarde.Add(TEdit(Components[i]).Name+'='+TEdit(Components[i]).Text);
end;
slSauvegarde.SaveToFile(SaveDialog.FileName);
Finally
slSauvegarde.Free;
End;
end;
// Procedure de restoration des données
procedure TForm1.btnReloadEditsClick(Sender: TObject);
Var i,i2,i3 ,nb: integer ;
slOuverture:TStringList;
test,test2,test3:String;
begin
if(OpenDialog.Execute=false)then exit;
slOuverture:=TStringList.Create;
try
slOuverture.LoadFromFile(OpenDialog.FileName);
For nb:=0 to slOuverture.Count-1 do
For i:=0 to ComponentCount - 1 do
if Components[i] is Tedit then
begin
test:=slOuverture.Strings[nb];
test2:='';
test3:='';
i3:=0;
for i2:=1 to length(test) do
begin
i3:=i2;
if(test[i2]<>'=')then test2:=test2+test[i2] else break;
end;
for i2:=i3+1 to length(test) do
begin
test3:=test3+test[i2];
end;
if(i3<>0)and(Components[i].Name=test2)then
begin
TEdit(Components[i]).Text:=test3;
end;
end;
finally
begin
slOuverture.Clear;
slOuverture.Free;
end;
end;
end;
bonjour , j'ai fais ceci au plus simple ,(pas optimiser)alors tu peux mettre des points d'arrêt pour voir ce qu'il en est ,je crois que c'est ce que tu souhaites faire ...
yve
yvemoreau
Messages postés308Date d'inscriptionmardi 11 juin 2002StatutMembreDernière intervention26 septembre 2008 15 janv. 2004 à 06:38
ça c'est drôle !!!au risque de paraître maternant...
la procédure est-elle bien affecté à l'événement ?
menu/voir /inspecteur d'objet/événement...
sinon
avec un point d'arrêt vérifie pas-a-pas F8 ce qui ce passe quand tu "click" sur le bouton ...Si l'exécution du opendialog n'est pas égal à vrai on exit; puisque en général la commande est annuler ,sinon on passe à l'exécution de la commande suivante ...Hummm...
slSauvegarde:=TStringList.Create;
devrait s'exécuter sinon ça renverrait une erreur ...
et puis après ...
For nb:=0 to slOuverture.Count-1 do
//le fichier est-il vide ?
sinon
For i:=0 to ComponentCount - 1 do
if Components[i] is Tedit then
on vérifie un à un les composants ,Or Si on ne trouve pas d' "édit" encore là ,...c'est normal ,en pointant sur Components[] lors de l'arrêt on doit-être en mesure de voir de quoi il s'agit...
Si on en trouve 1 alors on vérifie si il coîncide (où sont les trémas ???)avec celui lu par slOuverture[nb] et c'est possible ici que quelque chose puisse ne pas fonctionner correctement ,si l'ordre à changer ,mauvais décodage etc...???
mais encore là (à la relecture du code) ,si on trouve une correspondance et que la sauvegarde (valeur)était nul alors on ne réaffecte pas ... je te l'ai dis ,ce n'était pas vraiment optimisé ...
Que puis-je te dire de plus ?
Yve
Vous n’avez pas trouvé la réponse que vous recherchez ?
stephanesvh
Messages postés24Date d'inscriptionvendredi 25 juillet 2003StatutMembreDernière intervention15 février 2004 15 janv. 2004 à 19:58
Salut
merci pour ton aide , ça ne fonctionner pas car , mon fichier de sauvegarde que j'utiliser pour tester la routine etais deja afficher a l'ecran :blush) Desoler
mais tes explications m'ont beaucoup apporter et aider a comprendre le schmilblick.
Par contre pour sauvegarder un comboBox et qu'il est associer avec des TEdit on fait comment s'il te plait ?
yvemoreau
Messages postés308Date d'inscriptionmardi 11 juin 2002StatutMembreDernière intervention26 septembre 2008 16 janv. 2004 à 07:08
ben c'est exactement le même principe:
procedure TForm1.btnSaveEditsClick(Sender: TObject);
var
slSauvegarde:TStringList;
i : integer ;
begin
if(SaveDialog.Execute=false)then exit;
slSauvegarde:=TStringList.Create;
Try
For i:=0 to ComponentCount - 1 do
if Components[i] is TComboBox then
begin
slSauvegarde.Add(TComboBox(Components[i]).Name+'='+
TComboBox(Components[i]).Text+'nombredItem'+
IntToStr(TComboBox(Components[i]).Items.Count));
slSauvegarde.AddStrings(TComboBox(Components[i]).Items);
end;
pour l'autre partie c'est plus complexe un peu car il faut compter le nombres d'item dans le comboBox au cas ou des édit serait après dans le fichier ...
procedure TForm1.btnReloadEditsClick(Sender: TObject);
Var i,i2,i3 ,nb,nb2: integer ;
slOuverture:TStringList;
test,test2,test3,nombredItem:String;
begin
if(OpenDialog.Execute=false)then exit;
slOuverture:=TStringList.Create;
try
slOuverture.LoadFromFile(OpenDialog.FileName);
For nb:=0 to slOuverture.Count-1 do
For i:=0 to ComponentCount - 1 do
begin
if Components[i] is TComboBox then
begin
test:=slOuverture.Strings[nb];
test2:='';
test3:='';
i3:=0;
for i2:=1 to length(test) do
begin
i3:=i2;
if(test[i2]<>'=')then test2:=test2+test[i2] else break;
end;
if(Components[i].Name=test2)then
begin
for i2:=i3+1 to length(test) do test3:=test3+test[i2];
//test3 = caption+'nombredItem'+integer;
nb2:=length(test3);//on "scanne" de la fin
while (test3[nb2]in['0'..'9'])do dec(nb2);
//nécessairement on ariveras sur le "m" ...
nombredItem:='';
for i2:=nb2+1 to length(test3)do
nombredItem:=nombredItem+test3[i2];
TComboBox(Components[i]).Items.Clear;
nb2:=StrToInt(nombredItem);
for i2:=1+nb to nb2+nb do
begin
TComboBox(Components[i]).Items.Add(slOuverture.Strings[i2]);
end;
end;
end else
if Components[i] is Tedit then
begin
test:=slOuverture.Strings[nb];
test2:='';
test3:='';
i3:=0;
for i2:=1 to length(test) do
begin
i3:=i2;
if(test[i2]<>'=')then test2:=test2+test[i2] else break;
end;
for i2:=i3+1 to length(test) do test3:=test3+test[i2];
if(Components[i].Name=test2)then
begin
TEdit(Components[i]).Text:=test3;
end;
end;
end;
finally
begin
slOuverture.Clear;
slOuverture.Free;
end;
end;
end;
attention ! si les un item string du ComboBox s'adonnait par hasard être combobox1=...????
je n'ai pas vraiment optimiser ,là stephanesvh réfléchis et nettoie tout ça ,peut-être avec des noms de variables plus évocatrices ,ça aideras à comprendre le process...
fin :clown) courage !!!
yvemoreau
Messages postés308Date d'inscriptionmardi 11 juin 2002StatutMembreDernière intervention26 septembre 2008 16 janv. 2004 à 07:12
Mais pourquoi ne pas utiliser un fichier ini ,c'est fait pour ça il me semble ,là je dormais %$/???... va voir des exmples sur comment les utiliser ce sera surement plus sécuritaire ...
yve
stephanesvh
Messages postés24Date d'inscriptionvendredi 25 juillet 2003StatutMembreDernière intervention15 février 2004 16 janv. 2004 à 11:14
Salut
Tout d'abord merci pour ton aide et toute ses explications.
Pour ce qui est du fichier ini; j'avais pensé mais je ne sais pas si avec un fichier ini , on peux sauvegarder des données sous des nom de fichier differents
Le projet que je fait avec ton aide ;) c'est une 'feuille de calcul' avec identification de l'operateur predefini (d'ou la combo). et a chaque calcul toutes les données saisie et issu du calcul doivent etre imperativement sauvegarder sous des nom de fichier different.
Si par l'intermedaire d'un fichier ini on peux le faire, tu pourrai m'expliquer comment s'il te plait (si c'est pas trop abuser de ta gentillesse et de ta serviabilité)
donc 2 procédure que tu ajoutes dans
type
TForm1...
implementation
{$R *.dfm}
procedure TForm1.Sauvegarde(composant: TComponent);
var I:Integer;
begin
for I := ComponentCount-1 downto 0 do
if( Components[I].Name=composant.Name)then
begin
WriteComponentResFile(composant.Name+'~.res',composant);
break;
end;
end;
procedure TForm1.Restauration(composant: TComponent);
var
F:TFileStream;
I:Integer;
begin
if not(fileExists(composant.Name+'~.res'))then exit;
F:=TFileStream.Create(composant.Name+'~.res',fmOpenRead);
try
try
for I := ComponentCount-1 downto 0 do
if( Components[I].Name=composant.Name)then
begin
F.ReadComponentRes(Components[I]);
end;
except;
end;
finally F.Free;
end;
end;
Bon là c'est beaucoup plus efficace !!!
et on l'utilise comme ceci:
procedure TForm1.Button1Click(Sender: TObject);
var test:TComponent;
begin
test:=FindComponent('edit1');
if(test<>nil) then Sauvegarde(test);
end;
procedure TForm1.Button2Click(Sender: TObject);
var test:TComponent;
begin
test:=FindComponent('edit1');
if(test<>nil) then Restauration(test);
end;
:big) je vais surement conserver ce code quelque pars ...
yve
yvemoreau
Messages postés308Date d'inscriptionmardi 11 juin 2002StatutMembreDernière intervention26 septembre 2008 16 janv. 2004 à 19:56
oui désolé ,je n'ai pas spécifié ,ayant compris les besoins...
non ce n'est pas relier à l'utilisation de fichier ini, dans ce cas-ci se serait impossible puisque tu veux sauvegarder plusieurs valeur d'un composant ...je dis impossible ,mais bon ...aussi compliqué que la méthode première peut-être .Pourquoi prendre un chemin plus long ?enfin ,il me semble !!!