30 советов по программированию в Delphi (Дельфи) часть 1 - Delphi, Pascal, ObjectPascal - Программирование
Навигация по сайту
Сайт:

Дополнительно:

Файловый архив:

Каталог статей:

Форум:


Категории раздела
Delphi, Pascal, ObjectPascal [18]
Программирование на Delphi, Pascal, ObjectPascal
C, C++, C# [7]
Программирование на C, C++, C#
ПХП (PHP) [6]
Все что связано с программированием на PHP.
DirectX [0]
Программирование с использованием графического API DirectX
OpenGL [0]
Программирование с использованием графического API OpenGL
Работа с базами данных (БД) [0]
Работа с базами данных MySQL и т.д. Разработка, теории, алгоритмы.
Сетевое программирование [0]
Сетевое программирование, организация сетей.
Программирование игр [0]
Все что связано с программированием игр, организацией их разработки.
Работа с мультимедиа данными [0]
Загрузка, обработка, воспроизведение и все что связано со звуком и видео.
Работа с устройсвами ввода и вывода [0]
Программирование устройств ввода и вывода. Работа с геймпадом, рулем и многим другим.
Программирование HTML 5 игр [0]
Программирование HTML 5 игр, html верстка, JS (JavaScript)
Остальное [0]
Все остальное, что не попадает ни под одну категорию.

Мини-Опрос
Какой платформой Вы пользуетесь?
Всего ответов: 915

Партнеры сайта
....

 Главная » Статьи » Программирование » Delphi, Pascal, ObjectPascal » 30 советов по программированию в Delphi (Дельфи) часть 1

30 советов по программированию в Delphi (Дельфи) часть 1

00:48
1. Строку в нижний регистр
2. Сколько времени прошло с момента перезагрузки
3. Вычисляем координаты курсора на экране
4. Определяем тип носителя
5. Как скопировать экран в TBitmap
6. Использование графики в ListBox'e
7. Добавление новых объектов в TabbedNotebook
8. Эмуляция нажатия клавиш
9. Перехват нажатия клавиш в программе
10. Перехват нажатия клавиш в Windows
11. Перемещение компонентов
12. Поиск в ListBox'e
13. Подключен ли компьютер к интернету
14. Как программно кликнуть по SpeedButton
15. Как организовать UNDO и REDO в TMemo
16. Обработка исключительных ситуаций
17. Реализация интерфейса Плавающих окон (Drag&Dock)
18. Список всех запущенных приложений
19. Преобразование BMP в JPG
20. Перезагрузка компьютера
21. Извлечение иконок из EXE и DLL
22. Директория вашей программы
23. Удаление директории, содержащей фалйы
24. Манипуляции с кнопкой ПУСК
25. Добавляем программу в авторан
26. Получение имени пользователя
27. Картинку с рабочего стола в TCanvas
28. Как рисовать прямо на экране
29. Как поменять обои Рабочего стола
30. Завершение другого приложения

Совет 1. Строку в нижний регистр. (API)

Для преобразования строки в нижний регистр нужно воспользоваться функцией AnsiLower.

Описание:

function AnsiLower(Str: PChar): PChar;

