Форум: "Основная";
Текущий архив: 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