Советы по программированию на DELPHI (ч.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));

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

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

Возвращаемое значение: время в миллисекундах.
Пример использования:
edit1.text:=floattostr(getcurrenttime/1000)+' секунд с момента перезагрузки';

Вычисляем координаты курсора на экране. (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;

Определяем тип носителя. (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;

Как скопировать экран в 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;

Использование графики в 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 можно увеличить.

Добавление новых объектов в tabbednotebook

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

...
var btn : tbutton;
begin
btn := tbutton.create(self);
btn.parent:=twincontrol(tabbednotebook1.pages.objects[1]);
...
end;

Эмуляция нажатия клавиши.

Внутри приложения это выполняется достаточно просто с помощью вызова функции 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('Ф') равны между собой )

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

Если вам надо перехватить нажатие клавиш в вашей программе, тогда установите свойство 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).

Перехват нажатия клавиш в windows

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

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

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

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

if getasynckeystate(13) и if getasynckeystate(vk_return)

одинаковы.

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

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

releasecapture;
panel1.perform(wm_syscommand, $f012, 0);

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

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

Поиск в listbox'e

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

Поставьте на форму listbox и edit. Снова воспользуемся функцией perform. В обработчике события onchange для edit напишите это:

listbox1.perform(lb_selectstring,-1,longint(pchar(edit1.text)));

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

Мне часто задают этот вопрос, поэтому я и решил поделиться этим секретом с вами. Тем более чтобы узнать подключен компьютер к Интернету или работа идет в автономном режиме, нужен всего лишь один компонент: tcp (на странице internet, входит в пакет поставки client/server suite), если у вас нет этого компонента, то воспользуйтесь компонентом powersock. Разницы нет никакой.

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

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

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

Как программно кликнуть по speedbutton.

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

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

speedbutton1.perform(wm_lbuttondown, 0, 0);

speedbutton1.perform(wm_lbuttonup, 0, 0);

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

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


Страница сайта http://185.71.96.61
Оригинал находится по адресу http://185.71.96.61/home.asp?artId=3835