|
Навигация
|
Главная » Delphi Советы по программированию на DELPHI (ч.1)Источник: articlesorg Михаил Христосенко Строку в нижний регистр. (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('произошло нажатие на кнопку'); Упростите свои Delphi-приложения - Части 3 и 4. Листер плагин на Borland Delphi 7 для начинающих. Вопросы и ответы по сертификации Delphi. Популярность Delphi продолжает расти. Программируем в Delphi. Главная » Delphi |
© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено. |