где Str - исходная нуль терминированная (то есть оканчивающаяся символом с номером #0) строка.

Возвращаемое значение - строка в нижнем регистре.

Функция находится в файле User32.dll

Пример применения:

edit1.text:=AnsiLower(PChar(edit1.text));

Подобным образом можно преобразовать строку в верхний регистр.

Для преобразования строки в верхний регистр нужно воспользоваться функцией AnsiUpper.

Описание:

function AnsiUpper(Str: PChar): PChar;

где Str - исходная нуль терминированная строка.

Возвращаемое значение - строка в нижнем регистре.

Функция находится в файле User32.dll

Пример применения:

edit1.text:=AnsiUpper(PChar(edit1.text));


Совет 2. Сколько времени прошло с момента перезагрузки. (API)

Чтобы определить сколько времени прошло с момента последней перезагрузки системы необходимо воспользоваться функцией GetCurrentTime: LongInt;

Возвращаемое значение: время в миллисекундах.

Пример использования:

edit1.text:=floatToStr(GetCurrentTime/1000)+' секунд с момента перезагрузки';

Совет 3. Вычисляем координаты курсора на экране. (API)

Решить эту задачу нам поможет функция: GetCursorPos(var Point: TPoint);

где, Point - принимающая переменная типа Tpoint.

Пример использования:

procedure TForm1.Timer1Timer(Sender: TObject);
var T:Tpoint;
begin
GetCursorPos(t);
Form1.Caption:=inttostr(t.x)+' - '+inttostr(t.y);
end;

Совет 4. Определяем тип носителя. (API)

Функция function GetDriveType(Drive: Integer): Word; поможет нам в этом.

где, Drive: проверяемый накопитель, то есть, A: это 0, B: это 1 и т.д.

Возвpащаемое значение:

Drive_Removable, Drive_Remote, Drive_Fixed или нуль, если накопитель не поддается определению; 1 - если не существует. См. раздел "Типы накопителей, Drive_" в главе 1.

функция находится в файле kernel32.dll

Пример использования:

procedure TForm1.Button1Click(Sender: TObject);
var x:integer;
begin
x:=GetDriveType(pchar(edit1.text));
case x of
0:edit1.text:='Не определен';
1:edit1.text:='не существует';
2:edit1.text:='съемный';
3:edit1.text:='жесткий';
end;
end;

Совет 5. Как скопировать экран в Tbitmap.

Следующая ниже функция скопирует изображение экрана в Tbitmap. Переменная Tbitmap должна быть инициализирована до вызова этой функции.

procedure GetScreenImage(bmp: TBitmap);
var bmp:Tbitmap;

begin

bmp:=TBitmap.Create;

bmp.Width := Screen.Width;
bmp.Height := Screen.Height;
BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,
GetDC(GetDesktopWindow), 0, 0, SRCCopy);
end;

Совет 6. Использование графики в Listbox

У класса TListBox (и TComboBox тоже) есть свойство Style, определяющее порядок рисования объекта. По-умолчанию оно установлено в lbStandard и за внешний вид объекта отвечает Windows. Если установить это значение в lbOwnerDrawFixed или lbOwnerDrawVariable, то можно несколько разнообразить внешний вид объекта. Разбираться лучше всего на конкретном примере, так что попробуем создать Listbox, который отображал имена графических файлов какой-нибудь директории вместе с картинками.

Чтобы заполнить Listbox надо написать следующее (чтобы каждый файл не прописывать можно просто послать сообщение):

procedure TForm1.Button1Click(Sender: TObject);

var

s : String;

begin

s:='c:\windows\*.bmp'#0;

ListBox1.Perform(LB_DIR, DDL_READWRITE, Longint(@s[1]));

end;

Здесь мы указали ListBox’у, какие файлы требуется отображать.

Устанавливаем свойство Style нужно установить в lbOwnerDrawFixed и создать обработчик события OnDrawItem:

procedure TForm1.ListBox1DrawItem(Control: TWinControl;

Index: Integer; Rect: TRect; State: TOwnerDrawState);

var

Bitmap: TBitmap;

Offset: Integer;

BMPRect : TRect;

begin

with (Control as TListBox).Canvas do

begin

{очищаем прямоугольник}

FillRect(Rect);

{считываем картинку}

Bitmap:=TBitMap.Create;

Bitmap.LoadFromFile('c:\windows\'+ListBox1.Items[Index]);

if Bitmap <> nil then begin

{вычисляем квадрат для показа картинки}

BMPRect:=Bounds(Rect.Left + 2, Rect.Top + 2,

Rect.Bottom-Rect.Top-2, Rect.Bottom-Rect.Top-2);

{рисуем картинку}

StretchDraw(BMPRect, BitMap);

Offset := Rect.Bottom-Rect.Top + 6;

end;

{выводим текст}

TextOut(Rect.Left+Offset,Rect.Top,Listbox1.Items[Index]);

{не забыть освободить!}

Bitmap.Free;

end;

end;

Чтобы картинки получились побольше, значение свойства ItemHeight можно увеличить.

Совет 7. Добавление новых объектов в TabbedNotebook

После создания нового объекта, нужно в его свойстве Parent указать требуемую страницу TabbedNotebook:

...

var

Btn : TButton;

begin

Btn := TButton.Create(Self);

Btn.Parent:=TWinControl(TabbedNotebook1.Pages.Objects[1]);

...

end;

Совет 8. Эмуляция нажатия клавиши.

Внутри приложения это выполняется достаточно просто с помощью вызова функции Windows API SendMessage() (можно воспользоваться и методом Perform того объекта (или формы), кому посылается сообщение о нажатой клавише). Попробуем на примере TMemo.

Способ 1. SendMessage:

SendMessage(Memo1.Handle, WM_CHAR, Ord(‘A’), 0);

Способ 2. Perform:

Memo1.Perform(WM_CHAR, Ord(‘A’), 0);

Следует заметить, что в качестве параметра для функции Ord нужно использовать символы только в верхнем регистре. (объявления Ord('A') и Ord('Ф') равны между собой )

Совет 9. Перехват нажатия клавиши в программе.

Если вам надо перехватить нажатие клавиш в вашей программе, тогда установите свойство KeyPreview для формы в True (события, связанные с клавиатурой будут вначале обрабатываться формой, а затем тем элементом, от которого поступило сообщение о нажатии клавиши). И в обработчике события OnMouseDown для формы напишите необходимый код. Пример:

if key = 27 then Application.Terminate;

Если пользователь нажмет Esc, то программа закроется. Предположим, что вам надо запретить нажатие клавиши Enter в вашей программе. Для этого в обработчике события OnKeyPress для формы (не забудьте про свойство KeyPreview, оно должно быть true) вам надо написать это:

if key=Chr(13) then key:=#0;

Функция Chr (x: Byte) возвращает символ, соответствующий его номеру (параметр x).

Совет 10. Перехват нажатия клавиш в WINDOWS

В этом примере я покажу вам как можно перехватить нажатие какой-нибудь клавиши в Windows, независимо является ли ваша программа активной в этот момент, или нет.

Поставьте на форму Timer и установите его свойство Interval равным 1. Теперь в обработчике события OnTimer напишите:

if GetAsyncKeyState(13)<>0 then showmessage('Вы нажали на Enter');

Поскольку параметром для приведенной функции является переменная типа Word, значит можно использовать и именованные константы. Объявления

if GetAsyncKeyState(13) и if GetAsyncKeyState(VK_RETURN)

одинаковы.

Совет 11. Перемещение компонентов.

Для того, чтобы переместить какой-нибудь компонент (визуальный конечно же:)) нам необходимо послать компоненту соответствующее сообщение, с помощью метода Perform. Это делается примерно так:

ReleaseCapture;
Panel1.Perform(WM_SYSCOMMAND, $F012, 0);

Все это надо записать в обработчик события OnMouseDown для нужного компонента, в данном случае это TPanel. И тогда при нажатии на компонент на экране появится контур компонента, когда вы выберите подходящее место и отпустите кнопку, компонент переместится туда!

Вот такой простой и красивый способ!

Совет 12. Поиск в ListBox'e

Наверно каждый сталкивался с TFontDialog' ом. Когда вы вводите первые буквы названия нужного шрифта, ListBox выделяет элемент, схожий с вводимым текстом. Это мы и попробуем реализовать.

Поставьте на форму ListBox и Edit. Снова воспользуемся функцией Perform. В обработчике события OnChange для Edit напишите это:

