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 :

Tbitmap et File


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Par défaut Tbitmap et File
    Bonjours à tous

    Je voudrais faire un programme qui garde en mémoire un String et un TBitmap.
    Sans le TBitmap, delphi compile sans erreurs :

    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
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TDonnee_en_Memoire = record
        nom : string[20];
      end;
      TForm1 = class(TForm)
        Edit1: TEdit;
        procedure FormCreate(Sender: TObject);
        procedure Edit1Change(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      F : File of TDonnee_En_Memoire;
      Donnee : TDonnee_en_Memoire;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      AssignFile(F,'C:\Memoire.donnee');
      {$I-}
        Reset(F);
      {$I+}
      If IOresult = 0 then
      begin
        Read(F,donnee);
        Edit1.Text:=donnee.nom;
      end;
    end;
     
    procedure TForm1.Edit1Change(Sender: TObject);
    begin
      donnee.nom:=Edit1.Text;
      Rewrite(F);
      Write(F,Donnee);
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      CloseFile(F);
    end;
     
    end.
    mais dès que je rajoute un TBitmap, delphi m'envoie un message d'erreur.

    Voici le code après le rajout d'un TBitmap:

    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
     
    TDonnee_en_Memoire = record
        nom : string[20];
        Image : TBitmap;
      end;
     
    ……
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      AssignFile(F,'C:\Memoire.donnee');
      {$I-}
        Reset(F);
      {$I+}
      If IOresult = 0 then
      begin
        donnee.Image:=TBitmap.Create;
        Read(F,donnee);
        Edit1.Text:=donnee.nom;
        Image1.Picture.Bitmap:=Donnee.Image;
      end;
    end;
     
    …..
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      CloseFile(F);
      Donnee.Image.Free;
    end;
    Et cela fait la même chose si, à la place du TBitmap, je mets un tableau(à 1 dimension)!

    Pourriez-vous me donner une réponse qui résoudrait ces 2 problèmes ?

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    c'est normal, le bitmap est une classe objet, sous Delphi c'est donc un pointeur. Tu sauvegardes dans ton fichier non pas le contenu du bitmap mais son adresse en mémoire. Relire se fichier te donne une adressse qui n'a plus aucune signification.

    cf TFileStream et TBitmap.SaveToStream
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre expérimenté Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Par défaut
    Pourriez-vous me donner un exemple car même en cherchant, je n'y arrive pas!

    Voici mon code qui permet de garder en mémoire un TBitmap(qui ne marche) :

    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
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtDlgs, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Image1: TImage;
        OpenPictureDialog1: TOpenPictureDialog;
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      FileStream,FileStream2 : TFileStream;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      With OpenPictureDialog1 do
      begin
        Execute;
        if FileName <> '' then Image1.Picture.Bitmap.LoadFromFile(Filename);
      end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      try
        FileStream:=TFileStream.Create('C:\Stream.Str',fmCreate);
      Finally
        FileStream.Free;
      end;
      FileStream2:=TFileStream.Create('C:\Stream.Str',fmOpenReadWrite);
      Image1.Picture.Bitmap.LoadFromStream(FileStream2);
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      FileStream2.Free;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      Image1.Picture.Bitmap.SaveToStream(FileStream2);
    end;
     
    end.

  4. #4
    Membre expérimenté Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Par défaut
    En fait, en cherchant encore plus, j'ai trouvé la solution :

    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
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, ExtDlgs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Image1: TImage;
        Button1: TButton;
        OpenPictureDialog1: TOpenPictureDialog;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Déclarations privées }
        F : TFileStream;
     
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      F:=TFileStream.Create('c:\Steam.bmp',fmCreate and fmOpenReadWrite);
      F.Position:=0;
      Image1.Picture.Bitmap.LoadFromStream(F);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      With OpenPictureDialog1 do
      begin
        Execute;
        if FileName <> '' then Image1.Picture.Bitmap.LoadFromFile(FileName);
        F.Position:=0;
        Image1.Picture.Bitmap.SaveToStream(F);
      end;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      F.Free;
    end;
     
    end.
    Le seul problème, c'est que quand on le créé, delphi ne trouve pas l'emplacement du fichier.

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    14 ans ? pas mal

    bon tu as quelques confusions dans ton code.

    1) Button1 ouvrir la boîte de dialogue qui permet de sélectionne le fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Sous cette forme on sait qu'un fichier a été sélectionné !
      if OpenPictureDialog1.Execute then
      begin
       ...
      end;
    2) tu as un nom de fichier, tu peux directement lire le Bitmap
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      if OpenPictureDialog1.Execute then
      begin
        Image1.Picture.Bitmap.LoadFromFile(OpenPictureDialog1.FileName);
      end;
    c'est tout ! en faut le TFileStream n'est pas utile dans ce cas, puisque tu lis directement un fichier BMP

    mais si dans ton fichier tu veux stocker d'autres choses que ton Bitmap - ce que laisse penser ton premier message - tu dois passer par un flux.

    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
     
    var
      nom: string[20];
      flux: TFileStream;
    begin
      if OpenPictureDialog1.Execute then
      begin
       flux := TFileStream.Create(OpenPictureDialog1.FileName, fmOpenRead);
       try
        // le flux est crée avec Position = 0, pas la peine de le forcer
          flux.Read(nom, SizeOf(nom));
          Image1.Picture.Bitmap.LoadFromStream(flux);
       finally
         flux.Free;
       end;
      end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre expérimenté Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Par défaut
    Merci beaucoup pour le compliment!

    En fait, c'était simplement un essai(ce serait plus rapide avec un File) mais dans mon vrai projet, je voudrais garder en mémoire un TBitmap créé durant l’exécution(donc qui n'a pas de chemin) et c'est pour ça que j'utilisais un File à tort. Pourriez-vous m'éclairer sur le sujet?

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/07/2003, 14h59
  2. passer FILE* en argument d une fonction
    Par Monsieur_Manu dans le forum C
    Réponses: 9
    Dernier message: 10/04/2003, 17h56
  3. [File et Directory ListBox] Soucis de filtre
    Par Mercilius dans le forum Composants VCL
    Réponses: 8
    Dernier message: 04/04/2003, 16h17
  4. A propos des 'File management Functions' de Windows
    Par znaidi dans le forum Windows
    Réponses: 3
    Dernier message: 01/04/2003, 16h01
  5. recupèrer file d'attente d'impression
    Par magic corp. dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2002, 14h12

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