Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.01;
Скачать: CL | DM;

Вниз

Буфер обмена сделать локальным для   Найти похожие ветки 

 
DelphiLexx ©   (2006-08-17 15:05) [0]

В буфер Clipboard я скидываю для хранения свои данные в хитром формате, но дело в том, что если я зайду в любой текстовый редактор скопирую текст, то данные моего приложения исчезают, поэтому Clipboard нужно как-то локализовать только под моё приложение, чтобы другие приложения не могли испортить буфер. Как это сделать?


 
MBo ©   (2006-08-17 15:08) [1]

Если это приемлемо, то делай свой собственный буфер обмена, например, через Memory-Mapped File


 
Ketmar ©   (2006-08-17 15:11) [2]

не использовать клипбоард.


 
clickmaker ©   (2006-08-17 15:13) [3]


> Clipboard нужно как-то локализовать только под моё приложение

это уже не клипборд, а просто некое хранилище  в памяти твоего приложения. Массив, список, XML, dataset etc...


 
DelphiLexx ©   (2006-08-17 15:18) [4]


> Если это приемлемо, то делай свой собственный буфер обмена,
>  например, через Memory-Mapped File

Рассказываю прикол:
Есть утилитка VisSim - редактор электрических схем. Так вот стою я в нем схему, выделяю её, затем копирую буфер. Затем с помощью не хитрых трюков вытягиваю его данные из глобального буфере (схему он сохраняет в виде скрипта), что говорит о том, что данная прога хранит данные в глобальном буфере, после этого копирую текст или картинку или что-то ещё в буфер из любого другого редактора при этом данные глобального буфера VisSim"a не теряются? Прикольно да?!
Если хочешь посмотри сам: VisSim 4.5h (~790 Кb)
http://up.spbland.ru/files/06081539/


 
DelphiLexx ©   (2006-08-17 15:20) [5]


> это уже не клипборд, а просто некое хранилище  в памяти
> твоего приложения. Массив, список, XML, dataset etc...

Я не знаю локализовать или ещё что-то, но нужно, чтобы мои данные в определенном формате, которые я размещаю в глобальном Clipboard"e не могли разрушить.


 
clickmaker ©   (2006-08-17 15:24) [6]


> Прикольно да?!

Так он скрипт в виде текста туда кладет? CF_TEXT?


 
DelphiLexx ©   (2006-08-17 15:28) [7]


> Так он скрипт в виде текста туда кладет? CF_TEXT?

Нет. VisSim с помощью функции подобной RegisterClipboardFormat создает новый формат. Это 100% - сам анализировал.


 
tesseract ©   (2006-08-17 15:33) [8]

есть спецформаты только "под себя" они лежат  в диапазоне  CF_PRIVATEFIRST - СF_PRIVATELAST.


 
DelphiLexx ©   (2006-08-17 15:41) [9]


> есть спецформаты только "под себя" они лежат  в диапазоне
>  CF_PRIVATEFIRST - СF_PRIVATELAST.

Я же сказал, что VisSim выделяет свой формат VisSimDiagram = 49872.


 
tesseract ©   (2006-08-17 15:45) [10]


> DelphiLexx ©   (17.08.06 15:41) [9]


Ты же вроде уже регистрируешь свой формат? И всё равно пропадает?


 
DelphiLexx ©   (2006-08-17 15:47) [11]


>
> Ты же вроде уже регистрируешь свой формат? И всё равно пропадает?
>

Да! Я сам не понимаю?


 
DelphiLexx ©   (2006-08-17 16:34) [12]


> Ты же вроде уже регистрируешь свой формат? И всё равно пропадает?

Тут выяснилось, что системе по-барабану выделяешь ли ты свой формат или нет данный все равно затираются.


 
Сергей М. ©   (2006-08-17 16:38) [13]


> DelphiLexx ©   (17.08.06 16:34) [12]


Врешь ты всё) .. Ничего не затирается. Просто ошибка у тебя в 17-й строке.


 
tesseract ©   (2006-08-17 16:42) [14]


> DelphiLexx ©   (17.08.06 16:34) [12]


А наименование буфера не с чьим не совпадает?

Если не помогает попробуй - CF_PRIVATEFIRST+1


 
GrayFace ©   (2006-08-17 16:51) [15]

DelphiLexx ©   (17.08.06 15:18) [4]
Возможно еще во внутреннем буфере сохраняет.

DelphiLexx ©   (17.08.06 15:41) [9]
Я же сказал, что VisSim выделяет свой формат VisSimDiagram = 49872

Если его номер не меняется, то это именно ситуация [8].


 
DelphiLexx ©   (2006-08-17 17:09) [16]


> Если его номер не меняется, то это именно ситуация [8].

Константы CF_PRIVATEFIRST - СF_PRIVATELAST гораздо меньше 49872.


 
DelphiLexx ©   (2006-08-17 17:09) [17]


> Просто ошибка у тебя в 17-й строке.

Где ты 17 - ю строку увидал?


 
clickmaker ©   (2006-08-17 17:10) [18]


> Я же сказал, что VisSim выделяет свой формат VisSimDiagram
> = 49872.

а как узнал?


 
DelphiLexx ©   (2006-08-17 17:29) [19]


> а как узнал?

С помощью Formats.


 
clickmaker ©   (2006-08-17 17:33) [20]


> [19] DelphiLexx ©   (17.08.06 17:29)

для прапорщиков можно поподробней?


 
Сергей М. ©   (2006-08-17 18:41) [21]


> DelphiLexx ©   (17.08.06 17:09) [17]
> Где ты 17 - ю строку увидал?


Где-где ..
В п....е !)

Вроде бы давно уже пасешься на мастаках. а намеков элементарных не понимаешь)

Приводи уже код свой кривой - будут и рекомендации)


 
Anatoly Podgoretsky ©   (2006-08-17 18:54) [22]

Нафиг, еще унижаться код выпрашивать, пусть гуляет и трясет.


 
DelphiLexx ©   (2006-08-18 09:00) [23]


> Врешь ты всё) .. Ничего не затирается. Просто ошибка у тебя
> в 17-й строке.
Затирается. Сам можешь попробовать выдели с помощью RegisterClipboardFormat свой формат

CF_MYFORMAT := RegisterClipboardFormat("My Format Description");

затем с помощью данного кода размести свои данные

var
      hBuf: THandle;
      Bufptr: Pointer;
      MStream: TMemoryStream;
    begin
      MStream := TMemoryStream.Create;
      try
      { write your data to the stream }
        hBuf := GlobalAlloc(GMEM_MOVEABLE, MStream.Size);
        try
          BufPtr := GlobalLock(hBuf);
          try
            Move(MStream.Memory^, BufPtr^, MStream.Size);
            Clipboard.SetAsHandle(CF_MYFORMAT, hBuf);
          finally
            GlobalUnlock(hBuf);
          end;
        except
          GlobalFree(hBuf);
          raise;
        end;
      finally
        MStream.Free;
      end;
    end;

Затем сходи в любой текстовый редактор сохраним там что-нибудь в буфер,
после этого с помощбю кода ты увидешь, что твои данные пропали.

var
      hBuf: THandle;
      BufPtr: Pointer;
      MStream: TMemoryStream;
    begin
      hBuf := Clipboard.GetAsHandle(CF_MYFORMAT);
      if hBuf <> 0 then

      begin
        BufPtr := GlobalLock(hBuf);
        if BufPtr <> nil then
        try
          MStream := TMemoryStream.Create;
          try
            MStream.WriteBuffer(BufPtr^, GlobalSize(hBuf));
            MStream.Position := 0;
          { read your data from the stream }
          finally
            MStream.Free;
          end;
        finally
          GlobalUnlock(hBuf);
        end;
      end;
    end;


 
DelphiLexx ©   (2006-08-18 09:03) [24]


> для прапорщиков можно поподробней?

Ну да, для прапорщиков можно и подробно:
На форме размести TMemo и TListBox