ListBox1.Perform(LB_SELECTSTRING,-1,longint(Pchar(Edit1.text)));

Совет 13. Подключен ли компьютер к Интернету.

Мне часто задают этот вопрос, поэтому я и решил поделиться этим секретом с вами. Тем более чтобы узнать подключен компьютер к Интернету или работа идет в автономном режиме, нужен всего лишь один компонент: TCP (на странице Internet, входит в пакет поставки Client/Server Suite), если у вас нет этого компонента, то воспользуйтесь компонентом PowerSock. Разницы нет никакой.

Итак, приступим. Ставите на форму компонент TCP. А потом в то место где вы хотите проверять на подключение напишите:

if TCP1.LocalIP <>'127.0.0.1' then showmessage('Мы в Интернете!!!')
else Showmessage('Автономная работа');

Если вы хотите все время делать эту проверку то поставьте на форму Timer с интервалом 1 и в обработчике события OnTimer напишите приведенный код.

Совет 14. Как программно кликнуть по SpeedButton.

Некоторые скажут используй SendMessage и все тут. Но нет! У SpeedButton'a нет свойства handle, поэтому sendMessage мы использовать не сможем.

Опять воспользуемся методом Perform (он не раз нас уже выручал :)). Где вам надо программно нажать на кнопку напишите это:

SpeedButton1.Perform(WM_LBUTTONDOWN, 0, 0);

SpeedButton1.Perform(WM_LBUTTONUP, 0, 0);

И чтобы можно было как-то отследить нажатие в обработчике события OnClick для вашей кнопки напишите:

showmessage('произошло нажатие на кнопку');

Совет 15. Как реализовать Undo и Redo в TMemo.

В текстовых редакторах, как правило, необходимо реализовать функции Undo и Redo. Ведь без них раьота с программой становится просто неудобной, а порой и опасной (можно случайно потерять какие-нибудь данные!!!). Поэтому в этот раз мы поговорим с вами о том как же это сделать.

Для начала нам надо узнать можно ли выполнить Undo. Для этого напишите:

If Memo1.Perform(EM_CANUNDO, 0, 0) <> 0 then

begin

{есть что отменять можно включить пункт меню с соответствующей надписью}

end;

Теперь реализуем функцию Undo:

Memo1.Perform(EM_UNDO, 0, 0);

Вставьте эту конструкцию между begin и end предыдущего примера.

Для того, чтобы реализовать функцию Redo, вам необходимо еще раз вызвать функцию Undo

Совет 16. Обработка исключительных ситуаций.

Чтобы программа производила хорошее впечатление она должна иметь не только удобный интерфейс, справочную систему и прочее, она должна еще и работать, работать в любом случае, независимо от действий пользователя!!!

Для начала вам надо продумать те места, программы, которые могут вызвать ошибку и попытаться проконтролировать этот участок кода. Например при вводе числа в текстовое поле необходимо делать проверку вводимых символов. Это можно осуществить с помощью оператора Case. В обработчик события OnKeyPress для Edit'a напишите:

case key of
'0'..'9': {указываем, что ничего не нужно делать, пользователь ввел число}
else key:=#0; {введенный символ не добавится в поле!}
end;

Есть и еще два блока операторов, которые помогут вам в обработке исключительных ситуаций.

Синтаксис первого блока:

try

{тут ваши операторы, которые могут повлечь появление ошибки}

finally

{а здесь операторы, которые выполняться в любом случае, независимо от ошибки}

Второй блок:

try

{тут ваши операторы, которые могут повлечь появление ошибки}

except

{код, который будет выполняться в случае ошибки}

Совет 17. Реализация интерфейса Плавающих окон (Drag & Dock)

В первую очередь для этого нам понадобится Дельфи начиная с 4-ой версии. Кстати примером такого интерфейса является редактор кода в Дельфи. Попробуем сделать подобный.

