На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела "Наши Исходники"
Раздел предназначен для публикации различных исходников и программных решений (в виде исходных текстов), которые Вы считаете достойными внимания и/или интересными. Язык исходника значения не имеет. Это может быть C/C++, Pascal, Perl, PHP, C#, Foth, Prolog или любой другой существующий язык программирования. Единственный момент – в названии темы этот язык должен быть указан. Например, «[C++] Представление чисел в римской записи». Сам исходный текст должен содержаться в первом посте темы. Если исходник занимает не больше одного-двух экранов, то допустимо его публикация непосредственно в посте. Иначе исходный текст должен быть прикреплен к посту в виде архива. Кроме того, первый пост должен содержать:

- Информацию о платформе/компиляторе, для которых предназначен исходный текст (если эта информация существенна)
- Ссылку на оригинал и автора (если публикуется чужой исходный текст)
- Максимально подробное описание – какую задачу решает опубликованный исходный текст, и чем он интересен.

Плагиат крайне не приветствуется. Также не приветствуется публикация исходных текстов вирусов, крэков и т. п. информации. Это элементарно противозаконно.

Для быстрого поиска нужного исходника можно воспользоваться навигатором:
Быстрый поиск по разделу
Модераторы: Flex Ferrum
  
> [Delphi] Список форматов буфера обмена, Программа выясняет, что содержит буфер обмена - какие форматы и каково вкратце их содержимое
    Стояла задача вставить в поле текстового редактора данные, скопированные из Excel. При этом знаки табуляции должны были быть заменены нужным числом пробелов, чтобы организовать ровные колонки. Редактор при этом сам должен определять, что буфер обмена содержит данные Excel. Поэтому потребовалось "быстренько" выяснить, чем отличается содержимое буфера обмена при помещении туда данных из Excel и из других программ и была написана утилитка, которая позволяет это сделать. Получилось вот что:

    ExpandedWrap disabled
      unit UClpBrd;
       
      interface
       
      uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, StdCtrls,ClipBrd;
       
      type
        TFClipBoard = class(TForm)
          Button1  : TButton;
          ListBox1 : TListBox;
          Button2  : TButton;
          Memo1    : TMemo;
          procedure Button1Click(Sender: TObject);
          procedure Button2Click(Sender: TObject);
        end;
       
      var
        FClipBoard: TFClipBoard;
       
      implementation
       
      {$R *.dfm}
       
      function CBFormatName(CF:integer):string;
      var N,N0 : integer; P : PChar;
      begin
        N0 := 255;
        P := SysUtils.StrAlloc(N0);  (* отведем место для строки *)
        N := Windows.GetClipboardFormatName(CF,P,N0);
        if N > 0 then begin
          Result := SysUtils.StrPas(P);       (* PChar => String *)
        end
        else Result := 'CF_'+SysUtils.IntToHex(CF,4);
        SysUtils.StrDispose(P);
      end;
       
      (* формат буфера обмена integer -> string          *)
      (* Convrt Clipboard Formats from integer to string *)
      function CBFormatStr(CF:integer):string;
      begin
        Case CF of
         (*---------------------------------------------------------*)
         (*       предопределенные форматы буфера обмена            *)
         (*           Predefined Clipboard Formats                  *)
         (*---------------------------------------------------------*)
      //  константы CF_TEXT, CF_BITMAP, ... определены в unit Windows
          CF_TEXT             : Result := 'CF_TEXT';           // 1
          CF_BITMAP           : Result := 'CF_BITMAP';         // 2
          CF_METAFILEPICT     : Result := 'CF_METAFILEPICT';   // 3
          CF_SYLK             : Result := 'CF_SYLK';           // 4
          CF_DIF              : Result := 'CF_DIF';            // 5
          CF_TIFF             : Result := 'CF_TIFF';           // 6
          CF_OEMTEXT          : Result := 'CF_OEMTEXT';        // 7
          CF_DIB              : Result := 'CF_DIB';            // 8
          CF_PALETTE          : Result := 'CF_PALETTE';        // 9
          CF_PENDATA          : Result := 'CF_PENDATA';        // 10
          CF_RIFF             : Result := 'CF_RIFF';           // 11
          CF_WAVE             : Result := 'CF_WAVE';           // 12
          CF_UNICODETEXT      : Result := 'CF_UNICODETEXT';    // 13
          CF_ENHMETAFILE      : Result := 'CF_ENHMETAFILE';    // 14
          CF_HDROP            : Result := 'CF_HDROP (Win 95)'; // 15
          CF_LOCALE           : Result := 'CF_LOCALE (Win 95)';// 16
          CF_MAX              : Result := 'CF_MAX (Win 95)';   // 17
          CF_MAX_XP           : Result := 'CF_MAX_XP';         // 18
       
          CF_OWNERDISPLAY     : Result := 'CF_OWNERDISPLAY';   // 128
          CF_DSPTEXT          : Result := 'CF_DSPTEXT';        // 129
          CF_DSPBITMAP        : Result := 'CF_DSPBITMAP';      // 130
          CF_DSPMETAFILEPICT  : Result := 'CF_DSPMETAFILEPICT';// 131
          CF_DSPENHMETAFILE   : Result := 'CF_DSPENHMETAFILE'; // 142
         (*---------------------------------------------------------*)
       
         (*---------------------------------------------------------*)
         (*       частные и GDI-object форматы буфера обмена        *)
         (*         PRIVATE and GDIOBJ Clipboard Formats            *)
         (*---------------------------------------------------------*)
         { "Private" formats don't get GlobalFree()'d }
      //  CF_PRIVATEFIRST     : Result := 'CF_PRIVATEFIRST';   // 512  ($200)
      //  CF_PRIVATELAST      : Result := 'CF_PRIVATELAST';    // 767
          $0200..$02FF        : Result := 'частный формат '+CBFormatName(CF);
         { "GDIOBJ" formats do get DeleteObject()'d   }
      //  CF_GDIOBJFIRST      : Result := 'CF_GDIOBJFIRST';    // 768
      //  CF_GDIOBJLAST       : Result := 'CF_GDIOBJLAST';     // 1023
          $0300..$03FF        : Result := 'Объект GDI '+CBFormatName(CF);
         (*---------------------------------------------------------*)
       
         (*------------------------------------------------------------------*)
         (* форматы, имена которых возвращает Windows.GetClipboardFormatName *)
         (*------------------------------------------------------------------*)
          else (* case *)       Result := CBFormatName(CF);
         (*------------------------------------------------------------------*)
       
        end; (* case *)
      end; (* CBFormatStr *)
       
      procedure Warn(S:string);
      const sHd = 'ПРЕДУПРЕЖДЕНИЕ ИЛИ НАПОМИНАНИЕ';
      begin
        Windows.MessageBox(GetActiveWindow,PChar(S),PChar(sHd),MB_OK);
      end;
       
      (* Список названий наличествующих ClpBRd-форматов с Hex-номерами их Хэндлов *)
      procedure TFClipBoard.Button1Click(Sender: TObject);
      var I,CF : integer;
      begin
        ListBox1.Items.Clear;
        for I := 0 to Clipboard.FormatCount-1 do begin
          CF := Clipboard.Formats[I];
          ListBox1.Items.Add(IntToHex(CF,4)+' '+CBFormatStr(CF));
        end;
      end; (* Button1.Click *)
       
      (* Адреса хэндлов + содержимое форматов буфера обмена *)
      procedure TFClipBoard.Button2Click(Sender: TObject);
      type TPD = ^INT64;
      var I   : integer; (* переменная цикла             *)
          KF  : integer; (* индекс ClipBoard формата     *)
          H   : THandle; (* Хэндл формата с индексом KF  *)
          SH  : string;  (* Хэндл в виде Hex-строки      *)
          S   : string;  (* Символьн.имя + Hex формата   *)
          PD  : TPD;     (* Хэндл преобраз.к типу ^INT64 *)
          D   : INT64;   (* Содержимое по адресу PD      *)
          SPH : string;  (* Нех знач-е по адресу PD      *)
          P   : PChar;   (* Хэндл в виде PChar           *)
          SPS : string;  (* Строка по адресу P           *)
      begin
        Memo1.Lines.Clear;
        for I := 0 to Clipboard.FormatCount-1 do begin
          KF := Clipboard.Formats[I];
          H  := ClipBoard.GetAsHandle(KF);
          SH := IntToHex(Integer(H),8);
          S  := CBFormatStr(KF)+' '+SH;
          Memo1.Lines.Add(S);
          if System.copy(SH,1,2) <> '00' then begin
      //    PD := TPD(H);
      //    D  := PD^;  (* в этой строке возникает ошибка *)
      //    Warn( 'Неправильный Хэндл!' + #13#10 + S );
            S  := 'Неправильный Хэндл!';
            Memo1.Lines.Add(S);
          end
          else begin
            PD  := TPD(H);   (* THandle => ^Int64   *)
            D   := PD^;      (* содержимое Хэндла H *)
            SPH := 'Hex='+SysUtils.IntToHex(D,16);
            Memo1.Lines.Add(SPH);
            P   := PChar(H);
            SPS := P;            (* PChar => string *)
            Memo1.Lines.Add(SPS);
          end;
          Memo1.Lines.Add
            ('------------');(* разделитель записей *)
        end;
      end; (* Button2.Click *)
       
      end.


    Исполняемый файл: Прикреплённый файлПрикреплённый файлClipBoardViewer.rar (166,62 Кбайт, скачиваний: 22)
    Скриншот:
    Прикреплённая картинка
    Прикреплённая картинка
      А разве разнообразие форматов чем-то ограничено?
      Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
        Цитата amk @
        А разве разнообразие форматов чем-то ограничено?

        - список форматов зависит от программы, в Excel их много, в Блокноте всего 4.
        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script Execution time: 0,0833 ]   [ 16 queries used ]   [ Generated: 16.12.17, 18:53 GMT ]