Виртуальная библиотека Delphi
- Название:Виртуальная библиотека Delphi
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Виртуальная библиотека Delphi краткое содержание
Виртуальная библиотека Delphi - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:

Не только возможно, именно так поступают функции Clipboard.GetComponent и Clipboard.SetComponent . Сначала вы должны зарегистрировать свой собственный формат данных для Clipboard с помощью функции RegisterClipboardFormat :
CF_MYFORMAT := RegisterClipboardFormat('My Format Description'); Далее вы должны выполнить шаги:
1. Создать поток (memory stream) и записать туда данные.
2. Создать глобальный буфер в памяти и скопировать поток туда.
3. Вызвать Clipboard.SetAsHandle(), чтобы поместить буфер в Clipboard.
Пример:
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;
Внимание:не уничтожайте буфер, созданный с GlobalAlloc . Поскольку вы поместили его в Clipboard, это уже дело clipboard'а его уничтожить. Опять же, получая буфер из Clipboard, не уничтожайте этот буфер - просто сделайте копию содержимого.
Для обратного получения потока и данных, сделайте что-нибудь вроде этого:
var
hBuf: THandle;
BufPtr: Pointer;
MStream: TMemoryStream;
begin
hBuf := Clipboard.GetAsHandle(CF_MYFORMAT);
ifhBuf <> 0 then
begin
BufPtr := GlobalLock(hBuf);
ifBufPtr <> 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;
20. Что означает Key<>#0 ?

В исходном тексте одного из компонентов третьих фирм я увидел строку:
ifKey <> #0 then inheritedKeyPress( #0);
В Windows виртуальные коды находятся в диапазоне 1-145 (Dec). Зачем нужна такая проверка?

В соответствии с соглашением Windows код клавиши #0означает отсутствие реального нажатия. Управление в данную точку программы могло попасть, например вследствие прямого вызова, а не нажатия клавиши или же нажатие уже было обработано предком, вследствие чего код нажатой клавиши был сброшен в 0.
21. Аналог процедуры TP/BP Delay.
procedureTForm1.Delay(MSecs: Longint);
var
FirstTick: Longint;
begin
FirstTick := GetTickCount;
repeat
Application.ProcessMessages;
untilGetTickCount - FirstTick >= MSecs;
end;

В Win32 API существуют также функции Sleep и SleepEx .
22. Каким образом создать форму, которую можно таскать за поле?

Как сделать форму (окно), которое перетаскивается не за заголовок ( Сaption ), а за все поле ?

Нужно обрабатывать сообщение WM_NCHITTEST :
type
TForm1 = class(TForm)
...
private
procedureWMNCHitTest( varM: TWMNCHitTest); messageWM_NCHITTEST;
end;
procedureTForm1.WMNCHitTest( varM: TWMNCHitTest);
begin
inherited; { вызов унаследованного обработчика }
ifM.Result = htClient then { Мышь сидит на окне? }
M.Result := htCaption; { Если да - то пусть Windows думает, что }
{ мышь на caption bar }
end;
Примечание:окно можно сделать вообще без Сaption .
23. Как программно спрятать или показать заголовок у формы?

Как программно спрятать или показать заголовок ( Caption ) у формы?

Вы можете попробовать следующее:
procedureTForm1.HideTitlebar;
var
Save: Longint;
begin
ifBorderStyle=bsNone thenExit;
Save := GetWindowLong(Handle, GWL_STYLE);
if(Save andWS_CAPTION) = WS_CAPTION then
begin
caseBorderStyle of
bsSingle, bsSizeable:
SetWindowLong(Handle, GWL_STYLE, Save and( notWS_CAPTION) orWS_BORDER);
bsDialog:
SetWindowLong(Handle, GWL_STYLE, Save and( notWS_CAPTION) orDS_MODALFRAME orWS_DLGFRAME);
end;
Height := Height-GetSystemMetrics(SM_CYCAPTION);
Refresh;
end;
end;
procedureTForm1.ShowTitlebar;
var
Save: Longint;
begin
ifBorderStyle = bsNone thenExit;
Save := GetWindowLong(Handle, GWL_STYLE);
if(Save andWS_CAPTION) <> WS_CAPTION then
begin
caseBorderStyle of
bsSingle, bsSizeable:
SetWindowLong(Handle, GWL_STYLE, Save orWS_CAPTION orWS_BORDER);
bsDialog:
SetWindowLong(Handle, GWL_STYLE, Save orWS_CAPTION orDS_MODALFRAME orWS_DLGFRAME);
end;
Height := Height + GetSystemMetrics(SM_CYCAPTION);
Refresh;
end;
end;
24. Как сделать приложение модальным?

Мне нужно сделать приложение модальным, для того чтобы обезопасить систему и в то же время позволить работать с программой.

Ok, пара предложений на эту тему:
1. Создайте форму, занимающую весь экран (maximized) без системных кнопок (Maximize, Minimize, System)
2. В обработчике FormDeactivate для формы вызовите метод SetFocus — это предотвратит Ctrl+Esc:
Form1.SetFocus;
3. В обработчике события FormActivate , нужно присвоить метод Deactivate для приложения:
Application.OnDeactivate := FormDeactivate;
4. Создайте всплывающее меню TPopupMenu с единственным пунктом. В свойствах данного компонента нужно установить Visible=False . Создайте процедуру для этого пункта меню, и в теле поставьте две фигурные скобки {} (для того, чтобы Delphi не удалил эту процедуру)
5. Присвойте созданное Popup-меню форме (св-во PopupMenu )
6. Задайте горячую клавишу (shortcut) для Popup-меню в методе FormActivate как показано ниже:
Читать дальшеИнтервал:
Закладка: