![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Буфер обмена сделать локальным для
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]
>
> Ты же вроде уже регистрируешь свой формат? И всё равно пропадает?
>
Да! Я сам не понимаю?