Sauvegarder position des panels [Résolu]

ratatouille53 30 Messages postés lundi 11 janvier 2016Date d'inscription 10 décembre 2017 Dernière intervention - 3 nov. 2017 à 21:50 - Dernière réponse : ratatouille53 30 Messages postés lundi 11 janvier 2016Date d'inscription 10 décembre 2017 Dernière intervention
- 9 nov. 2017 à 10:05
bonjour a tous

j'ai sur une form plusieurs panels déplaçables

mais lorsque que je ferme mon application les panels reprennent leur place
initiale.

j aimerais pouvoir sauvegarder leur nouvelles positions a la fermeture
de l application.

jais trouver des composants permettant de sauvegarder

le contenue des edit ,memo etc... mais rien pour les position des objet dans une form tes que les panels , groupbox ,etc....

alors si vous avez une solution je prend;-)
Afficher la suite 

Votre réponse

18 réponses

korgis 424 Messages postés samedi 17 mai 2003Date d'inscription 4 août 2018 Dernière intervention - 4 nov. 2017 à 11:55
0
Merci
Salut,

Pourquoi ne pas utiliser un fichiers "ini" dans lequel tu stockes les valeurs de position de tes panels ?
Tu les enregistres en quittant, et tu les lis en ouvrant l'application.
Tu peux utiliser TIniFile (ou TMemIniFile qui est d'une utilisation plus complexe).
Un exemple simple ci-dessous avec sauvegarde et lecture de la position de Panel1 sur le Form :

uses IniFiles; // <- important !

var
  PathAppli: string;
  IniFile: TIniFile;

procedure TForm1.FormCreate(Sender: TObject);
begin
  PathAppli := ExtractFilePath(Application.ExeName);
  IniFile := TIniFile.Create(PathAppli + 'SaveParams.ini');
  try
    Panel1.Left := IniFile.ReadInteger('Panel1', 'Left', Panel1.Left);
    Panel1.Top := IniFile.ReadInteger('Panel1', 'Top', Panel1.Top);
  finally
    IniFile.Free;
  end
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  IniFile := TIniFile.Create(PathAppli + 'SaveParams.ini');
  try
    IniFile.WriteInteger('Panel1', 'Left', Panel1.Left);
    IniFile.WriteInteger('Panel1', 'Top', Panel1.Top);
  finally
    IniFile.Free;
  end
end;


Si le fichier ini (que j'ai nommé ici "SaveParams", mais tu lui donnes le nom que tu veux) n'existe pas à l'ouverture, ça n'a pas d'importance, les valeurs par défaut seront lues. Et le fichier sera créé à la fermeture de l'appli.
Si tu ne précises pas un chemin au fichier ini, il se logera dans le répertoire de Windows, ce qui est déconseillé car il pourrait écraser un fichier s'y trouvant déjà.

Bon courage,
Commenter la réponse de korgis
dubois77 691 Messages postés jeudi 17 avril 2008Date d'inscription 19 juin 2018 Dernière intervention - Modifié par dubois77 le 4/11/2017 à 14:28
0
Merci
Salut
Méthode simple
tu inscris dans une list (tstringlist par exemple) les coordonnées et tailles de tes panels
Tu sauve la liste quand tu quittes (Liste.savetofile('data.1');
au démarrage il suffit de récupérer les données avec Liste.LoadFromFile et de les affecter
C'est basic et manuel mais facile à faire et à comprendre
Commenter la réponse de dubois77
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscriptionModérateurStatut 3 août 2018 Dernière intervention - 5 nov. 2017 à 22:38
0
Merci
Salut à tous,

pour une sauvegarde "étendue" de la fiche et de tous ses composants
ainsi que leurs contenus le tout dans un code très compacte, très simple
et sans intervention ni code supplémentaire (fonctionne en arrière plan de façon autonome et transparente) ...
voir ce petit code que je vous offre ;)
Commenter la réponse de Cirec
ratatouille53 30 Messages postés lundi 11 janvier 2016Date d'inscription 10 décembre 2017 Dernière intervention - 6 nov. 2017 à 14:05
0
Merci
bonjour a tous

je vous remercie pour vos idées et conseilles très précieux.
j avais opter pour L'enregistrement dans fichier ini

code qui va très bien mais,qui je ne sais pas pourquoi, ne me remet pas tous mes panels correctement , j imagine que cet p être a cause de la quantité de panel 100 panel = 100 fichiers ini

bref idée est bonne tous de même ;-)

sinon cirec merci pour ton petit code mais chez moi il bug
problème de double buffer et , erreur doublon , du coup je n ais pas pu exploité ,je me re pencherais tous de même dessus

si non et bien merci a tous .je considère résolut pour ma par

amicalement T
Commenter la réponse de ratatouille53
korgis 424 Messages postés samedi 17 mai 2003Date d'inscription 4 août 2018 Dernière intervention - 6 nov. 2017 à 18:27
0
Merci
Salut,

"code qui va très bien mais,qui je ne sais pas pourquoi, ne me remet pas tous mes panels correctement , j imagine que cet p être a cause de la quantité de panel 100 panel = 100 fichiers ini"

Non, non, un seul fichier ini !

J'ai testé : le plus rigolo a été de coller 100 panels sur mon form. J'aurais pu les créer dynamiquement, mais ça n'aurait pas facilité la compréhension du code (déjà que...).

Donc j'ai fait simple, et j'ai posé 100 TPanels sur ma fiche, nommés Panel1 à Panel100.

J'utilise le même système, avec une boucle sur les 100 panels :

uses IniFiles;

var
  PathAppli: string;
  IniFile: TIniFile;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  PathAppli := ExtractFilePath(Application.ExeName);
  IniFile := TIniFile.Create(PathAppli + 'SaveParams.ini');
  try
    for i := 1 to 100 do
    begin
      with TPanel(FindComponent('Panel' + IntToStr(i))) do
      begin
        Left := IniFile.ReadInteger('Panel' + IntToStr(i), 'Left', Left);
        Top := IniFile.ReadInteger('Panel' + IntToStr(i), 'Top', Top);
      end;
    end;
  finally
    IniFile.Free;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  i: Integer;
begin
  IniFile := TIniFile.Create(PathAppli + 'SaveParams.ini');
  try
    for i := 1 to 100 do
    begin
      with TPanel(FindComponent('Panel' + IntToStr(i))) do
      begin
        IniFile.WriteInteger('Panel' + IntToStr(i), 'Left', Left);
        IniFile.WriteInteger('Panel' + IntToStr(i), 'Top', Top);        
      end;
    end;
  finally
    IniFile.Free;
  end;
end;


Les positions des 100 panels sont enregistrées dans le fichier ini (qui sera créé automatiquement après la fermeture), et seront lues au redémarrage de l'appli.

Ça marche nickel, et on peut pas faire plus simple !

Bonne prog' ;-)
ratatouille53 30 Messages postés lundi 11 janvier 2016Date d'inscription 10 décembre 2017 Dernière intervention - 7 nov. 2017 à 00:45
lol eu finalement non cet pas bon ton code!! il est tres bien !!
mais en faite moi ce que je souhaite cet que lorsque je quitte l appli que les panels reste a la place ou je les est mis !!

la dans ton code je déplace tous met des que je ferme et ré-ouvre tous ,les panels ce replace correctement . pratique pour ranger sont bureau ;-)

