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 :

Copie d'un champ blob dans Word


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 287
    Par défaut Copie d'un champ blob dans Word
    Bonjour,

    Je voudrais copier le contenu d'un champ blob d'une base de données dans un fichier word. Le contenu du champ provient d'un éditeur
    Le code suivant fonctionne très bien avec du texte, par contre le fonctionne plus dès qu'il y a une image

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    lClipBoard := Clipboard();
    FormatRTF := RegisterClipboardFormat('Rich Text Format');
    lClipboard.hasformat(FormatRTF);
    CopyToClipboard(lClipBoard, <contenu du champ>, FormatRTF);
    <copie dans word>
    Merci de votre aide

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 287
    Par défaut
    J'oubliais un bout

    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
     
    procedure TFRMComponent.CopyToClipboard(var LClipboard : TClipboard; Text : string; CFormat : word);
    var
      MemHandle: THandle;
      rtfstring: PChar;
    begin
      with LClipboard do
      begin
        rtfstring := PChar(text);
        MemHandle := GlobalAlloc(GHND or GMEM_SHARE, StrLen(rtfstring) + 1);
        if MemHandle <> 0 then
        begin
          StrCopy(GlobalLock(MemHandle), rtfstring);
          GlobalUnlock(MemHandle);
          Open;
          try
            AsText := '1244444';
            SetAsHandle(CFormat, MemHandle);
          finally
            Close;
          end;
        end
        else
          MessageDlg('Global Alloc failed!',
            mtError, [mbOK], 0);
      end;
    end;

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    'Soir,

    moi y a ça qui m'intrigue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    try
      AsText := '1244444';
    parce que l'aide Delphi dit :
    La propriété AsText permet d'introduire un texte dans le presse-papiers et de l'en extraire
    Faudrait p'têt' chercher du côté de la propriété "Formats"...

    Et que donne la copie du presse-papiers à la mano dans Word, une fois que ton prog a tourné ?

    Mes 2 cts,
    --
    jp

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 287
    Par défaut
    bon j'ai trouve.

    Déjà pour répondre à ta question Astext c'est pour mes tests.
    Le code fonctionne avec du texte simple, par contre dans certain cas, j'ai des images et là ca ne marche plus (pb format du presse-papier).

    La solution trouvée est de passer par un stream, je mets le contenu de mon champs dans un stream, et ensuite copie du stream dans le presse papier

    Ci dessous le code

    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
    procedure TFRMComponent.CopyStreamToClipboard(Cformat: word; S: TStream);
    var
      hMem: THandle;
      pMem: Pointer;
    begin
      Assert(Assigned(S));
      S.Position := 0;
      hMem := GlobalAlloc(GHND or GMEM_DDESHARE, S.Size);
      if hMem <> 0 then 
      begin
        pMem := GlobalLock(hMem);
        if pMem <> nil then 
        begin
          try
            S.Read(pMem^, S.Size);
            S.Position := 0;
          finally
            GlobalUnlock(hMem);
          end;
          Clipboard.Open;
          try
            Clipboard.SetAsHandle(Cformat, hMem);
          finally
            Clipboard.Close;
          end;
        end { If }
        else 
        begin
          GlobalFree(hMem);
          OutOfMemoryError;
        end;
      end { If }
      else
        OutOfMemoryError;
    end; { CopyStreamToClipboard }

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 17/03/2011, 14h12
  2. mettre a jour un champ BLOB dans une BD distante
    Par zaineb.z dans le forum SQL
    Réponses: 3
    Dernier message: 29/02/2008, 18h23
  3. Réponses: 1
    Dernier message: 07/01/2006, 23h33
  4. Mettre un champ Blob dans un Group By
    Par WebPac dans le forum SQL
    Réponses: 1
    Dernier message: 17/08/2005, 18h03
  5. Affectation d'un champs blob dans une var de type TStrings
    Par Andry dans le forum Bases de données
    Réponses: 1
    Dernier message: 16/03/2005, 18h26

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