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 .NET Discussion :

VCL.Net Transfert Bitmap vers fichier RTF [Trucs & Astuces]


Sujet :

Delphi .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 30
    Par défaut VCL.Net Transfert Bitmap vers fichier RTF
    Je rencontre des problèmes pour transférer un Bitmap vers un fichier RTF. J'utilisai précédemment une procédure pour Win32 qui n'est malheureusement plus compatible en .NET.

    Quelqu'un a-t-il une solution pour ce problème?

    Merci d'avance

    Emmanuel

  2. #2
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Juillet 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 128
    Par défaut
    Bonjour,

    Heu tu utilisais quelle procédure ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 30
    Par défaut
    Une méthode qui consistait a placer le contenu du bitmap dans un metafile, puis à sauvergarder le métafile pour ensuite utiliser une procédure d'insersion de ce fichier.
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    procedure TRtfFile.AddBitmap(Bitmap : TBitmap; ScaleValue : integer);
    var
      HMF : TMetaFile;
      MFC : TMetaFileCanvas;
      HRect : TRect;
    begin
      HMF:=TMetafile.Create;
      try
        HMF.Width:=Bitmap.Width;
        HMF.Height:=Bitmap.Height;
        MFC:=TMetafileCanvas.Create(HMF,0);
        try
          HRect.Top:=0;
          HRect.Left:=0;
          HRect.Right:=1200;
          HRect.Bottom:=1200;
          MFC.Draw(0,0,Bitmap);
        finally
          MFC.Free;
        end;
        HMF.SaveToFile('Temp.wmf');
        try
          AddMetaFile('Temp.wmf',ScaleValue);
       finally
          DeleteFile('Temp.wmf');
        end;
      finally
        HMF.Free;
      end;
    end;
     
     
    procedure TRtfFile.AddMetaFile(wmfname: string; ScaleValue: single);
    var
      wmf: file;
      PString : Pchar;
      ByteStr: array[1..3] of byte;
      i, numread: integer;
      block: array[1..128] of byte;
      dummy1: array[1..6] of byte;
      dummy2: array[1..8] of byte;
      x, y: word;
      x1, y1: word;
      WOverH : double;
      DoelW, DoelH : double;
    begin
      assign(wmf, wmfname);
      PString := StrAlloc(256);
      try
        reset(wmf, 1);
     
        { header lesen }
        blockread(wmf, dummy1, 6);
        blockread(wmf, x1, 2); { obere, linke Ecke, immer 0 }
        blockread(wmf, y1, 2);
        blockread(wmf, x, 2); { untere, rechte Ecke, immer 0 }
        blockread(wmf, y, 2);
        blockread(wmf, dummy2, 8);
        WriteText('{\pict\wmetafile8');
     
        if Word2000Rtf then
         begin
          if ScaleValue < 0 then
           begin
            DoelW := x * 5.67  * abs(ScaleValue) / 300;
            DoelH := y * 5.67  * abs(ScaleValue) / 300;
           end
          else
           begin
            WOverH := x / y;
            DoelW := fWidth - fLeftMargin - fRightMargin - 0.5;
            DoelH := DoelW / WOverH;
            if DoelH > fHeight - fUpperMargin - fLowerMargin - 3 then
             begin
              DoelH := fHeight - fUpperMargin - fLowerMargin - 3;
              DoelW := DoelH * WoverH;
             end;
           end;
           if (DoelW > 31.5) then
            begin
             WOverH := DoelW / DoelH;
             DoelW := 31.5;
             DoelH := DoelW / WOverH;
            end;
           if (DoelH > 31.5) then
            begin
             WOverH := DoelW / DoelH;
             DoelH := 31.5;
             DoelW := DoelH * WOverH;
            end;
           WriteText('\picw' + IntToStr(round(DoelW * 1000)));
           WriteText('\pich' + IntToStr(round(DoelH * 1000)));
         end
        else
         begin
          WriteText('\picwgoal' + IntToStr(round(x * 5.67 * abs(ScaleValue))));
          WriteText('\pichgoal' + IntToStr(round(y * 5.67 * abs(ScaleValue))));
         end;
     
        WriteTextLn('');
     
         repeat
          blockread(wmf, block, 127, Numread);
          StrCopy(PString, '');
          for i := 1 to numread do
          begin
            StrPCopy(@ByteStr, DecToHex(block[i]));
            StrCat(PString, @ByteStr);
          end;
          WriteTextLn(StrPas(PString));
        until eof(wmf) or (Numread < 127);
      except
        on exception do
          ShowMessage('WMF-bestand kan niet worden ingelezen.');
      end;
      close(wmf);
      StrDispose(PString);
      WriteTextLn('}');
    end;
    Mais bien entendu ces procédure sont non utilisables dans VCL.Net

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par emmanuelc
    Mais bien entendu ces procédure sont non utilisables dans VCL.Net
    Il te faut les adapter.

    Quelles sont celles qui pose pb ? et pour quelles raisons ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 30
    Par défaut
    Bonjour.

    Tout d'abord, il n'est plus possible d'utiliser des variables PChar et File.

    Bien entendu les procédures dérivées telles que StrAlloc ou blockread, StrCopy,... ne fonctionnent pas.

    Je sais bien que programmer avec VCL.Net ne me permet plus directement d'utiliser des fichiers binaires de la même façon qu'avec Win32. J'ai bien trouvé des méthodes pour malgré tout utiliser des fichiers binaires mais dans le cas précis qui m'occupê, cela me semble assez fastitieux. Je suppose qu'il existe une méthode plus directe.

    J'ai également essayé d'autres types de procédures mais ces dernières utilisaient des pointeurs non souhaitables avec VCL.Net.

  6. #6
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Juillet 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 128
    Par défaut
    Pourquoi ne pas utiliser Interop ? Ce qui te permettrait d'appeler du code Win32 à partir de ton code .Net ?

    Ta procédure est enregistrée dans une dll win32 et est appelé par ton code .Net.

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

Discussions similaires

  1. Transfert msflexgrid vers fichier txt
    Par avyrex dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 12/04/2009, 15h34
  2. [vb.net] transfert d'une table SQL-Servr vers un fichier texte
    Par nkonito dans le forum Windows Forms
    Réponses: 1
    Dernier message: 25/05/2006, 04h36
  3. [VB.Net] Transfert de fichier local vers serveur
    Par geros dans le forum ASP.NET
    Réponses: 4
    Dernier message: 13/02/2006, 15h14
  4. [VB.NET] ouverture d'un fichier rtf doc ou autre
    Par lucie.houel dans le forum ASP.NET
    Réponses: 5
    Dernier message: 23/11/2005, 16h45
  5. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40

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