none
Transférer un objet complexe par le clipboard RRS feed

  • Question

  • Bonjour,

    Dans une appli WinForm en VB.Net, sous VS 2010, je souhaite placer des données dans le clipboard afin qu'elle puissent être ensuite collées dans un document Word.

    C'est facile lorsqu'il s'agit d'une image ou d'un texte seul. Par exemple :

            Dim Dt As New DataObject
    
            Dt.SetData(DataFormats.Bitmap, True, <un bitmap>)
            Clipboard.SetDataObject(Dt)
    

    Mais comment faire avec un objet plus complexe qui contienne à la fois plusieurs images ET plusieurs textes ?

    Merci de vos suggestions.

    Cordialement


    Alain

    mardi 16 octobre 2012 14:20

Réponses

  • Bonjour,

    Il est très difficile de générer du code RTF (essayez de prendre Word avec un document simple et enregistrez le au format RTF pour voir le contenu via Notepad...).
    Si votre besoin est de générer un contenu RTF, le moyen le plus simple est d'utiliser un RichTextBox (par programmation) que vous pilotez en ajoutant le texte et les images nécessaires.

    Ensuite sélectionnez le tout et récupérer le contenu au format "RTF" via la propriété SelectedRtf du RichTextBox.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    • Marqué comme réponse AchLog mercredi 17 octobre 2012 15:00
    mercredi 17 octobre 2012 12:44
    Modérateur

Toutes les réponses

  • Bonjour,

    Il suffit de mettre du contenu RTF dans le presse papier. (cf. la constante DataFormats.Rtf).

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mardi 16 octobre 2012 15:09
    Modérateur
  • Merci Gilles pour votre réponse,

    Mais comment mettre images plus textes en RTF, j'avoue que je ne vois pas ? Plusieurs SetData successifs ?

    Un petit exemple ?

    Merci


    Alain

    mardi 16 octobre 2012 19:07
  • Bonjour,

    Non, il faut mettre du code RTF directement dans le SetData().
    Comment avez vous les images et le texte ? Est-ce qu'elles sont dans des fichiers ? Variables ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mercredi 17 octobre 2012 09:02
    Modérateur
  • Je ne sais pas coder en RTF.

    L'image est un bitmap construit par programme. Le texte également.

    Comment réaliser une mise en page d'un document RTF, par exemple en plaçant le texte à coté de l'image ou, plus simplement en dessous ?

    Existe t-il aussi la possibilité de construire un tableau RTF et de placer du texte dans les cellules ?

    Le but : Le programme construit un (petit) document RTF et le place dans le presse papier. Ensuite l'utilisateur ouvre un document Word et colle le presse papier dedans.

    Merci de votre aide


    Alain

    mercredi 17 octobre 2012 09:50
  • Bonjour,

    Dans ce cas n'est-il pas intéressant de piloter Word (via VB.NET) pour réaliser votre document ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mercredi 17 octobre 2012 10:49
    Modérateur
  • Peut-être mais, d'une part le document Word peut être pré-existant et l'endroit où doivent être insérées les nouvelles informations indéterminé et,d'autre part, je ne peux cibler uniquement Word, il faut aussi compter avec d'autres logiciels +/- compatibles. RTF me paraît être le bon compromis.

    Qu'en pensez-vous ?

    La construction par programme d'un document en RTF est-elle vraiment complexe ?

    Cordialement


    Alain

    mercredi 17 octobre 2012 11:38
  • Bonjour,

    Il est très difficile de générer du code RTF (essayez de prendre Word avec un document simple et enregistrez le au format RTF pour voir le contenu via Notepad...).
    Si votre besoin est de générer un contenu RTF, le moyen le plus simple est d'utiliser un RichTextBox (par programmation) que vous pilotez en ajoutant le texte et les images nécessaires.

    Ensuite sélectionnez le tout et récupérer le contenu au format "RTF" via la propriété SelectedRtf du RichTextBox.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    • Marqué comme réponse AchLog mercredi 17 octobre 2012 15:00
    mercredi 17 octobre 2012 12:44
    Modérateur
  • Ok Gilles, merci de ces informations. Je vais donc tenter de suivre cette piste.

    Bien cordialement


    Alain

    mercredi 17 octobre 2012 15:00
  • P.S. Je sais placer du texte dans un RichTextBox mais pas avec des images. Y a-t-il, à votre connaissance, un tutoriel ou un exemple là-dessus ?

    Merci


    Alain

    mercredi 17 octobre 2012 15:02
  • Bonjour,

    Apparement la seule possibilité d'injecter une image (de manière simple) est de faire un copier de l'image dans le presse-papier et de faire un coller dans le RichTextBox.

    Encore mille excuses de ne pas avoir trouvé une solution plus simple et plus propre.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mercredi 17 octobre 2012 15:37
    Modérateur
  • Merci

    Cordialement


    Alain

    mercredi 17 octobre 2012 16:36
  • J'ai testé l'insertion de d'images et de textes dans un RichTextBox puis la copie de celui-ci dans le ClipBoard.

    Ça fonctionne bien mais je constate qu'il faut d'abord générer tout le texte et ensuite seulement insérer les images au bons endroits dans le texte. Si on insère du texte après avoir placé une image dans le contrôle, elle est perdue.

    Voici un exemple

        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim Dt As New DataObject
            Dim index As New List(Of Integer)
    
            ' Construire un bitmap et initialiser le Bacground color
            Dim bmp As New Bitmap(200, 100)
            Graphics.FromImage(bmp).FillRectangle(New SolidBrush(Color.Chocolate), New Rectangle(0, 0, bmp.Width, bmp.Height))
    
            '-- Copier le texte dans le RTB
            index.Add(0)				' Index insertion image
            For i As Integer = 1 To 9
                Dim str As String = ControlChars.NewLine + "ligne 1." + i.ToString
                Rtb.Text += str
            Next
            Rtb.Text += ControlChars.NewLine + ControlChars.NewLine + ControlChars.NewLine
    
            index.Add(Rtb.Text.Length + 1)		' Index insertion image
            For i As Integer = 1 To 9
                Dim str As String = ControlChars.NewLine + "ligne 2." + i.ToString
                Rtb.Text += str
            Next
    
            '-- Insérer le graphique dans le RTB
            Dt.SetData(DataFormats.Bitmap, True, bmp)
            Clipboard.SetDataObject(Dt)                 ' Copier le graphique dans le ClipBoard
    
            For Each i As Integer In index
                Rtb.Select(i, 0)
                Rtb.Paste()                             ' Insérer le graphique dans le RTB
            Next
    
            '-- Placer le RTB dans le ClipBoard
            Dt.SetData(DataFormats.Rtf, True, Rtb.Rtf)
        End Sub
    


    Alain

    jeudi 18 octobre 2012 17:02