procedure TMyForm.Button1Click(Sender: TObject);
var
 buf: array[0..60] of Char;
 n: Integer;
 fmt: Word;
begin

 with fmTechViewOrFrame do
 begin
   MemFormats.Clear;
   for n := 0 to Clipboard.FormatCount - 1 do
   begin
     fmt := Clipboard.Formats[n];
     listbox1.Items.Clear;
     listbox1.Items.Add(IntToStr(fmt)); //представление в виде числа
     if GetclipboardFormatName(fmt, buf, Pred(Sizeof(buf))) <> 0 then
       MemFormats.Lines.Add(StrPas(buf))//представление в виде константы
     else
     begin
       case fmt of
         1: name := "CF_TEXT";
         2: name := "CF_BITMAP";
         3: name := "CF_METAFILEPICT";
         4: name := "CF_SYLK";
         5: name := "CF_DIF";
         6: name := "CF_TIFF";
         7: name := "CF_OEMTEXT";
         8: name := "CF_DIB";
         9: name := "CF_PALETTE";
         10: name := "CF_PENDATA";
         11: name := "CF_RIFF";
         12: name := "CF_WAVE";
         13: name := "CF_UNICODETEXT";
         14: name := "CF_ENHMETAFILE";
         15: name := "CF_HDROP (Win 95)";
         16: name := "CF_LOCALE (Win 95)";
         17: name := "CF_MAX (Win 95)";
         $0080: name := "CF_OWNERDISPLAY";
         $0081: name := "CF_DSPTEXT";
         $0082: name := "CF_DSPBITMAP";
         $0083: name := "CF_DSPMETAFILEPICT";
         $008E: name := "CF_DSPENHMETAFILE";
         $0200..$02FF: name := "частный формат";
         $0300..$03FF: name := "Объект GDI";
       else
         name := "неизвестный формат";
       end;
       MemFormats.Lines.Add(name);
     end;
   end;
 end;
end


 
DelphiLexx ©   (2006-08-18 09:05) [25]


> with fmTechViewOrFrame do

Вместо

with fmTechViewOrFrame do

напиши

with MyForm do


 
DelphiLexx ©   (2006-08-18 09:07) [26]

Специално для модератора
Не грех было бы сделать на данном форуме возможность редактирования своих ответов.


 
Сергей М. ©   (2006-08-18 09:14) [27]


> сходи в любой текстовый редактор сохраним там что-нибудь
> в буфер,
> после этого с помощбю кода ты увидешь, что твои данные пропали


Потому что тот самый "любой текстовый редактор" вправе перед записью в клипборд своих данных произвести его полную очистку, что он как правило и делает.


> Не грех было бы сделать на данном форуме возможность редактирования
> своих ответов


Слово не воробей)


 
DelphiLexx ©   (2006-08-18 09:20) [28]


> Потому что тот самый "любой текстовый редактор" вправе перед
> записью в клипборд своих данных произвести его полную очистку,
>  что он как правило и делает.

Поэтому в данном случае лучше всего пользоваться внутренней переменной, а не буфером.


 
Сергей М. ©   (2006-08-18 09:26) [29]


> внутренней переменной


Какая такая "внуренняя переменная", если речь идет о интерпроцессном взаимодействии ?


 
clickmaker ©   (2006-08-18 09:39) [30]


> Поэтому в данном случае лучше всего пользоваться внутренней
> переменной

ну так и пользуйся. А при чем тут клипборд?



Страницы: 1 вся ветка

Текущий архив: 2006.10.01;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.047 c
15-1158126179
Dima L
2006-09-13 09:42
2006.10.01
delphi 10 lite


2-1158241751
megasecure
2006-09-14 17:49
2006.10.01
Индексы в MSSQL


2-1157719579
max1991
2006-09-08 16:46
2006.10.01
помогите, пожалуйста с TaskBar


2-1157709922
Urvin
2006-09-08 14:05
2006.10.01
Отправить запрос на сервер


2-1157522821
YOjik
2006-09-06 10:07
2006.10.01
Ошибка при выгрузке dll