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

Langage Delphi Discussion :

image1.Picture.Graphic.LoadFromStream(ms) : Erreur ! etc !


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut image1.Picture.Graphic.LoadFromStream(ms) : Erreur ! etc !
    Bon a priori rien de bien difficile sauf que je rencontre une difficulté avec le fait que le Tstream contient le texte d un memo.
    Quand je dis texte je veux parler de ce qui s affiche dans un memo quand on ouvre une image...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var
      ms: TMemoryStream;
    begin
      ms := TMemoryStream.Create;
      try
        Memo1.Lines.savetostream(ms);
        ms.Seek(0, soFromBeginning);
        image1.Picture.Graphic.LoadFromStream(ms);
      finally
        ms.Free;
      end;
    end;
    merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    quelle drôle d'idée !

    probablement un problème avec les fins de lignes, voir avec la caractères nulls.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    Lorsque j'ouvre une image avec NotePad, cela ne donne pas grand chose, tu perds tous les caractères non imprimables ! c'est génant !
    As-tu essayé d'ouvrir un Bitmap avec Notepad, et juste l'enregistrer de nouveau ? résultat : Bitmap corrompu !

    Tu ne peux pas ouvrir un Binaire en mode Texte, ce n'est pas du tout compatible, c'est pour cela qu'il y a des editeurs Hexadécimaux comme UltraEdit !

    tu ne confonds pas avec l'encodage en base64 d'un TImage dans une DFM ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut
    je ne confonds pas, je decouvre ;-)

    En fait la finalité est fort simple.

    Je sais fermer mon appli en sauvegardant un timage par exemple si j ai declaré son nom.

    Mais comme je ne sais pas combien j ai finalement de timage (puisque crees dynamiquement ) je ne peux pas le faire.

    Mon idéee, peut etre erronée etait de sauvegarder l image sous forme de texte dans un Tmemo puis à l ouverture de l appli convertir ce tmemo en image.

    je pourrais cfreer des timage vides et les 'remplir' au fur à mesure et tous les sauvegarder (même les vides) mais je ne pense pas non plus que ce soit la bonne solution...

    je cherche...J ai bien trouvé cela (pas testé encore) mais que pour bmp, je poursuis pour jpeg, png etc

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    ..
    const
      BPP = 8; //Note: BYTES per pixel
     
    {---------------------------------------------------------}
    function BitmapToString(Bitmap: TBitmap): String;
    var
      x, y: Integer;
      S: String;
     
    begin
      S := '';
      for y := 0 to Bitmap.Height-1 do
        begin
          for x := 0 to Bitmap.Width-1 do
            begin
              S := S + IntToHex(Bitmap.Canvas.Pixels[x,y], BPP);
            end;
          S := S + '\';
        end;
      Result := S;
    end;
    {---------------------------------------------------------}
    function StringToBitmap(S: String): TBitmap;
    var
      Bitmap: TBitmap;
      Line: String;
      P: Integer;
      x, y: Integer;
     
    begin
      Bitmap := TBitmap.Create;
      P := pos('\', S);
      Bitmap.Width := P div BPP;
      Bitmap.Height := 1;
     
      Line := Copy(S, 1, P-1);
      Delete(S, 1, P);
      x := 0;
      y := 0;
     
      While P <> 0 do
        begin
          if length(Line) <> 0 then
            begin
              Bitmap.Canvas.Pixels[x, y] := StrToInt('$' + Copy(Line, 1, BPP));
              Delete(Line, 1, BPP);
              inc(x);
            end
          else
            begin
              P := pos('\', S);
              Line := Copy(S, 1, P-1);
              Delete(S, 1, P);
              inc(y);
              Bitmap.Height := y+1;
              x := 0;
            end;
        end;
      Bitmap.Height := Bitmap.Height - 1;
      Result := Bitmap;
    end;
    {---------------------------------------------------------}
    procedure TForm1.Button1Click(Sender: TObject);
    var
      S: String;
    begin
      S := BitmapToString(Image1.Picture.Bitmap);
      Image2.Picture.Bitmap := StringToBitmap(S);
    end;

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    il y a une solution simple, mettre tous les bitmaps dans un seul fichier...ou créer autant de fichier que de bitmap

    démonstration:
    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
     
    var
      f: TFileStream;
    begin
    // si le fichier test.bps existe
      if FileExists('test.bps') then
      begin
      // lire les bitmaps, on pourrait tester que f est en fin de flux pour savoir
      // s'il existe encore un bitmap dedans et faire une boucle de lecture
        f := TFileStream.Create('test.bps', fmOpenRead);
        Image1.Picture.Bitmap.LoadFromStream(f);
        Image2.Picture.Bitmap.LoadFromStream(f);
      end else begin
      // pour l'exemple on va créer deux bitmaps bidons
      // et les enregistrer dans un seul et même fichier
        Image1.Canvas.TextOut(0,0,'Image1');
        Image2.Canvas.TextOut(0,0,'Image2');
        f := TFileStream.Create('test.bps', fmCreate);
        Image1.Picture.Bitmap.SaveToStream(f);
        Image2.Picture.Bitmap.SaveToStream(f);
      end;
      f.Free;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 330
    Points
    11 330
    Billets dans le blog
    6
    Par défaut
    Je sais fermer mon appli en sauvegardant un timage par exemple si j ai declaré son nom.
    si tu ajoutes tes TImage dynamiques dès leur création à un TObjectList, il te suffit de balayer les items de la liste pour savoir qui sauver, même si ces variables n'ont pas de 'nom' puisque tu conserves un pointeur dessus.

    tu peux même fixer leur Owner comme étant la fiche, parcourir les composants de la fiche, tester si ce sont des TImage, et sauver si c'est le cas.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    si tu ajoutes tes TImage dynamiques dès leur création à un TObjectList, il te suffit de balayer les items de la liste pour savoir qui sauver, même si ces variables n'ont pas de 'nom' puisque tu conserves un pointeur dessus.

    tu peux même fixer leur Owner comme étant la fiche, parcourir les composants de la fiche, tester si ce sont des TImage, et sauver si c'est le cas.

    je te remercie, je vais voir c que j arrive à faire...

  8. #8
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Bonjour,

    Citation Envoyé par sp2308 Voir le message
    En fait la finalité est fort simple.
    Je sais fermer mon appli en sauvegardant un timage par exemple si j ai declaré son nom.
    Mais comme je ne sais pas combien j ai finalement de timage (puisque crees dynamiquement ) je ne peux pas le faire.
    Mon idéee, peut etre erronée etait de sauvegarder l image sous forme de texte dans un Tmemo puis à l ouverture de l appli convertir ce tmemo en image.
    Si je t'ai bien compris, tu ne veux que sauvergarder l'interface utilisateur.
    Si c'est le cas, tu peux mettre toutes tes TImages en flux (c'est un peu ce que tu voulais faire dans un Memo, mais de façon plus orthodoxe).
    Imaginons que les TImages soient toutes dans ScrollBox1 et que tu les aies créées avec ScrollBox1 comme Owner (très important !).
    Il suffit de mettre ce TScrollBox en flux pour pouvoir le récupérer au prochain lancement (ainsi que toutes les TImages dont il est le Owner) :


    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
    procedure TForm1.FormCreate(Sender: TObject);
      begin
      if FileExists('Images') then begin
         ReadComponentResFile('Images', ScrollBox1);
         ScrollBox1.Parent := Self;
      end;
    end;
     
    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
      begin
      if MessageDlg('Sauvegarder les images?',mtConfirmation,[mbYes,mbNo],0)=mrYes
        then if assigned(ScrollBox1) 
            then WriteComponentResFile('Images',ScrollBox1);
    end;
     
     
    initialization
      RegisterClass(TImage);
    finalization
     
    END.

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par Caribensila Voir le message
    Bonjour,



    Si je t'ai bien compris, tu ne veux que sauvergarder l'interface utilisateur.
    Si c'est le cas, tu peux mettre toutes tes TImages en flux (c'est un peu ce que tu voulais faire dans un Memo, mais de façon plus orthodoxe).
    Imaginons que les TImages soient toutes dans ScrollBox1 et que tu les aies créées avec ScrollBox1 comme Owner (très important !).
    Il suffit de mettre ce TScrollBox en flux pour pouvoir le récupérer au prochain lancement (ainsi que toutes les TImages dont il est le Owner) :


    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
    procedure TForm1.FormCreate(Sender: TObject);
      begin
      if FileExists('Images') then begin
         ReadComponentResFile('Images', ScrollBox1);
         ScrollBox1.Parent := Self;
      end;
    end;
     
    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
      begin
      if MessageDlg('Sauvegarder les images?',mtConfirmation,[mbYes,mbNo],0)=mrYes
        then if assigned(ScrollBox1) 
            then WriteComponentResFile('Images',ScrollBox1);
    end;
     
     
    initialization
      RegisterClass(TImage);
    finalization
     
    END.
    ça c'est une fausse bonne idée, car le format du flux est dépendant de la version de Delphi.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    ça c'est une fausse bonne idée, car le format du flux est dépendant de la version de Delphi.

    Je ne sais pas si je te comprends bien, Paul...

    Veux-tu dire que le fichier ne sera pas exploitable par une autre application codée avec une autre version de Delphi ?
    Mais est-ce si gênant que ça si on considère que c'est une sorte de fichier.ini qui ne sert qu'à l'intérieur de l'application qui l'a créé ?

    Ou je t'ai sans doute mal compris... Peux-tu m'éclairer, s'il te plaît ?

  11. #11
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par Caribensila Voir le message
    Je ne sais pas si je te comprends bien, Paul...

    Veux-tu dire que le fichier ne sera pas exploitable par une autre application codée avec une autre version de Delphi ?
    Mais est-ce si gênant que ça si on considère que c'est une sorte de fichier.ini qui ne sert qu'à l'intérieur de l'application qui l'a créé ?

    Ou je t'ai sans doute mal compris... Peux-tu m'éclairer, s'il te plaît ?
    WriteComponentRes utilise les RTTI pour stocker les propriétés des objets, avec une nouvelle version de Delphi tu as des propriétés en plus (normalement pas en moins), mais il suffit que la nouvelle version de Delphi passe en UTF8, en Unicode, ajoute une compression ou que sais-je pour que le format soit totalement différent et le fichier inexploitable.

    Si l'application sauvegarde des données, c'est qu'à priori elles sont nécessaires, il serait dommage de ne pouvoir les lire suite à une mise à jour du programme qui serait compilé avec une nouvelle version de Delphi.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #12
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Ok. Je comprends.
    On sent bien le souci de maintenace du profesionnel !

    C'est dommage, je trouvais le truc sympa pour sauvegarder une interface utilisateur...
    Merci pour tes précisions.

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

Discussions similaires

  1. introduction au traitement d'erreur (sur erreur etc .)
    Par emulien dans le forum VBA Access
    Réponses: 1
    Dernier message: 15/05/2015, 07h57
  2. [Généralités] Pratiques de codage, gestion d'erreurs, etc..
    Par Kazuko dans le forum WinDev
    Réponses: 10
    Dernier message: 10/12/2012, 08h23
  3. Erreur /etc/oratab n'est pas accessible
    Par Fatimaaa dans le forum Installation
    Réponses: 5
    Dernier message: 23/06/2009, 14h47
  4. Réponses: 4
    Dernier message: 20/08/2006, 16h20
  5. msaccess.exe a généré des erreurs etc...
    Par stigma dans le forum Access
    Réponses: 2
    Dernier message: 13/04/2006, 08h03

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