Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Интернет: Образование, Работа и Бизнес" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Программирование на Delphi #22
| Информационный Канал Subscribe.Ru |
Программирование на DELPHI |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Выпуск #22 (13 марта 2005 г.) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ну вот и свершилось долгожданное чудо! Наш сайт предстал перед вами в новой форме! Заходите, смотрите, высказывайте свои мнения в гостевой книге или на мыло. Хочу отдельно сказать, что изменено не только оформление, но и полностью переработана структура расположения файлов. В связи с этим, ссылки, ранее опубликованные в выпусках рассылки, теперь недействительны, так что будьте внимательны. Все присланные ранее вопросы и ответы, конечно же, опубликованы в данном выпуске рассылки. Однако теперь ответы на вопросы будут публиковаться только в рассылке, на сайте вы найдёте только вопросы. Но к вопросам указаны номера выпусков рассылки, в которых публиковались ответы на эти вопросы. Скачать все выпуски рассылки вы можете со страницы Архив рассылки. Заходите на наш форум и обсуждайте интересующие темы. Отдельно хочу попросить всех: если на сайте не работает какая-либо из ссылок или не скачивается файл, пожалуйста, сообщите об этом. Ну вот и всё, что хотел сказать... Оставляю вас наедине с рассылкой и свеженьким сайтом. Удачи! Количество подписчиков: 1864. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
За конкурс с вопросами по Delphi баллы пока никому не начислены. Это будет сделано чуть позже. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
78. Как получить скорость работы GPU и памяти видео карты? [Ответить]. 79. Как программно установить свои обои? [Ответить]. 80. Привет всем! у меня возникла такая вот проблемка. Есть база данных, созданная в MS Access, которая содержит 2 поля, в одном картинки, во втором текст. При подключении этой базы в Делфи7 (используются ADO компоненты), появляется ошибка Bitmap image is not valid. Подскажите, что делать? Связь с БД есть, т.к. текст она показывает. Пробовала менять форматы картинок и в JPG, и в разные BMP. Ничего не помогло. [Ответить]. 81. Здравствуйте! У меня такой вопрос - как при запуске приложения автоматически присоединить .dllку ? Если регистрировать её через regsvr32.exe с помощью WinExec, то будет вылезать уведомление о регистрации dllки. И ещё один нюанс - эта dll в разных операционках лежит в разных каталогах, а может и вообще отсутствовать! Т.е. нужно присоединять dll из корневого каталога программы. (?) Заранее спасибо. Удачи! [Ответить]. 82. Подскажите, как получить оцифровку сигнала с линейного входа звуковой карты в реальном времени (без записи в файл WAV и последующего его декодирования)? Спасибо. [Ответить]. 83. Как можно рисовать (вывести текст) на экран, не на элемент окна, а именно на экран? Узнал, что нужно что-то делать с видеопамятью, только вот что и как? [Ответить]. 84. Необходимо, чтобы программа "замечала" установления модемом соединения (с инетом например). То есть связь установилась, появилось уведомление в виде двух мониторов в трэе, и прога, заметив это, например закрылась. Надо бы ещё и дисконект "замечать" и имя соединения узнавать не помешало бы. Я не имею ни малейшего понятия о том, как это осуществить. Подскажите пожалуйста. [Ответить]. 85. Пишу на D7: база данных по работе с кадрами предприятия , использую ADO, SQL Server Sybase ASA Anywhere 9 на NetWare 6. Или я устарел, или отупел. Вопрос: как можно обновить только одну строку (запись), используя ADO при редактировании записи? Refresh обновляет все. При обновлении Close, Open, обновляются все записи, происходят тормоза, а нодо только одну. Заранее спасибо. [Ответить]. 86. Друзья программисты! Порекомендуйте книгу по Delphi, рассчитанную на новичка. [Ответить].
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
71. (Отправка SMS). [Отвечает: Feniks]: Вряд ли такие компоненты существуют, потому что отправку SMS-сообщений на телефон через E-Mail разрешает и регулирует сам оператор сотовой связи абонента, на телефон которого ты собираешься отправлять сообщение. Не все операторы поддерживают такой сервис, а некоторые еще и блокируют эту функцию по желанию своих клиентов (абонентов). Например, в моей стране, в Украине, существует несколько операторов и у каждого по-своему. Если оператор поддерживает эту функцию, то, обычно, письмо отправляется на адрес следующего формата: <номер телефона>@<сервак оператора>, где номер телефона может быть как в международном формате, так и в сокращенном, без кода страна и оператора, а только внутренний номер в сети - это все зависит от оператора. А <сервак оператора> - это их специальных почтовый сервер, причем может быть различным для разных клиентов одного оператора. Например: для контрактников - <код страны><код оператора><1234567>@sms.server.operator для предоплаченого - сервиса <код страны><код оператора><1234567>@2sms.server.operator у другого оператора - 1234567@sms.server.operator. Как видишь, в каждой стране и у каждого оператора свои заморочки. К тому же, есть операторы, у которых вообще нет сервиса SMS. ИМХО, лучше использовать готовые проги для отправки СМС-ок. У них есть своя база, в которой перечислены страны, операторы и форматы адресов для отправки СМС через E-Mail. P.S. Такая же кухня и с MMS сообщениями. Еще можно отправить MMS и SMS сообщения с родного сайта оператора. 77. (Проблемы при чтении данных из реестра). [Отвечает: Iron Monk]: Всем привет! Var reg:Tregistry; [Отвечает: Igor]: Ошибка происходит потому, что у вас не прав администратора при выполнении программы, а без прав администратора раздел HKEY_LOCAL_MACHINE доступен только для чтения! [Отвечает: Yurchik]: Если нужно создать какой-либо новый раздел в корне HKEY_LOCAL_MACHINE - ничего не выйдет. Но зато вполне можно воспользоваться веткой SOFTWARE и создавать новые разделы там. Если же вообще не удается открыть ни один ключ в HKEY_LOCAL_MACHINE, то проблема состоит в следущем. При использованиии компонента TRegistry под NT пользователь с правами доступа ниже чем "администратор" не может получить доступа к информации реестра в ключе HKEY_LOCAL_MACHINE. Проблема вызвана тем, что TRegistry по умолчанию открывает реестр с параметром KEY_ALL_ACCESS (полный доступ). Нужно изменить свойство Access на KEY_READ (только чтение) либо непосредственно перед чтением данных из реестра (reg.Access:= KEY_READ;), либо при создании экземпляра объекта (reg:= TRegistry.Create(KEY_READ);) [Отвечает: Feniks]: Наверняка ты работаешь в Windows 2000 или XP, т.е. в NT-юхах, а в этих виндах нельзя создавать новые ключи в HKEY_LOCAL_MACHINE, что ты и пытаешься сделать: If reg.OpenKey('Program', true) then ... Используй один из уже существующих ключах для создания в нем твоего 'Program'. Например : If reg.OpenKey('SoftWare\Program', true) then ... 75. (Скрытие программы от диспетчера задач Windows). [Отвечает: Iron Monk]: Всем привет! Библиотека убирает процесс из диспетчера задач. Компиллируем библиотеку dll и сохраняем её под именем Hide.dll: library Hide; var HookHandle: THandle; А это наша программа: unit Unit1; [Отвечает: mfred]: Вот так и убираешm: function RegisterServiceProcess(ProcessID, Typ: Integer): Integer; [Отвечает: Igor]: Убрать программу из Диспетчера задач WINDOWS: 1. Убрать из списка приложений: Убрать в главной форме в приложении стиль WS_Ex_AppWindow. Если форм несколько, то, возможно, нужно убрать у всех: type После того, как форма появится на экране (можно в событии OnShow): прописать строчку: ShowWindow(Application.Handle, SW_HIDE); Но есть одно но: если окно формы свернуть, то в списке приложений ваша программа все же появится. Поэкспериментируйте, где лучше всего поместить эту строчку. Я пробовал в OnPaint, но это не самый лучший способ. Либо, что еще лучше: напишите свой обработчик. 2. Убрать из списка процессов: В Windows этого не предусмотрено, т.к. сокрытие процесса совсем нежелательно (можно выполнять любые действия без ведома юзера). В Windows 98 еще можно было запустить процесс, как сервис, теперь в XP это намного сложнее. В интернете есть статьи, посвященные сокрытию процесса, например: http://www.hackzona.ru/modules.php?name=News&file=article&sid=1300 [Отвечает: Dasha]: Есть один способ, но он работает только в Windows 9x. Нужно сделать програму процессом, чтобы она отображалась только в диспетчере задач, а потом объявить после users такую процедуру: procedure RegisterServiceProcess; external 'kernel32.dll' А в программе вызвать ее: asm Тут ассемблером немного проще вызывать. В Windows 2000/XP нет такой функции, поэтому там работать не будет. [Отвечает: Андрей Лучников]: {Вот где-то когда-то нарыл примерчик} program Project1; [Отвечает: PWL]: Конечно, отключить Ctrl+Alt+Del - это круто... Например, по созданию окна. Для этого до слова implementation впиши следующую функцию: function RegisterServiceProcess(dwProcessID, dwType: integer): integer; А на создание окна код будет выглядеть так: procedure TForm1.FormCreate(Sender: TObject); Ну вот и всё, а если тебе понадобится сделать прогу видимой, тогда сделай это так: procedure TForm1.Button1Click(Sender: TObject); [Отвечает: Gin]: Не сочтите за труд - посмотрите в конце ответа на Вопрос №54: procedure TForm1.Button2Click(Sender: TObject); Но можно и в момент запуска: procedure TForm1.FormShow(Sender: TObject); или procedure TForm1.FormActivate(Sender: TObject); На странице "Процессы" Диспетчера Задач приложение не будет отображаться. 74. (Подсчёт суммарной температуры за день и за месяц в StringGrid). [Отвечает: Dasha]: Для этого делаем две процедуры для подсчета по дням и месяцам. Такие вот: procedure CountDay; procedure CountMonth; А потом где-нибудь просто их вызвать. [Отвечает: PWL]: Привет... В принципе, у меня похожее было, и я использовал вот что: procedure TForm1.FormActivate(Sender: TObject); procedure TForm1.Button1Click(Sender: TObject); Если что-то не понятно, напиши на PWLdeHAK@gmail.com я тебе исходник брошу ... 76. (Получение IP-адресов компьютера). [Отвечает: Автор рассылки]: Посмотрите вопрос №42 в нашей рассылке. 68. (Формирование уникального номера CD). [Отвечает: Feniks]: А зачем все так усложнять ? Ведь есть стандартные способы по определению серийного номера компакт-диска. Этот номер является заводским и уникальным. Самый простой и банальный способ рассматривался в одной предыдущей рассылке. Или можешь попробовать следующее: var Drives := GetLogicalDrives; // Get the volume information // if the call was successful, add the serial number. Вы также можете ответить на предыдущие вопросы. Поскольку на них уже ответили как минимум раз, они больше не публикуются в рассылке. Но если вы можете что-то добавить к ответам других, пожалуйста, отвечайте - ответы будут опубликованы. Найти предыдущие вопросы вы можете на нашем сайте: http://www.delphi-faq.fatal.ru/ или в спец-выпусках рассылки. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Создание хранителя экрана (ScreenSaver) Главное о чем стоит упомянуть это, что ваш хранитель экрана будет работать в фоновом режиме и он не должен мешать работе других запущенных программ. Поэтому сам хранитель должен быть как можно меньшего объема. Для уменьшения объема файла в описанной ниже программе не используются визуальные компоненты Delphi; включение хотя бы одного из них приведет к увеличению размера файла свыше 200кб, а так описанная ниже программа имеет размер всего 20кб!!! Procedure RunScreenSaver;
Var S : String;
Begin
S := ParamStr(1);
If (Length(S) > 1) Then Begin
Delete(S,1,1); { delete first char - usally "/" or "-" }
S[1] := UpCase(S[1]);
End;
LoadSettings; { load settings from registry }
If (S = 'C') Then RunSettings
Else If (S = 'P') Then RunPreview
Else If (S = 'A') Then RunSetPassword
Else RunFullScreen;
End;
Поскольку нам нужно создавать небольшое окно предварительного просмотра и полноэкранное окно, их лучше объединить используя единственный класс окна. Следуя правилам хорошего тона, нам также нужно использовать многочисленные нити. Дело в том, что, во-первых, хранитель не должен переставать работать даже если что-то "тяжелое" случилось, и во-вторых, нам не нужно использовать таймер.Процедура для запуска хранителя на полном экране - приблизительно такова: Procedure RunFullScreen;
Var
R : TRect;
Msg : TMsg;
Dummy : Integer;
Foreground : hWnd;
Begin
IsPreview := False; MoveCounter := 3;
Foreground := GetForegroundWindow;
While (ShowCursor(False) > 0) do ;
GetWindowRect(GetDesktopWindow,R);
CreateScreenSaverWindow(R.Right-R.Left,R.Bottom-R.Top,0);
CreateThread(nil,0,@PreviewThreadProc,nil,0,Dummy);
SystemParametersInfo(spi_ScreenSaverRunning,1,@Dummy,0);
While GetMessage(Msg,0,0,0) do Begin
TranslateMessage(Msg);
DispatchMessage(Msg);
End;
SystemParametersInfo(spi_ScreenSaverRunning,0,@Dummy,0);
ShowCursor(True);
SetForegroundWindow(Foreground);
End;
Во-первых, мы проинициализировали некоторые глобальные переменные (описанные далее), затем прячем курсор мыши и создаем окно хранителя экрана. Имейте в виду, что важно уведомлять Windows, что это - хранитель экрана через SystemParametersInfo (это выводит из строя Ctrl-Alt-Del чтобы нельзя было вернуться в Windows не введя пароль). Создание окна хранителя:Function CreateScreenSaverWindow(Width,Height : Integer;
ParentWindow : hWnd) : hWnd;
Var WC : TWndClass;
Begin
With WC do Begin
Style := cs_ParentDC;
lpfnWndProc := @PreviewWndProc;
cbClsExtra := 0; cbWndExtra := 0; hIcon := 0; hCursor := 0;
hbrBackground := 0; lpszMenuName := nil;
lpszClassName := 'MyDelphiScreenSaverClass';
hInstance := System.hInstance;
end;
RegisterClass(WC);
If (ParentWindow 0) Then
Result := CreateWindow('MyDelphiScreenSaverClass','MySaver',
ws_Child Or ws_Visible or ws_Disabled,0,0,
Width,Height,ParentWindow,0,hInstance,nil)
Else Begin
Result := CreateWindow('MyDelphiScreenSaverClass','MySaver',
ws_Visible or ws_Popup,0,0,Width,Height, 0,0,hInstance,nil);
SetWindowPos(Result,hwnd_TopMost,0,0,0,0,swp_NoMove or swp_NoSize or swp_NoRedraw);
End;
PreviewWindow := Result;
End;
Теперь окна созданы используя вызовы API. Я удалил проверку ошибки, но обычно все проходит хорошо, особенно в этом типе приложения.Теперь Вы можете погадать, как мы получим handle родительского окна предварительного просмотра ? В действительности, это совсем просто: Windows просто передает handle в командной строке, когда это нужно. Таким образом: Procedure RunPreview;
Var
R : TRect;
PreviewWindow : hWnd;
Msg : TMsg;
Dummy : Integer;
Begin
IsPreview := True;
PreviewWindow := StrToInt(ParamStr(2));
GetWindowRect(PreviewWindow,R);
CreateScreenSaverWindow(R.Right-R.Left,R.Bottom-R.Top,PreviewWindow);
CreateThread(nil,0,@PreviewThreadProc,nil,0,Dummy);
While GetMessage(Msg,0,0,0) do Begin
TranslateMessage(Msg); DispatchMessage(Msg);
End;
End;
Как Вы видите, window handle является вторым параметром (после "-p").Чтобы "выполнять" хранителя экрана - нам нужна нить. Это создается с вышеуказанным CreateThread. Процедура нити выглядит примерно так: Function PreviewThreadProc(Data : Integer) : Integer; StdCall;
Var R : TRect;
Begin
Result := 0; Randomize;
GetWindowRect(PreviewWindow,R);
MaxX := R.Right-R.Left; MaxY := R.Bottom-R.Top;
ShowWindow(PreviewWindow,sw_Show); UpdateWindow(PreviewWindow);
Repeat
InvalidateRect(PreviewWindow,nil,False);
Sleep(30);
Until QuitSaver;
PostMessage(PreviewWindow,wm_Destroy,0,0);
End;
Нить просто заставляет обновляться изображения в нашем окне, спит на некоторое время, и обновляет изображения снова. А Windows будет посылать сообщение WM_PAINT на наше окно (не в нить!). Для того, чтобы оперировать этим сообщением, нам нужна процедура:Function PreviewWndProc(Window : hWnd; Msg,WParam,
LParam : Integer): Integer; StdCall;
Begin
Result := 0;
Case Msg of
wm_NCCreate : Result := 1;
wm_Destroy : PostQuitMessage(0);
wm_Paint : DrawSingleBox; { paint something }
wm_KeyDown : QuitSaver := AskPassword;
wm_LButtonDown, wm_MButtonDown, wm_RButtonDown, wm_MouseMove :
Begin
If (Not IsPreview) Then Begin
Dec(MoveCounter);
If (MoveCounter <= 0) Then QuitSaver := AskPassword;
End;
End;
Else Result := DefWindowProc(Window,Msg,WParam,LParam);
End;
End;
Если мышь перемещается, кнопка нажала, мы спрашиваем у пользователя пароль:Function AskPassword : Boolean;
Var
Key : hKey;
D1,D2 : Integer; { two dummies }
Value : Integer;
Lib : THandle;
F : TVSSPFunc;
Begin
Result := True;
If (RegOpenKeyEx(hKey_Current_User,'Control Panel\Desktop',0,
Key_Read,Key) = Error_Success) Then
Begin
D2 := SizeOf(Value);
If (RegQueryValueEx(Key,'ScreenSaveUsePassword',nil,@D1,
@Value,@D2) = Error_Success) Then
Begin
If (Value 0) Then Begin
Lib := LoadLibrary('PASSWORD.CPL');
If (Lib > 32) Then Begin
@F := GetProcAddress(Lib,'VerifyScreenSavePwd');
ShowCursor(True);
If (@F nil) Then Result := F(PreviewWindow);
ShowCursor(False);
MoveCounter := 3; { reset again if password was wrong }
FreeLibrary(Lib);
End;
End;
End;
RegCloseKey(Key);
End;
End;
Это также демонстрирует использование registry на уровне API. Также имейте ввиду, как мы динамически загружаем функции пароля, используя LoadLibrary. Запомните тип функции?TVSSFunc ОПРЕДЕЛЕН как: Type TVSSPFunc = Function(Parent : hWnd) : Bool; StdCall; Теперь почти все готово, кроме диалога конфигурации. Это запросто: Procedure RunSettings; Var Result : Integer; Begin Result := DialogBox(hInstance,'SaverSettingsDlg',0,@SettingsDlgProc); If (Result = idOK) Then SaveSettings; End;Трудная часть -это создать диалоговый сценарий (запомните: мы не используем здесь Delphi формы!). Я сделал это, используя 16-битовую Resource Workshop (остался еще от Turbo Pascal для Windows). Я сохранил файл как сценарий (текст), и скомпилированный это с BRCC32: SaverSettingsDlg DIALOG 70, 130, 166, 75
STYLE WS_POPUP | WS_DLGFRAME | WS_SYSMENU
CAPTION "Settings for Boxes"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK", 5, 115, 6, 46, 16
PUSHBUTTON "Cancel", 6, 115, 28, 46, 16
CTEXT "Box &Color:", 3, 2, 30, 39, 9
COMBOBOX 4, 4, 40, 104, 50, CBS_DROPDOWNLIST | CBS_HASSTRINGS
CTEXT "Box &Type:", 1, 4, 3, 36, 9
COMBOBOX 2, 5, 12, 103, 50, CBS_DROPDOWNLIST | CBS_HASSTRINGS
LTEXT "Boxes Screen Saver for Win32 Copyright (c) 1996 Jani
Jдrvinen.", 7, 4, 57, 103, 16,
WS_CHILD | WS_VISIBLE | WS_GROUP
END
Почти также легко сделать диалоговое меню:Function SettingsDlgProc(Window : hWnd; Msg,WParam,LParam : Integer): Integer; StdCall;
Var S : String;
Begin
Result := 0;
Case Msg of
wm_InitDialog : Begin
{ initialize the dialog box }
Result := 0;
End;
wm_Command : Begin
If (LoWord(WParam) = 5) Then EndDialog(Window,idOK)
Else If (LoWord(WParam) = 6) Then EndDialog(Window,idCancel);
End;
wm_Close : DestroyWindow(Window);
wm_Destroy : PostQuitMessage(0);
Else Result := 0;
End;
End;
После того, как пользователь выбрал некоторые установочные параметры, нам нужно сохранить их.Procedure SaveSettings;
Var
Key : hKey;
Dummy : Integer;
Begin
If (RegCreateKeyEx(hKey_Current_User,
'Software\SilverStream\SSBoxes',
0,nil,Reg_Option_Non_Volatile,
Key_All_Access,nil,Key,
@Dummy) = Error_Success) Then Begin
RegSetValueEx(Key,'RoundedRectangles',0,Reg_Binary,
@RoundedRectangles,SizeOf(Boolean));
RegSetValueEx(Key,'SolidColors',0,Reg_Binary, @SolidColors,SizeOf(Boolean));
RegCloseKey(Key);
End;
End;
Загружаем параметры так:Procedure LoadSettings;
Var
Key : hKey;
D1,D2 : Integer; { two dummies }
Value : Boolean;
Begin
If (RegOpenKeyEx(hKey_Current_User,
'Software\SilverStream\SSBoxes',0,
Key_Read,
Key) = Error_Success) Then Begin
D2 := SizeOf(Value);
If (RegQueryValueEx(Key,'RoundedRectangles',nil,@D1,
@Value, @D2) = Error_Success) Then
Begin
RoundedRectangles := Value;
End;
If (RegQueryValueEx(Key,'SolidColors',nil,@D1,
@Value,@D2) = Error_Success) Then
Begin
SolidColors := Value;
End;
RegCloseKey(Key);
End;
End;
Легко? Нам также нужно позволить пользователю, установить пароль. Я честно не знаю почему это оставлено разработчику приложений ! Тем не менее:Procedure RunSetPassword;
Var
Lib : THandle;
F : TPCPAFunc;
Begin
Lib := LoadLibrary('MPR.DLL');
If (Lib > 32) Then Begin
@F := GetProcAddress(Lib,'PwdChangePasswordA');
If (@F nil) Then F('SCRSAVE',StrToInt(ParamStr(2)),0,0);
FreeLibrary(Lib);
End;
End;
Мы динамически загружаем (недокументированную) библиотеку MPR.DLL, которая имеет функцию, чтобы установить пароль хранителя экрана, так что нам не нужно беспокоиться об этом.TPCPAFund ОПРЕДЕЛЕН как: Type TPCPAFunc = Function(A : PChar; Parent : hWnd; B,C : Integer) : Integer; StdCall; (Не спрашивайте меня что за параметры B и C ! :-) Теперь единственная вещь, которую нам нужно рассмотреть, - самая странная часть: создание графики. Я не великий ГУРУ графики, так что Вы не увидите затеняющие многоугольники, вращающиеся в реальном времени. Я только сделал некоторые ящики. Procedure DrawSingleBox;
Var
PaintDC : hDC;
Info : TPaintStruct;
OldBrush : hBrush;
X,Y : Integer;
Color : LongInt;
Begin
PaintDC := BeginPaint(PreviewWindow,Info);
X := Random(MaxX); Y := Random(MaxY);
If SolidColors Then
Color := GetNearestColor(PaintDC,RGB(Random(255),Random(255),Random(255)))
Else Color := RGB(Random(255),Random(255),Random(255));
OldBrush := SelectObject(PaintDC,CreateSolidBrush(Color));
If RoundedRectangles Then
RoundRect(PaintDC,X,Y,X+Random(MaxX-X),Y+Random(MaxY-Y),20,20)
Else Rectangle(PaintDC,X,Y,X+Random(MaxX-X),Y+Random(MaxY-Y));
DeleteObject(SelectObject(PaintDC,OldBrush));
EndPaint(PreviewWindow,Info);
End;
И последнее - глобальные переменные:Var IsPreview : Boolean; MoveCounter : Integer; QuitSaver : Boolean; PreviewWindow : hWnd; MaxX,MaxY : Integer; RoundedRectangles : Boolean; SolidColors : Boolean;Затем исходная программа проекта (.dpr). Красива, а!? program MySaverIsGreat;
uses
windows, messages, Utility; { defines all routines }
{$R SETTINGS.RES}
begin
RunScreenSaver;
end.
Ох, чуть не забыл! Если,
Вы используете SysUtils в вашем проекте (например фуекцию StrToInt) вы получите EXE-файл больше чем обещанный в 20k. :) Если Вы хотите все же иметь20k, надо как-то обойтись без SysUtils, например самому написать собственную StrToInt процедуру.Если все же очень трудно обойтись без использования Delphi-форм, то можно поступить как в случае с вводом пароля: форму изменения параметров хранителя сохранить в виде DLL и динамически ее загружать при необходимости. Т.о. будет маленький и шустрый файл самого хранителя экрана и довеска DLL для конфигурирования и прочего (там объем и скорость уже не критичны). Присылайте свои статьи по адресу delphi-faq@list.ru с темой 'Article' (без кавычек), и они будут опубликованы в ближайших выпусках рассылки. Также вы можете заполнить вот эту форму. Большая просьба: статью оформляйте в -txt или -doc формате и используйте -zip или -rar сжатие (без самораспаковки). |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Из данного раздела Вы можете скачать различные файлы: компоненты, plug-in'ы для Delphi, документацию по программированию, программы, игры, написанные на Delphi и всё остальное... Вы можете добавить свои файлы в данный раздел, будем очень признательны! Чтобы сделать это, пожалуйста, заполните форму на сайте. Когда администратор ответит Вам и даст согласие на добавление файла(ов), тогда Вы их и пришлёте. Убедительная просьба соблюдать все вышеописанные правила. В связи с обновлением сайта никакие из разделов не пополнены. Приведены ссылки и описания всех файлов, находящихся в данный момент на сайте.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Адрес раздела на сайте: http://www.delphi-faq.fatal.ru/modules.php?name=Friends. Здесь представлены ссылки на дружественные сайты нашего портала. Если вы тоже хотите стать нашим другом, разместите наш баннер на своём сайте. Подробнее о том, как это сделать, можно прочитать на странице данного раздела на нашем сайте (ссылка дана чуть выше). Узнать о всех наших друзьях более подробно вы сможете на той же странице... http://infomania2004.webhost.ru/ - Этот сайт создан для того, чтобы вы могли получить интересующую вас информацию с минимальными затратами сил и времени. Если вы не нашли здесь нужной информации, вы можете оставить заявку на ее поиск. Как только информация будет найдена, она появится на сайте, а вам сообщат об этом. http://www.basic.webhost.ru/ - Программирование на Basic & Visual Basic. На сайте Вы найдете множество примеров, статьи, исходники, ActiveX, а также многое другое! http://www.sashook.nm.ru/ - Игры, флешки, обои, компьютерные приколы. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
"Кто юзал мой логин и весь его выюзал?" * * * Компьютерная эзотерика: перед тем, как процессор сгорит, в его памяти * * * Слышь... это... www.zarplaty.net? * * * Дочь пpосит И-нетчика: * * * Сын программиста подходит к отцу и спрашивает: Присылайте свои "компьютерные" анекдоты по этой ссылке: Delphi-FAQ@list.ru и они обязательно будут опубликованы!
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Товарищи программисты! Проявляйте свою активность. Давайте помогать друг другу! |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Наш сайт: http://www.delphi-faq.fatal.ru/ E-mail: Delphi-FAQ@list.ru Страница рассылки: http://subscribe.ru/catalog/comp.soft.prog.delphifaq |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| http://subscribe.ru/
http://subscribe.ru/feedback/ |
Подписан адрес: Код этой рассылки: comp.soft.prog.delphifaq |
Отписаться |
| В избранное | ||