Поместите на форму четыре панели (TPanel). Первая будет приемником остальных. Для этого установите свойство DockSite первой панели в true. А у трех других панелей установите свойство DragMode в dmAutomatic, а свойство DragKind в Dock. Вот и все, запустите ваше приложение. При щелчке по какой-нибудь из трех панелей (не по первой) у нее появятся атрибуты плавающего окна и ее спокойно можно будет перемещать по экрану, а можно поместить внутрь первой панели.

Вот так мы реализовали интерфейс Drag & Dock не написав ни одной строчки кода!!!

Совет 18. Список всех запущенных приложений.

Для того, чтобы получить список всех запущенных приложений, поместите на форму ListBox и Button, обработчик события которой должен иметь примерно такой вид.

procedure TForm1.Button1Click(Sender: TObject);
VAR
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
begin
ListBox1.Clear;
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN {Hе показываем:}
IF (Wnd <> Application.Handle) AND {-Собственное окно}
IsWindowVisible(Wnd) AND {-Hевидимые окна}
(GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
THEN BEGIN
GetWindowText(Wnd, buff, sizeof(buff));
ListBox1.Items.Add(StrPas(buff));
END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
ListBox1.ItemIndex := 0;
end;

При нажатии на кнопку ListBox заполнится списком запущенных в данный момент приложений!

Совет 19. Преобразование BMP в JPG.

Для того, чтобы преобразовать картиеку в BMP-формате в JPG-формат вам необходимо подключить к программе (в USES) модуль JPEG.

Затем вам надо объявить переменную типа TJpegImage. Ну а затем проделать следующие действия:

Например при нажатии кнопки создадим jpeg-файл из bmp-файла. Обработчик события OnClick может иметь такой вид:

procedure TForm1.Button1Click(Sender: TObject);
var jpg:TJpegImage; {создаем переменную}
begin
image1.Picture.LoadFromFile('C:\Windows\1stboot.bmp'); {здесь загружаем какую-нибудь картинку, советую вам изменить имя картинки приведенное в этом примере!}
jpg:=TJpegImage.Create; {создаем экземпляр объекта}
jpg.Assign(image1.picture.graphic); {присваиваем переменной jpg картинку, хранящуюся в Image'e}
jpg.CompressionQuality:=75; {устанавливаем параметры качества. Должно быть от 1 до 100. Если 100, то качество наилучшее, 1 наихудшее}
jpg.Compress; {производим сжатие данных картинки}
jpg.SaveToFile('D:\1.jpg'); {и сохраняем уже готовую jpg картинку в файл}
jpg.Free; {уничтожаем объект, чтобы память не засорял!}
end;

Ну вот и все. Посмотрите, у класса TJpegImage есть еще много интересных свойств и методов. Обязательно поэкспериментируйте.

Совет 20. Перезагрузка компьютера.

Для того, чтобы перезагрузить Windows вам необходимо где-нибудь написать этот код:

ExitWindowsEx(EWX_FORCE+EWX_REBOOT,0);

А для того, чтобы выключить компьютер вам необходимо поместить в программе такой код:

ExitWindowsEx(EWX_SHUTDOWN,0);

а затем протянуться ручками к кнопке Power...

Совет 21. Извлечение иконок из EXE и DLL. (API)

Решить эту задачу нам поможет функция function ExtractIcon(hInstance, filename, iconindex):integer

где hinstance - глобальная переменная приложения, ее изменять не надо. Тип integer.

filename - имя программы или DLL из которой надо извлекать иконки. Тип pchar.

iconindex - порядковый номер иконки в файле (начинается с 0). В одном файле может находится несколько иконок. Тип integer.

Функция находится в модуле ShellApi, так что не забудьте подключить его в uses. Если эта функция возвратит ноль, значит иконок в файле нет.

Данная функция возвращает handle иконки, поэтому применять ее нужно так:

Image1.Picture.Icon.Handle:=ExtractIcon(hInstance, pchar(paramstr(0)), 0);

данное объявление нарисует в Image'e картинку вашего приложения.

Совет 22. Директория вашей программы.

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

Первое решение: воспользоваться таким объявлением Application.ExeName:string;

Второе решение: я чаще им пользуюсь paramstr(0); так же возвратит полный путь к вашей программе. Ну а чтобы узнать директорию вашей программы воспользуемся функцией ExtractFilePath(filename:string):string;

То есть узнать директорию можно так: ExtractFilePath(paramstr(0));

Совет 23. Удаление директории, содержащей файлы.

Предлагаю вашему вниманию одну интересную функцию, автора ее я не знаю, но функция работает! Привожу ее исходный код.

Function MyRemoveDir(sDir : String) : Boolean;
var
iIndex : Integer;
SearchRec : TSearchRec;
sFileName : String;
begin
Result := False;
sDir := sDir + '\*.*';
iIndex := FindFirst(sDir, faAnyFile, SearchRec);

while iIndex = 0 do begin
sFileName := ExtractFileDir(sDir)+'\'+SearchRec.Name;
if SearchRec.Attr = faDirectory then begin
if (SearchRec.Name <> '' ) and
(SearchRec.Name <> '.') and
(SearchRec.Name <> '..') then
MyRemoveDir(sFileName);
end else begin
if SearchRec.Attr <> faArchive then
FileSetAttr(sFileName, faArchive);
if NOT DeleteFile(sFileName) then
ShowMessage('Could NOT delete ' + sFileName);
end;
iIndex := FindNext(SearchRec);
end;

FindClose(SearchRec);

RemoveDir(ExtractFileDir(sDir));
Result := True;
end;

Для тех кто не очень дружит с функциями приведу пример ее использования. Например, в обработчике нажатия на кнопку напишите (где-нибудь повыше конечно же должна быть написана сама функция):

if NOT MyRemoveDir('C:\myDir') then
ShowMessage('Can NOT delete dir');

Если все пройдет нормально, то каталог будет удален, если нет, то появится сообщение. Данная функция удаляет также и скрытые и системные файлы.

Совет 24. Манипуляции с кнопкой ПУСК.

- Отключить пуск
EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'Button',nil),false);