mais la imagine que je place mes panels qui sont virtuellement des tables de resto il faut a chaque ouverture que je replace mes panels a leur place voulu !!! hihihi la patronne va me détesté ci au lieu de lui facilité je lui rajoute de taf !! lol

en faite ton code me plais l enregistrement sur un seul fichier jaime associé a ce que je j aimerais ce serait le top!
korgis 424 Messages postés samedi 17 mai 2003Date d'inscription 4 août 2018 Dernière intervention - 7 nov. 2017 à 14:56
Le code que je te donne enregistre la position des panels (les tables) où tu les a placés au moment de la fermeture de l'application.
Ces positions sont stockées dans le fichier "ini" et tu peux le vérifier en éditant ce fichier avec le bloc-notes.
Au moment de la ré-ouverture de l'application, le fichier est lu, et tu retrouves les panels (les tables) à l'endroit exact où tu les avais placés.
Je viens de tester à nouveau le code, ça fonctionne.

(Laisse tomber le conseil concernant le fait de tout remettre à sa place, tu n'as pas bien compris ce que je suggérais : en clair ne rajoute rien, laisse tomber le "Exit", qui servait seulement à "zapper" les informations contenues dans le fichier in, donc les panels restaient à la place qu'ils occupaient au moment de leur création sur la fiche...)

