Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.014 c
15-1157632666
george_soselia
2006-09-07 16:37
2006.10.01
карты


1-1155923508
SergeyAKM
2006-08-18 21:51
2006.10.01
Обращение к объекту


15-1157842793
Дед Маздай
2006-09-10 02:59
2006.10.01
Опера


3-1153825860
tomkat
2006-07-25 15:11
2006.10.01
FireBird Embeded в реализации


15-1157806975
new_user1
2006-09-09 17:02
2006.10.01
Как узнать...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский