Sauvegarde Form et composants automatiquement

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 5 nov. 2017 à 22:29
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 26 nov. 2017 à 19:02
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/102254-sauvegarde-form-et-composants-automatiquement

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
Modifié le 29 nov. 2017 à 05:33
re à tous,

j'ai fait une modification du code non négligeable mais vu l’enthousiasme ambiant je me demande si ça vous intéresse ?

la modification porte sur la possibilité de recharger la sauvegarde à tous moments ainsi que la possibilité de faire des sauvegardes ponctuelles et de les recharger au moment voulu (ex. sauvegarde du travail, texte en cours)

Cette modification semble évidente et simple dans sa mise en oeuvre mais ce n'est pas le cas ... si vous la tester vous risquez à 99% une violation d'accès et un plantage de l'application.

Donc si la solution vous intéresse faites le moi savoir et je posterai la mise à jour avec plaisir.

PS: juste pour information, j'ai développé deux autres méthodes dans la même lignée ...
1 qui permet de sauvegarder un composant ou plus au choix dans un fichier ini
2 qui fait la même chose que l'original mais la sauvegarde est intégrée à l'exécutable (remplacement du dfm d'origine)

Faites-moi savoir si quelque chose vous intéresse ... ou pas ^^

Bon coding à tous,
Cordialement,
@+
     
@+ Cirec la belle voix de mon filleul
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
13 nov. 2017 à 20:05
En fait, dans ta procedure TForm.AfterConstruction, tu détruis 2 fois les composants de la fiche en cas d'exception.

Pour résumer, seul le LoadFormFromRessources(Self) est utile dans le except de la procedure TForm.AfterConstruction.


non il faut absolument détruire tous les composants parce que si le fichier de sauvegarde est corrompu il a peut être quand même eut le temps de charger les premiers composants avant de planter et dans ce cas il faut les détruire ...

il est très important de détruire tous les composants ainsi que d'effacer le nom de la fiche avant de recharger le dfm quel qu'il soit.

donc si il y a une exception on supprime à nouveau tous les composants comme ça pas mauvaises surprises du style "un composant nommé XXX existe déjà !" ^^. ;)
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18 > Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022
14 nov. 2017 à 09:52
Ah ok .

Ce que j'aime bien avec toi, c'est que j'apprends toujours des trucs; même pour la plus banale des opérations. ^ ^

Merci. Je vais essayer d'être aussi précautionneux que toi dorénavant.
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
Modifié le 13 nov. 2017 à 10:29
Salut Caribensila,

ça fait plaisir ;)
Dis-donc Eric, joli code; mais un peu compliqué. Pourquoi charger le .dfm d'origine à partir d'un .res ? L'utilisation de ressources me semble être superflu, non ?

Dans ta procedure TForm.AfterConstruction tu peux supprimer les 3 lignes :
for I := ComponentCount - 1 downto 0 do
        Components[I].Free;
      LoadFormFromRessources(Self);
Et donc aussi le fichier ressources et tout ce que cela implique.


1°) c'est Delphi (le compilateur) qui stock le dfm dans les ressources de l'application (ce n'est pas de mon fait) je ne fais qu'utiliser ce qui existe déjà. ;)
2°) ces 3 lignes ne s'exécutent que si un problème survient lors du chargement du dfm de sauvegarde. Si la sauvegarde est corrompue sans ces 3 lignes le programme risque de planter.
Alors je sais que je ne mets pas beaucoup de commentaires mais juste avant ces 3 lignes il y avait ceci :
      // si on a un souci
      // on charge le dfm d'origine
^^
3°) le code est en fait très simple, il ne fait qu'utiliser des méthodes mises à disposition par Delphi depuis le début. D'ailleurs d'après les conditions de dépôt de code du site je devrais le supprimer pour la raison cité juste avant. Mais vu ce qu'il apporte et que je n'ai rien trouvé d'équivalent je le laisse ;)
Quand on ne comprend pas au premier abord on a tendance à chercher la complication c'est naturel c'est votre cerveau qui vous trompe ^^ il vous dit :"non non ça ne peut pas être aussi simple" ^^ mais si :p

Voilà j'espère que c'est un peu plus claire maintenant sinon je suis là ;)

Amicalement,
@+
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18 > Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022
13 nov. 2017 à 16:52
Merci pour ton explication.
J'ai capté !

J'ai été troublé parce que je me demandais pourquoi tu détruisais les composants de la fiche, PUIS tu chargeais le dfm. Ca me semblait contradictoire. ^ ^
En fait, dans ta procedure TForm.AfterConstruction, tu détruis 2 fois les composants de la fiche en cas d'exception.

Pour résumer, seul le LoadFormFromRessources(Self) est utile dans le except de la procedure TForm.AfterConstruction.

Amitiés à tous.
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
12 nov. 2017 à 19:04
Salut les nejeux !
Alors ? On discute devant le flipper ? :D


Dis-donc Eric, joli code; mais un peu compliqué. Pourquoi charger le .dfm d'origine à partir d'un .res ? L'utilisation de ressources me semble être superflu, non ?

