Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Буфер обмена сделать локальным для


Страницы:   1 2

DelphiLexx ©   (2006-08-17 15:05:00) 

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


clickmaker   (2006-08-18 09:39:00) [1]


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

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


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


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


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


DelphiLexx   (2006-08-18 09:20:00) [3]


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

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


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


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


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


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


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


DelphiLexx   (2006-08-18 09:07:00) [5]

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


DelphiLexx   (2006-08-18 09:05:00) [6]


> with fmTechViewOrFrame do

Вместо

with fmTechViewOrFrame do

напиши

with MyForm do


DelphiLexx   (2006-08-18 09:03:00) [7]


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

Ну да, для прапорщиков можно и подробно:
На форме размести 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:00:00) [8]


> Врешь ты всё) .. Ничего не затирается. Просто ошибка у тебя
> в 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;


Anatoly Podgoretsky   (2006-08-17 18:54:00) [9]

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


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


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


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

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

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


clickmaker   (2006-08-17 17:33:00) [11]


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

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


DelphiLexx   (2006-08-17 17:29:00) [12]


> а как узнал?

С помощью Formats.


clickmaker   (2006-08-17 17:10:00) [13]


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

а как узнал?


DelphiLexx   (2006-08-17 17:09:00) [14]


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

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


DelphiLexx   (2006-08-17 17:09:00) [15]


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

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


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

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

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

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


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


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


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

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


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


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


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


DelphiLexx   (2006-08-17 16:34:00) [19]


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

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


DelphiLexx   (2006-08-17 15:47:00) [20]


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо