Sauvegarder position des panels

Résolu
ratatouille53 Messages postés 30 Date d'inscription lundi 11 janvier 2016 Statut Membre Dernière intervention 10 décembre 2017 - 3 nov. 2017 à 21:50
ratatouille53 Messages postés 30 Date d'inscription lundi 11 janvier 2016 Statut Membre Dernière intervention 10 décembre 2017 - 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;-)

6 réponses

korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
4 nov. 2017 à 11:55
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,
0
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
Modifié le 4 nov. 2017 à 14:28
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
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
5 nov. 2017 à 22:38
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 ;)
0
ratatouille53 Messages postés 30 Date d'inscription lundi 11 janvier 2016 Statut Membre Dernière intervention 10 décembre 2017
6 nov. 2017 à 14:05
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
6 nov. 2017 à 18:27
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' ;-)
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
6 nov. 2017 à 18:38
Ah oui.. petit détail si tu veux tester ce code.

Quand tu auras fini de t'amuser à déplacer les panels (et avoir bien mis la pagaille lol), pour t'éviter la corvée de les remettre à leur position initiale, il suffit de rajouter un petit "Exit" dans le code dans OnCreate, juste avant la lecture du fichier ini (avant try)...
0
ratatouille53 Messages postés 30 Date d'inscription lundi 11 janvier 2016 Statut Membre Dernière intervention 10 décembre 2017 > korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019
6 nov. 2017 à 19:04
oui !!! merci korgis ;-)
0
ratatouille53 Messages postés 30 Date d'inscription lundi 11 janvier 2016 Statut Membre Dernière intervention 10 décembre 2017 > ratatouille53 Messages postés 30 Date d'inscription lundi 11 janvier 2016 Statut Membre Dernière intervention 10 décembre 2017
6 nov. 2017 à 19:12
//-------------------------------------------------------------------------

//*****************************************************************************
// salle Paris Procedure lecture des positions des panel
//*****************************************************************************
procedure TForm1.FormShow(Sender: TObject);
var
iniFile: TIniFile;
begin
//*****************************************************************************
//****** code pour lire et recuperer la position du premier panel1 (tables)
//****************************************************************************
iniFile := TiniFile.Create(ExtractFilePath(Application.ExeName) + '\ini\Transp1.ini');
Transp1.Left := iniFile.ReadInteger ('Position', 'Left', Transp1.Left);
Transp1.Top := iniFile.ReadInteger('Position', 'Top', Transp1.Top);
Transp1.Width := iniFile.ReadInteger('Position', 'Width', Transp1.Width);
Transp1.Height:= iniFile.ReadInteger('Position', 'Height', Transp1.Height);

iniFile.Free;
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var iniFile: TInifile;
begin
//*****************************************************************************
// salle Paris Procedure Enregistrement des positions panels
//*****************************************************************************
//****** code pour enregistrer la position du premier panel1 (tables)
//****************************************************************************
iniFile := TIniFile.Create(ExtractFilePath(Application.exeName) + '\ini\Transp1.ini');
iniFile.WriteInteger('Position', 'Left', transp1.Left);
iniFile.WriteInteger('Position', 'Top', transp1.Top);
iniFile.WriteInteger('Position', 'Width', transp1.Width);
iniFile.WriteInteger('Position', 'Height', transp1.Height);

iniFile.free;
end;

voila ce que moi j avais fait !! un fichier ini par panel
0
ratatouille53 Messages postés 30 Date d'inscription lundi 11 janvier 2016 Statut Membre Dernière intervention 10 décembre 2017
6 nov. 2017 à 21:50
mais le tien est mieux !!
0
ratatouille53 Messages postés 30 Date d'inscription lundi 11 janvier 2016 Statut Membre Dernière intervention 10 décembre 2017
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!
0
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 à 15:06
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,
0
ratatouille53 Messages postés 30 Date d'inscription lundi 11 janvier 2016 Statut Membre Dernière intervention 10 décembre 2017
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
0
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 à 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,
0
ratatouille53 Messages postés 30 Date d'inscription lundi 11 janvier 2016 Statut Membre Dernière intervention 10 décembre 2017
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
0
Rejoignez-nous