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 :

Accès "avancé" au presse-papier sous Wine


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut Accès "avancé" au presse-papier sous Wine
    Bonjour,

    J'ai écrit une application qui, à un moment donné, utilise le contenu du presse-papier comme ceci:
    - s'il contient du HTML
    - et si la source est reconnue (SourceURL)
    -> alors fait diverses manips sur le texte (brut)

    Ça fonctionne comme prévu sous Windows, mais pas sous Wine (Linux).

    Comment faire pour récupérer le HTML sous Wine ?

    Extrait du 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
    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
    uses
    // (...)
    ClipBrd;
     
    var
      CF_HTML: UINT;
     
    function ClipboardHtmlToString: string;
    var
      Data: THandle;
      Ptr: PChar;
    begin
      Result := '';
      with Clipboard do begin
        Open;
        try
          Data := GetAsHandle(CF_HTML);
          if Data <> 0 then begin
            Ptr := GlobalLock(Data);
            if Ptr <> nil then begin
              try
                Result := string(Ptr);
              finally
                GlobalUnlock(Data);
              end;
            end;
          end;
        finally
          Close;
        end;
      end;
    end;
     
    procedure TForm1.btnCollerClick(Sender: TObject);
    var
      slItems, slClipBoard: TStringList;
      s, sItem, sTmp: string;
      i1, iCount: Integer;
    begin
      slClipBoard := TStringList.Create;
      try
        slClipBoard.Text := Clipboard.AsText;
     
        iCount := 0;
        s := ClipboardHtmlToString; // \\ // \\ Sous Wine, retourne "<" au lieu du contenu complet !? // \\ // \\
        // ShowMessage(s);
        if Pos('monsite1.com', s) > 0 then begin
          slItems := TStringList.Create;
          try
            repeat
              Split(slClipBoard[iCount], #9, slItems);  // #9 = TAB
              sItem := Trim(slItems[1]);
              i1 := Pos(' -', sItem) + 1;
              if Length(sItem) = i1 then
                SetLength(sItem, i1 - 1);
              edt[iCount, 0].Text := sItem;
              edt[iCount, 1].Text := Trim(slItems[2]);
              Inc(iCount);
            until (iCount >= slClipBoard.Count) or (iCount >= speNbItems.IntValue);
          finally
            slItems.Free;
          end;
        end
        else if Pos('monsite2.com', s) > 0 then begin
          repeat
            sTmp := Trim(slClipBoard[5 * iCount]);
            i1 := Pos(' ', sTmp);
            sItem := Copy(sTmp, i1, Length(sTmp));
            edt[iCount, 0].Text := Trim(sItem);
            edt[iCount, 1].Text := slClipBoard[5 * iCount + 4];
     
            Inc(iCount);
          until ((5 * iCount) >= slClipBoard.Count) or (iCount >= speNbItems.IntValue);
        end
        else if Pos('monsite3.com', s) > 0 then begin
          slClipBoard.Delete(0);  // Supprime la première ligne, vide
          repeat
            edt[iCount, 0].Text := Trim(slClipBoard[8 * iCount + 1]);
            edt[iCount, 1].Text := Trim(slClipBoard[8 * iCount + 5]);
     
            Inc(iCount);
          until ((8 * iCount) >= slClipBoard.Count) or (iCount >= speNbItems.IntValue);
        end;
      finally
        slClipBoard.Free;
      end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      CF_HTML := RegisterClipboardFormat('HTML Format');
    end;
    PS: tout le reste de l'application fonctionne parfaitement sous Wine, il y a juste ce problème avec le presse-papier qui m'empêche de passer complètement sous Linux ;-)

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut
    Hum, j'ai l'impression que ce problème n'inspire pas grand monde :-\

    Par acquis de conscience j'ai également essayé avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      CF_HTML := RegisterClipboardFormat('text/html');
    end;
    Mais ça ne passe pas non plus.

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 948
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 948
    Par défaut
    CF_HTML devrait être de l'ASCII et tu as là manifestement de l'Unicode.
    Un problème avec la source ?

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut
    Peux-tu préciser ta pensée ?
    CF_HTML est un UINT (type d'entier), où est-ce que tu vois du ascii/unicode ?
    (j'ai aussi essayé avec Ptr défini comme PAnsiChar au lieu de PChar, même résultat)

    PS: le HTML provient d'une sélection "copiée" (ctrl+c) depuis le navigateur (Firefox chez moi).

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut
    Pour simplifier les choses, j'ai écrit un petit programme qui copie juste le contenu HTML du presse-papier dans un TMemo.

    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
    procedure TForm1.btnClipboardClick(Sender: TObject);
    var
      MyHandle: THandle;
    begin
      if Clipboard.HasFormat(CF_HTML) then begin
        MyHandle := Clipboard.GetAsHandle(CF_HTML);
        Memo1.Lines.Add(StrPas(GlobalLock(MyHandle)));
        GlobalUnlock(MyHandle);
      end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        CF_HTML := RegisterClipboardFormat('HTML Format');
    end;
    Dans Firefox je copie ta réponse ci-dessus et voici le résultat quand je clique sur le bouton...

    Sous Windows:
    Nom : Capture_Windows.PNG
Affichages : 311
Taille : 16,6 Ko

    Sous Wine:
    Nom : Capture_Wine.PNG
Affichages : 367
Taille : 104,7 Ko

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 948
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 948
    Par défaut
    Commence par contrôler qu'il y a bien une donnée CF_HTML dans le presse-papiers par HasFormat et si oui, tu peux ensuite déterminer sa taille par GlobalSize.

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

Discussions similaires

  1. gestion du presse-papier sous Python
    Par jpb974 dans le forum Général Python
    Réponses: 2
    Dernier message: 15/02/2014, 12h09
  2. [XL-2000] coller tout le presse-papier sous Excel 2000
    Par juju05 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 21/01/2010, 18h32
  3. Réponses: 12
    Dernier message: 10/06/2006, 19h07

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