Dans ta procedure TForm.AfterConstruction tu peux supprimer les 3 lignes :
for I := ComponentCount - 1 downto 0 do
Components[I].Free;
LoadFormFromRessources(Self);

Et donc aussi le fichier ressources et tout ce que cela implique.

Tu verras que ça fonctionne aussi bien !
Sauf si je n'ai pas vu un truc. Mais ça, je sais que tu me l'expliqueras. Je te fais confiance ! ;)
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
8 nov. 2017 à 22:51
Salut Cirec,

Toujours les mêmes messages à l'ouverture !!!!

Décidément, mon Delphi7 ne parle ni l'allemand, ni le japonais ^^

Es-tu sûr d'avoir bien envoyé le bon *.res ?

Pas grave, j'ai fait un copier/coller des composants sur une fiche vierge, pareil pour le code.

Et j'ai finalement pu tester : Super, ça marche aux petits oignons !

Fonctionnement simple, certes, mais code intéressant à étudier.

Pour les débutants (et les cancres), j'ai envie de préciser que la déclaration de "crFormSaver" doit impérativement précéder celle du Form principal : donc à placer à la suite des "uses", tout à fait en haut.
Et pour les distraits, ne pas oublier de placer "crFormSaver.pas" dans le même répertoire...
Et rien d'autre à faire !

C'est magique, et ça devrait plaire à quelqu'un qui vient de poser une question sur ce forum qui parle de sauvegarder la position de panels déplacés sur une fiche et qui retrouveraient la même place à la ré-ouverture ^^

Pour l'anecdote, si quelqu'un utilise encore D4, il faut rajouter "FileCtrl" dans les uses pour "DirectoryExists" et "ForceDirectories". Sinon, ça fonctionne très bien sous D4, et certainement aussi pour D5 et D6.

Bonne soirée et bon coding :-)
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17 > korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019
8 nov. 2017 à 23:05
Rectification :

pour avoir les fichiers modifiés pour D7, il faut aller dans le répertoire D7 et les télécharger un par un :-(

Sinon ça fonctionne tout à fait bien.
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50 > korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019
9 nov. 2017 à 12:01
oui j'ai remarqué ce problème en essayant de télécharger le Zip il manquait le répertoire D7 !!!

J'ai fait un nouveau Zip et mis à jour ... le problème semble résolu ;)

si t'as d'autres questions ou propositions ... ;)

Amicalement,
@+
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
8 nov. 2017 à 14:51
Voilà la mise à jour est faite.

le problème venait des propriétés inexistantes mais aussi et surtout du fichier ressources *.res qui était issu de Tokyo 10.2. ce que D7 ne peut pas comprendre ^^

mais maintenant ça fonctionne sous D7 en dessous j'ai pas de version d'installée ;)

si t'as d'autres questions ou soucis ... tu sais comment faire ^^
j'attends avec impatience ton retour ;)

Cordialement,
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
7 nov. 2017 à 17:45
Salut Cirec,

Aucun commentaire encore ? Bigre !

Alors je me risque à exposer ici mes petites misères ^^

Je n'arrive pas à ouvrir ton programme !!!

J'utilise encore mon vieux D7 (D4 aussi), et je suis actuellement sous XP Pro 32 bits (bien que je ne voie pas trop l'importance que ça pourrait avoir).

Voici les messages qui me sont adressés sous D7 :

"Erreur lors de la lecture de MainForm.DoubleBuffered. La propriété DoubleBuffered n'existe pas. Ignorer l'erreur etc..."

Même message pour :
"mmoView.DoubleBuffered"
"mmoView.ParentDoubleBuffered"
"lbFiles.DoubleBuffered"
"lbFiles.ParentDoubleBuffered"

Il semblerait que la propriété "ParentDoubleBuffered" (que je ne connais pas) n'existe pas sous D7.
Ce qui est plus étrange encore, c'est que je ne trouve aucune ligne dans ton code où il serait fait mention de "ParentDoubleBuffered".
Je n'y comprend rien...
Serais-je entré dans la "twilight zone" ?

J'aimerais pourtant bien étudier ton code.
J'en avais quelques uns sur ce sujet, utilisant TStream, ou les méthodes ReadComponentResFile et WriteComponentResFile.
Et je n'arrive pas à mettre la main dessus !

Voilà. Suis-je donc seul à avoir ce problème ?
(ou personne n'a encore essayé ce code téléchargé 13 fois...)
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50 > korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019
8 nov. 2017 à 09:24
Salut,

oui, merci d'avoir essuyé les plâtres ^^

en fait avant de poster le code j'ai fait un teste "rapide" D7 D2009 Berlin & Tokyo 10.2
et en testant les derniers j'ai modifié ces propriétés "ParentDoubleBuffered" désolé
je te prépare une version D7 pour cet aprèm ;)

en ce qui concerne les commentaires ... seule l'unité "crFormSaver.pas" est importante pour ce code. Le fait qu'il y a peu de commentaires s'explique par la simplicité du code mis en oeuvre. Le nom des procédures ainsi que les codes qui les composes sont simples et explicites. Mais si tu penses que ça ne suffit pas j'en ajouterai ;)

Cordialement,
@+
Rejoignez-nous