- Включтиь пуск
EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'Button',nil),true);

- Нажать пуск
Var
hTaskBar, hButton: HWND;
o:boolean;
begin
hTaskBar:= FindWindow('Shell_TrayWnd', nil);
hButton:= GetWindow(hTaskBar, GW_CHILD);
SendMessage(hButton, WM_LBUTTONDOWN,
MK_LBUTTON,LoWord(5)+HiWord(Screen.Height-20));

end;

Совет 25. Добавляем программу в авторан.

Для того, чтобы добавить программу в автозапуск, нам необходимо будет добавить некоторые записи в соответствующий раздел реестра.

var reg: TRegistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.LazyWrite := false;
reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', false);
reg.WriteString('My program', Application.ExeName); {вместо My Program можно и что-нибудь другое вставить}
reg.CloseKey;
reg.free;
end;

Совет 26. Получение имени пользователя.

Для этого мы конечно же воспользуемся реестром. Там вообще прячется очень много полезной информации, но надо знать, где она лежит. Итак, чтобы использовать реестр, необходимо добавить модуль Registry в Uses. Затем надо объявить переменную типа TRegistry, а дальше открыть нужный ключ и прочитать оттуда все, что хочется. Например, в событии формы OnCreate напишите:

var R:TRegistry;
begin
R:=TRegistry.Create; {создаем экземпляр объекта}
R.RootKey:=HKEY_LOCAL_MACHINE;
R.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion', False);
{#сюда потом запишем необходимые операторы}

R.Free; {уничтожим объект}
end;

Чтобы прочесть какие-нибудь данные нужно воспользоваться функцией ReadString (если вам надо прочесть строку, чтобы прочитать число нужно воспользоваться функцией ReadInteger...). Допустим вы хотите, чтобы имя пользователя и название организации выводились с помощью метки. Тогда до оператора Free (после комментария #), впишите:

Label1.Caption:='Владелец: '+R.Readstring('RegisteredOwner')+#13+
'Организация: '+R.Readstring('RegisteredOrganization');

Чтобы получить директорию Windows нужно вызвать R.Readstring('SystemRoot');

Обязательно посмотрите этот ключ реестра, там много полезных данных.

Совет 27. Картинку с рабочего стола в Canvas.

Чтобы скопировать обои рабочего стола, нам придется воспользоваться функцией PaintDesktop. Приведу ее полное объявление:

Function PaintDesktop(HDC) : boolean;

То есть, чтобы картинку с рабочего стола и нарисовать ее на форме, нужно написать следующий код:

PaintDesktop(Form1.Canvas.Handle);

Таким образом ваша форма заполнится рисунком с рабочего стола. Если таковой не установлен, то форма окрасится в тот же цвет, что и цвет рабочего стола.

Совет 28. Как рисовать прямо на экране. (API)

Для того, чтобы нарисовать что-нибудь на экране или на чужом окне, необходимо получить контекст этого устройства с помощью функции API:

function GetDC(Wnd: HWnd): HDC;

где Wnd - указатель на нужное окно, или 0 для получения контекста всего экрана.

А затем рисуйте что душе угодно. Для примера поставьте на форму кнопку и обработчик ее события OnClick приведите к виду:

procedure TForm1.Button1Click(Sender: TObject);
VAR ScreenDC: hDC;
BEGIN
ScreenDC := GetDC(0); {получить контекст экрана}
Rectangle(ScreenDC,10,10,200,200);{рисуем квадрат}
ReleaseDC(0,ScreenDC); {освободить контекст}
end;

Совет 29. Как поменять обои рабочего стола.

Чтобы изменить обои на рабочем столе необходимо сделать изменения в файле настроек Win.Ini, записав туда путь к нужной bmp-картинке. Реализовать это можно при помощи объекта типа TRegIniFIle, чтобы можно было его использовать, надо в Uses добавить модули Registry и WinProcs. Допустим картинка на рабочем столе будет меняться по клику на кнопку. Тогда в обработчике события OnClick напишите:

procedure TForm1.Button1Click(Sender: TObject);
var
reg : TRegIniFile;
sWallpaperBMPPath:string;
bTile:boolean;
begin
// Изменяем ключи реестра
// HKEY_CURRENT_USER
// Control Panel\Desktop
// TileWallpaper (REG_SZ)
// Wallpaper (REG_SZ)
reg := TRegIniFile.Create('Control Panel\Desktop' );
with reg do begin

//путь к картинке, я думаю вам какой-нибудь другой захочется
sWallpaperBMPPath:='С:\Borland\Delphi 3\Images\BACKGRND\writing.bmp';
//По центру рабочего стола
bTile:=false;

WriteString( '', 'Wallpaper', sWallpaperBMPPath );
if( bTile )then begin
WriteString('', 'TileWallpaper', '1' );
end
else begin
WriteString('', 'TileWallpaper', '0' );
end;
end;
reg.Free;
// Оповещаем всех о том, что мы
// изменили системные настройки
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Nil, SPIF_SENDWININICHANGE );
end;

Совет 30. Завершение другого приложения.

Для того чтобы закрыть какое-нибудь приложение можно воспользоваться приведенной ниже функцией:

procedure KillProgram(Classname : pchar; WindowTitle : pchar);
const
PROCESS_TERMINATE = $0001;
var
ProcessHandle : THandle;
ProcessID: Integer;
TheWindow : HWND;
begin
TheWindow := FindWindow(Classname, WindowTitle);
GetWindowThreadProcessID(TheWindow, @ProcessID);
ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
TerminateProcess(ProcessHandle,4);
end;

То есть, чтобы завершить приложение вам необходимо знать либо classname либо заголовок этого окна. Привожу пример использования этой процедуры. Запустите графический редактор Paint. Его заголовок в начале такой: "Безымянный - Paint", поэтому вызов функции может быть таким:

KillProgram(nil,'Безымянный - Paint');

Совет 31. Увеличиваем экран.

Нам понадобится одна форма, один image, одна панель, кнопка, таймер и ползунок. Добавляем к форме картинку и панель. Размещаем остальные элементы управления на панели.
Код, наиболее важной части программы:
// переменные
var Srect,Drect,PosForme:TRect;
iWidth,iHeight,DmX,DmY:Integer;
iTmpX,iTmpY:Real;
C:TCanvas;
Kursor:TPoint;
// Увеличиваем экран, если приложение не свёрнуто в иконку
If not IsIconic(Application.Handle) then begin
// Получаем координаты курсора
GetCursorPos(Kursor);
// PosForm представляет прямоугольник с
// координатами Form (image control).
PosForme:=Rect(Form1.Left,Form1.Top,Form1.Left+Form1.Width,Form1.Top+Form1.Height);
//Показываем magnified screen
//если курсор за пределами формы.
If not PtInRect(PosForme,Kursor) then begin
// Далее код можно использовать для увеличения выбранной
// части экрана. С небольшими модификациями его можно
// использовать для уменьшения
// экрана
iWidth:=Image1.Width;
iHeight:=Image1.Height;
Drect:=Bounds(0,0,iWidth,iHeight);
iTmpX:=iWidth / (Slider.Position * 4);
iTmpY:=iHeight / (Slider.Position * 4);
Srect:=Rect(Kursor.x,Kursor.y,Kursor.x,Kursor.y);
InflateRect(Srect,Round(iTmpX),Round(iTmpY));
//Получаем обработчик(handle) окна рабочего стола.
C:=TCanvas.Create;
try
C.Handle:=GetDC(GetDesktopWindow);
//Передаём часть изображения окна в TImage.
Image1.Canvas.CopyRect(Drect,C,Srect);
finally
C.Free;
end;
end;
// Обязательно обрабатываем все сообщения Windows.
Application.ProcessMessages;
end; // IsIconic

Автор статьи: Михаил Христосенко .


Категория: Delphi, Pascal, ObjectPascal | Просмотров: 2268 | Добавил: ДядяВолк (11.08.2010) | Рейтинг: 0.0/0
Источник: http://quadrathell.cn.ua | Автор: Михаил Христосенко |
HTML ссылка на материал:
BB ссылка на материал:
Похожие материалы :
Возможно вам будет интересно:
Полезные функции и процедуры: часть 1 (0)
3D Rad - система сохранения №1. (0)
Создаем вертолет (2)
С чего начать создание игры для начинающих? (13)
Как сделать ходячий объект в Game maker. Для обсолютных нубов. (0)
Game Maker. Начало (1)
Немного о секретах озвучки. (2)
Полиморфизм, Инкапсуляция и Наследование (0)
О игрострое, движках и людях (1)
Функции D3D в Game Maker (2)
Инветарь на Game Maker (0)
Создание арканойда шаг за шагом в XNA Game Studio (0)
Физика (Blitz 3D) (0)
Создание наземного врага в платформере (2)
Создание Платформенной Игры Copyright 2001 by Mark Overmars (0)
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Мы в социальных сетях

Поиск
Поиск по всему сайту:
Поиск по разделу:

Панель пользователя
Здравствуйте, Гость


Ник:
Пароль:
Запомнить :

Ваш IP: 54.157.19.94

Случайные конструкторы

Случайные движки

Случайные статьи

Статистика
Онлайн всего: 5
Гостей: 5
Пользователей: 0

На сайте были:
FireOfSteel

При полном или частичном копировании материалов сайта ссылка на Make-Games.ru обязательна. Make-Games.ru © 2008 - 2016 Хостинг от uWeb
Топ Разработка игр Рейтинг@Mail.ru