IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

bug du programme apres utilisation de dialog


Sujet :

Delphi

  1. #1
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut bug du programme apres utilisation de dialog
    Bonjour,

    j'ai un gros probleme, a chaque fois que j'utilise un savedialog, opendialog, ou meme la fonction qui permet de faire un sreenshot de mon application, en fait tout ce qui écrit en dehors de l'application me donne pas mal de probleme notamment lorsque je veux afficher une image externe au programme (dans un dossier a part), ou bien lorsque je veux a nouveau utiliser une opendialog pour lire ce qu'il y a dans mon fichire! je ne sais pas du tout d'ou ça viens, a la limite voici les codes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    /////////////PROCEDURE POUR OUVRIR/////////////////
    procedure TForm1.Ouvrir1Click(Sender: TObject);
    Var i:Integer;
        F:TextFile;
        lig:string;
    begin
      //Charger.FileName := Sauver.FileName;
     
      If Not Charger.Execute Then Exit;
     
      try
        AssignFile(F,Charger.FileName); //on assigne a F le fichier ouvert
        Memo1.Clear;          //on vide le memo
        Form1:= TForm1.Create(Self);
        For i:=Form1.ComponentCount-1 DownTo 0 Do
          begin
               Form1.Components[i].Free;
          end;
          StatusBar1.Panels.Items[0].Text := tab[5] + Charger.FileName;
     
          reset(F); // on va au debut  du fichier
          while not eof(F) do
          begin //cette boucle répètera la lecture d'une ligne tant que nous n'aurons pas atteint la fin du document EOF
            readln(F,lig);//à chaque fois que l'on utilisera readln on passera à la ligne suivante.
            Memo1.lines.add(lig); // ajoute notre ligne au memo
          end;
          closefile(F);//cette procédure ferme notre fichier F
     
          ShowMessage(Memo1.Text);
     
      except
        on E: Exception do
          ShowMessageFmt('%s : à la lecture de %s', [E.Message, Charger.FileName]);
      end;
    end;
    /////////////FIN PROCEDURE POUR OUVRIR/////////////////
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    /////////////PROCEDURE POUR ENREGISTRER SOUS/////////////////
    procedure TForm1.Sauvegardersous1Click(Sender: TObject);   //enregistrer sous
    begin
         Sauver.Execute;
         if(Sauver.FileName <> '') then
         begin
              sauvegardersous(Sauver.FileName);
              StatusBar1.Panels.Items[0].Text := tab[4] + Sauver.FileName;
         end;
     
    end;
    /////////////FIN PROCEDURE POUR ENREGISTRER SOUS/////////////////
     
    /////////////PROCEDURE DE SAUVEGARDE/////////////////
    procedure TForm1.Sauvegarder1Click(Sender: TObject);
    begin
         if sauvegarder = true then
            begin
                 sauvegardersous(nom_fichier);
            end
         else
             Sauver.Execute;
         if Sauver.FileName <> '' then
            begin
                 StatusBar1.Panels.Items[0].Text := tab[4] + Sauver.FileName;
                 sauvegardersous(Sauver.FileName);
            end
    end;
    /////////////FIN PROCEDURE DE SAUVEGARDE/////////////////
     
    ////////////ENREGISTRER SOUS//////////////
    procedure sauvegardersous(where_file: string);
    var
       i : Integer;
       my_file : Textfile;
    begin
         nom_fichier := where_file;
         AssignFile(my_file,where_file);
         ReWrite(my_file);
         sauvegarder := true;
         For i:=0 To Form1.ComponentCount-1 Do
             begin
     
               If Form1.Components[i] Is TImage Then
                  begin
                       Write(my_file,'#'+Form1.Components[i].Name);
                       Write(my_file,'#'+IntToStr(TImage(Form1.Components[i]).Left)+'#'+IntToStr(TImage(Form1.Components[i]).Top));
                  end
               else
                   Write(my_file,'['+Form1.Components[i].Name+']');
     
               Writeln(my_file,'');
             end;
         CloseFile(my_file);
    end;
    ////////////FIN ENREGISTRER SOUS///////////
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /////////////PROCEDURE POUR CREER IMAGE DU RESEAU/////////////////
    procedure TForm1.Imprimer1Click(Sender: TObject);
    begin
      ImageBureau.Bitmap.Width := Form1.Width-(ListBox1.Width+6);//la largeur du BitMap sera la même que celle de l'écran
      ImageBureau.Bitmap.Height := Form1.Height-(StatusBar1.Height+47);// idem pour la hauteur
      BitBlt(ImageBureau.Bitmap.Canvas.Handle,0,0,Form1.Width-(ListBox1.Width),Form1.Height-(StatusBar1.Height+1),
              GetDC(GetDesktopWindow),Form1.Left+3,Form1.top+46,SrcCopy);//recopie l'image du desktop vers ImageBureau
     
      if ImpEc.Execute then
      begin
           ImageBureau.SaveToFile(ImpEc.FileName + '.bmp');
           StatusBar1.Panels.Items[0].Text := tab[6];
      end;
    end;
    /////////////FIN PROCEDURE POUR CREER IMAGE DU RESEAU/////////////////

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Salut
    Euh question: pourquoi tu recrées Form1 dans Form1???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Form1:= TForm1.Create(Self);
    Il y a déjà un problème la-dessus:
    Ta Form1 est-elle en AutoCreate? Si non, tu es obligé de passer par une méthode de classe... Mais c'est franchement pas très propre avec ton code
    Non vraiment, je ne comprends pas cette ligne
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  3. #3
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut
    en effet je ne sais pas du tout ce que cette ligne viens faire la, je vais tester en la supprimer parce que a prioris on en a pas besoin. Et ma fois oui la form1 est en autocreate, enfin j'entend pas la quelle se créée toute seule au démarrage de l'application sans qu'on est besoin de lui demander.

    Mais est ce que cette ligne pourrais justement faire buguer mon application de cette façon?

    merci

    EDIT:
    en fait si je l'enleve il n'y a plus rien qui marche, le showmessage ne fonctionne plus c'est étrange :s, a mon avis elle sert a créer une form similaire a la précédent mais vierge!

  4. #4
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Salut
    Citation Envoyé par avogadro
    EDIT:
    en fait si je l'enleve il n'y a plus rien qui marche, le showmessage ne fonctionne plus c'est étrange :s, a mon avis elle sert a créer une form similaire a la précédent mais vierge!
    Ben oui:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    For i:=Form1.ComponentCount-1 DownTo 0 Do
          begin
               Form1.Components[i].Free;
          end;
    C'est d'ailleurs étonnant que ton appli ne plante pas puisque tu libères tous les contrôles de ta Form et tu les appelles après (StatusBar1 et Memo1)
    A vrai dire, je ne comprends pas bien cette portion de code T'es sûr qu'il n'y a pas eu un copier/coller malencontreux?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  5. #5
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut
    bah en fait, je créé des image sur la forme, quand je charge un autre fichier, il faut bien que mon application libere celle deja mise sur la form. J'avais procéder comme ça :s tu vois autres chose?

    EDIT : meme en metant ce petit bou de code en commentaire, apres avoir utilisé mon opendialog, il y a un probleme quand je veux chercher un bmp externe a l'application et l'afficher sur la form

  6. #6
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Citation Envoyé par avogadro
    bah en fait, je créé des image sur la forme, quand je charge un autre fichier, il faut bien que mon application libere celle deja mise sur la form. J'avais procéder comme ça :s tu vois autres chose?
    Le seul problème c'est qu'avec ta méthode, tu supprimes tous les composants de ta fiche
    Tu peux faire comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For i:=Form1.ComponentCount-1 DownTo 0 Do
      if Form1.Components[i] is TImage then
        Form1.Components[i].Free;
    De cette façon, seules les TImage seront suprrimées

    Citation Envoyé par avogadro
    EDIT : meme en metant ce petit bou de code en commentaire, apres avoir utilisé mon opendialog, il y a un probleme quand je veux chercher un bmp externe a l'application et l'afficher sur la form
    J'avoue que je ne comprends pas très bien. Explique un peu mieux ce que tu veux faire.
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  7. #7
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut
    bon bah en fait, si je ne touche pas a "opendialog", et que je prend juste "savedialog", bah ça me le fait aussi :s ma fonction qui me permet d'inserrer une image c'est ça, j'utilise des tableau pour inserrer des infos mais ça marche de ce coté là, c'est juste un probleme avec l'image :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    function CreerImage(name_img : string; position_left : integer = 0): integer;
    var
       i : integer;
    begin
         try
            for i := 0 to length(tab_image)-1 do
            begin
                 if(tab_image[i].left = position_left) then
                 position_left := position_left + tab_image[i].Width;
            end;
         finally
         SetLength(tab_image,length(tab_image)+1);
         tab_image[length(tab_image)-1] := TImage.Create(Form1);
         with tab_image[length(tab_image)-1] do
              begin
                   Parent := Form1;
                   Name := 'image' + IntToStr(length(tab_image));
                   picture.LoadFromFile('bmp\'+ name_img + '.bmp');
                   Visible := true;
                   Left := position_left;
                   AutoSize := true;
                   OnDragOver := Form1.ImageDragOver;
                   OnMouseDown := Form1.ImageMouseDown;
                   OnEndDrag := Form1.ImageEndDrag;
                   PopupMenu := Form1.PopupMenu1;
              end;
         result := length(tab_image)-1;
    end;
    je pense pas que ça puisse aider fin bon... a la limite je peux te procurer mon projet pour que tu jetes vite un coup d'oeil !

  8. #8
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Citation Envoyé par avogadro
    a la limite je peux te procurer mon projet pour que tu jetes vite un coup d'oeil !
    Non je voudrais juste que tu expliques en détail, et sans le code, que doit faire ton prog
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  9. #9
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut
    a la base c'est un créateur de réseau virtuel, j'ajoute un élément, un pc par exemple, je lui rentre des paramètres, nom, ip, dns ... et l'application me l'ajoute sur la form en allant chercher l'image de celui dans un dossier situé dans le dossier courant à l'application.

    Puis j'ai voulu mettre la fonction enregister sous qui m'enregistre les positions des images ainsi que les données du tableau pour pouvoir, lors de la réouvertir de ce dit fichier, il puisse me chargé un réseau enregistré...

    j'y avais aussi ajouté une petite option sympa qui me permetait de faire une image au format bmp d'un réseau créé, comme une utilisation ultérieur.

    Voila en bref ce qu'il peut faire, j'ai fait l'impasse sur certaines options que n'entre pas dans le problèmes... Je pense que ça a pu t'éclairer un peu

  10. #10
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    OK donc tu ajoutes chaque ordi virtuel sous la forme d'une image sur ton appli?
    Si c'est le cas, alors je te conseille de créer dynamiquement dès le début les TImage (l'idéal d'ailleurs serait de les dessiner directement sur le Canvas parce que les TImage sont hyper lourdes en ressources ) et de les référencer dans un TObjectList (unité contnrs).
    Pour les effacer, tu n'auras alors qu'à faire
    Ensuite, il vaudrait mieux créer une classe qui représentera un ordi.
    genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    TOrdi = class
    private
      FName: string;
      FIP: string;
      FDNS: string;
      FImageName: string;
    public
      property Name: string read FName write FName;
      property IP: string read FIP write FIP;
      property DNS: string read FDNS write FDNS;
      property ImageName: string read FImageName write FImageName;
      //etc.
    end;
    Par exemple...
    Dans cette classe, tu paramètres les propriétés correctement pour chaque ordi et tu dessines l'image de ImageName sur le Canvas de la fiche
    Et c'est cette classe que tu ajouteras dans la TObjectList...

    Voila, c'est un peu succint comme explications mais j'espère te montrer un peu la voie
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  11. #11
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut
    je sais pas si ça change beaucoup de choses mais je ne les dessine pas sur un canvas je les déponse comme ça un peu "a l'arache" sur la form

    j'utilise delphi 5 et je ne suis pas sur d'avoir le tobjectlist d'installé

    et tu crois que ton procédé peut régler se problème?? là c'est juste une gestion de la ressource...

    et utilisé une imagelist pour les stocker dedans ne changerais rien je pense?

  12. #12
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Citation Envoyé par avogadro
    je sais pas si ça change beaucoup de choses mais je ne les dessine pas sur un canvas je les déponse comme ça un peu "a l'arache" sur la form
    Tu utilises donc toutes les ressources inutiles d'une TImage
    Citation Envoyé par avogadro
    j'utilise delphi 5 et je ne suis pas sur d'avoir le tobjectlist d'installé
    Ah Ca je ne sais pas par contre
    Citation Envoyé par avogadro
    et tu crois que ton procédé peut régler se problème?? là c'est juste une gestion de la ressource...
    Non c'est plus que ça, c'est repenser ta méthode J'imagine que tu enregistre tes données d'ordi dans un Record, ben maintenant fais-le avec une classe
    Pour moi, le problème vient de ton architecure pas réellement du code, même s'il y a effectivement un bug :p
    Citation Envoyé par avogadro
    et utilisé une imagelist pour les stocker dedans ne changerais rien je pense?
    Le "problème" c'est qu'il ne peut enregistrer que des images de même taille... Alors que si tu déclares un type TBitmap dans la class TOrdi qui contiendra l'image à afficher, tu pourras avoir n'importe quelle taille

    Maintenant, c'est la méthode que j'utiliserais. Je ne sais pas si c'est la meilleure, mais c'est, pour moi, la plus propre et celle qui offre le plus de possibilité facilement Rien ne t'oblige à faire ce que je t'ai dit C'est juste un conseil
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  13. #13
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut
    merci beaucoup pour ton aide je vais voir ce que je peux faire... c'est a rendre pour demain hehe, peut etre qu'en donnant comme un taré il y a moyen, faut voir ^^

  14. #14
    Membre éclairé Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Par défaut
    je suis trop con pédro ^^ en fait quand tu enregistre n'importe quoi, ou que tu ouvre n'importe quoi, le chemin par defaut change, il faut donc utiliser la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extractfilepath(application.exename)
    pour la fonction creerimage :]

    hehe voila !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. utiliser un programme apres l'avoir decompressé
    Par bracket dans le forum Linux
    Réponses: 9
    Dernier message: 17/11/2009, 09h28
  2. [dll] libérer une dll apres utilisation
    Par polo54 dans le forum API standards et tierces
    Réponses: 12
    Dernier message: 11/07/2009, 22h48
  3. "Access violation" apres utilisation des compos BD
    Par bahaa dans le forum Bases de données
    Réponses: 1
    Dernier message: 06/10/2005, 07h59
  4. Lancer automatiquement un programme après connexion Internet
    Par sunshine dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 27/05/2005, 22h18
  5. [FB] installation et apres? utilisation ???
    Par vad dans le forum Débuter
    Réponses: 7
    Dernier message: 17/02/2005, 09h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo