Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Интернет: Образование, Работа и Бизнес" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Программирование на 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 |
Отписаться |
В избранное | ||