Je balancerais bien le source avec son zip sur le site, mais je ne suis pas sûr qu'il offre un grand intérêt pour d'autres membres de la communauté Delphiste...
ratatouille53 30 Messages postés lundi 11 janvier 2016Date d'inscription 10 décembre 2017 Dernière intervention - 7 nov. 2017 à 21:21
merci kogis je doit surement faire une erreur pour temps lorsque je compile ton code y a pas erreur !! tous ce pas nickel

mais, mes panel reprennent automatiquement leur place initiale !!!
jai même rajouté des mémos a fin de vérifié si l écriture ce faisait bien

alors voila le résulta quand j suis dans l appli ouverte je déplace mes panels jai mis un bouton mémo pour voir si il enregistre bien les nouvelles positions jusque la tous ce fait bien mais bizarrement je ferme tous et hop a la réouverture les panels on repris la position de création
???
si y a moyen je veux bien avoir ta source !! bien sur si cela est possible et sens t' obliger !!! mais bon j avoue je comprend pas !!

merci Korgis
ratatouille53 30 Messages postés lundi 11 janvier 2016Date d'inscription 10 décembre 2017 Dernière intervention - 7 nov. 2017 à 21:28
a oui !! petite info p'etre important !!! j utilise un composant panel ! autre que celui de delphi pour la transparence :

composant :MovableAndResisablePanel
ratatouille53 30 Messages postés lundi 11 janvier 2016Date d'inscription 10 décembre 2017 Dernière intervention - 8 nov. 2017 à 14:51
bon !! je viens de me remettre dessus car j aime pas resté dans ignorance!! car je doute plus de mes compétences que des tiennes !!

je suis repartie de zero ,, et la ???? booom ca fonctionne?? a rien y comprendre!! en tous cas merci pour ta patience merci

je vais de mon coté revoir mon code y a surement un truc qui interfère!!

merci encore

amicalement T
Commenter la réponse de korgis
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscriptionModérateurStatut 3 août 2018 Dernière intervention - 8 nov. 2017 à 15:06
0
Merci
juste pour information
le code que t'avais proposé et qui n'avait pas fonctionné chez a été mis à jour tu peux à nouveau le tester
(Utiliser la version dans le répertoire nommé "D7")
Cordialement,
ratatouille53 30 Messages postés lundi 11 janvier 2016Date d'inscription 10 décembre 2017 Dernière intervention - 8 nov. 2017 à 18:03
merci cirec

je viens de le test bien !!juste que :

exemple : sur ma form jai trois panels que je de place a volonté quand je ferme la form et que je la ré-ouvre ça marche tres bien ;-)
juste que :jai mis une procédure sur mes panel quand je double clic sur un panel il devient invisible
jai donc un menu qui me permet remettre mon panel visible mais la impossible je suis obliger effacer le fichier de sauvegarde si je veux retrouver mon panel ;-)

cordialement T
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscriptionModérateurStatut 3 août 2018 Dernière intervention - 8 nov. 2017 à 20:47
si tu dois effacer le fichier pour retrouver tes panels c'est que ton code a un souci !

je viens de faire un teste et tout se passe bien je peux rendre un panel invisible, visible et inversement à tous moments.

Cordialement,
ratatouille53 30 Messages postés lundi 11 janvier 2016Date d'inscription 10 décembre 2017 Dernière intervention - 9 nov. 2017 à 10:05
cirec

oui surement , ce qui m' oblige a tous relire et a analyser tres bonne exercice pour moi lol en tous cas merci , pour votre aide et votre code


cordialement T
Commenter la réponse de Cirec

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.