:::
FAQ Delphi :::
>>>
Gaist Endruy <<<
|
Код:
procedure
TForm1.FormShow(Sender: TObject);
begin
AnimateWindow(Handle, 500, AW_CENTER or AW_SLIDE);
end;
procedure
TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
AnimateWindow(handle, 500, AW_BLEND or AW_HIDE);
end;
|
Дополнительно:
hwnd
- Дескриптор
окна, которое анимируется. Вызывающий поток должен владеть
этим окном.
dwTime - Устанавливает
временя необходимое для того чтобы воспроизвести мультипликацию.
Указывается в миллисекундах.
dwFlags - Определяет тип мультипликации.
Этот параметр может состоять из одного или нескольких
значений расположенных ниже.
AW_SLIDE - Использует слайдовую
анимацию. По умолчанию используется анимационный ролик.
Этот флажок игнорируется тогда, когда пользуется с флажком
AW_CENTER.
AW_ACTIVATE - Активизирует окно
(при показе окна). Не используйте это значение совместно
с AW_HIDE.
AW_BLEND - Использует эффект постепенного
изменения прозрачности окна. Этот флажок может быть использован
только в том случае, если параметр hwnd -
окно верхнего уровня.
AW_HIDE - Скрывает окно. По умолчанию,
окно показывается на экран.
AW_CENTER - Делает вид окна сжатым
в точку, если используется флажок AW_HIDE или
раскрытым из точки до полного размера, если флажок
AW_HIDE не используется. Различные
предписывающие флаги не имеют никакого действия.
AW_HOR_POSITIVE - Анимирует окно
слева направо. Этот флажок может быть использован с роликом
или слайдом мультипликации. Он игнорируется, когда используется
с флажком AW_CENTER или
AW_BLEND.
AW_HOR_NEGATIVE - Анимирует окно
справа налево. Этот флажок может быть использован с роликом
или слайдом мультипликации. Он игнорируется, когда используется
с флажком AW_CENTER или
AW_BLEND.
AW_VER_POSITIVE - Анимирует окно
сверху вниз. Этот флажок может быть использованы с роликом
или слайдом мультипликации. Он игнорируется, когда используется
с флажком AW_CENTER или
AW_BLEND.
AW_VER_NEGATIVE - Анимирует окно
снизу вверх. Этот флажок может быть использован с роликом
или слайдом мультипликации. Он игнорируется, когда используется
с флажком AW_CENTER или AW_BLEND. |
Коментарий:
Если
на форме установлен компонент TImage, то это приведет
к критической ошибке!
Форма, анимироватся будет не правильно. Точнее, она
будет анимироваться правильно, но TImag, будет залит
серым фоном, - пока не закончится анимация формы. И
таким образом, анимацию формы практически не будет видно.
.::
Gaist Endruy ::.
|
|
Картинка
в качестве кнопки |
Код:
//
Вместо кнопки нужно поставить два компонента TImage
друг на друга. В первый загрузить первую картинку, а
в другой другую (Масло Автомобильное).
//
В событии onMouseDown первого
имага (TImage) пишем:
Image1.Visible:=false;
Image2.Visible:=true;
//
В событии onMouseUp первого
имага (TImage) пишем:
Image1.Visible:=true;
Image2.Visible:=false;
//
Ну и сразу ставим Image 2
> Visible:=false, чтобы
при появлении формы был виден только первый Image.
|
Коментарий:
Этот
метод есть очень хороший для того, чтобы использовать
картинку в качестве кнопки. Но, не смотря на то, что
таким образом будет выглядить все очень красиво, в этом
методе есть небольшие глюки.
Если
в скомпилированой программе, нажать на созданную нами
кнопочку с картинки, правую кнопку мыши, то таким образом
мы вызвем этот самый небольшой глюк, который для нас
и будет критической ошибкой. При нажатии на правой кнопкой
мыши по такой кнопочке, то вторая картинка, которую
мы скрыли, появиться, и больше не скроется, а еще она
заблокирует то действие (Команду), которое она должна
была выполнять. (Нужно будет перезагружать программу,
чтобы устранить этот глюк).
Вряд ли, не понимающему Юзеру, понравиться это! поетому,
я советую использовать такие кнопочки в About или там,
где Юзер не будет нажимать правую кнопку мыши. Лучше
напомнить и придупредить его об этом, чтобы потом не
было лишних слов.
.::
Gaist Endruy ::.
|
|
Защита
формы паролем реализованная в Delphi |
Все
что нам надо, это: выбрать пункт меню File
> New, в открывшемся диалоговом окне выберите закладку
Dialogs, щелкните на значке Password
Dialog и нажмите Ok. На
экране появится готовая форма запроса пароля с именем PasswordDlg.
На этой форме будут две кнопки: Ok
и Cancel, текстовое поле ввода
пароля с именем Password, метка
Label1 с надписью Enter
Password. Заменим свойство Caption
метки Label1 на более приятное
русскому глазу 'Введите пароль'.
Также поменяем свойство Caption
и для самой формы на 'Запрос пароля',
например.
Обратите внимание на свойство PasswordChar
поля ввода Edit равно
* (звездочке) - это означает, что при вводе все символы
будут заменены на звездочки.
Нам необходимо добиться, чтобы форма запроса пароля появлялась
на экран раньше основной формы. Это делается так. В обработчике
события OnShow главной формы нужно
написать такой код:
Этот
код запустит нашу форму запроса пароля (PasswordDlg)
перед основной. И сделает недоступной основную форму, до закрытия
формы запроса пароля. Теперь запустите программу, компилятор
спросит Вас хотите ли Вы добавить в Uses,
модуль второй формы, конечно же надо ответить, что хотите!
Далее поступим следующим образом. Пароль будет хранится в виде
константы в нашем приложении. При вводе правильного пароля будет
открываться главная форма, а при вводе неправильного пароля,
нажатии кнопки Cancel и других
попытках закрыть форму запроса будем завершать наше приложение.
Для этого напишем обработчик для события OnFormCloseQuery
для формы запроса. Здесь мы будем сравнивать содержимое
строки ввода пароля с нашей константой, которую объявим в этом
же обработчике. Таким образом получается такой код:
procedure
TPasswordDlg.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
const pass='GaistEndruy'; // Наш
праоль.
begin
if Password.Text = pass then CanClose:=true
else Application.Terminate;
end;
|
Вот
мы и реализовали самый простой способ защиты формы. Если хотите
сравнивать пароль без учета регистра, то нужно обе строки преобразовать,
например, в нижний регистр. Для этого надо поменять всего одну
строку:
if
Password.Text = pass then CanClose:=true
//
Надо заменить на:
if
lowerCase(Password.Text) = lowerCase(pass) then CanClose:=true
|
Теперь
попробуем защитить форму паролем, который будет храниться в
зашифрованном виде. Зашифруем пароль самым простым способом
- Xor. Для этого напишем свою функцию:
function
TPasswordDlg.xortext(text:string):string;
var key, longkey : string;
i : integer;
toto: char;
begin
key:='da'; // Ключ
for i := 0 to (length(text) div length(key)) do
longkey := longkey + key;
for i := 1 to length(text) do begin
toto := chr((ord(text[i]) XOR ord(longkey[i])));
result := result + toto;
end;
end;
|
Через свое
имя функция будет возвращать зашифрованную строку переданную
в параметре Text. Не забудьте объявить
эту функцию в разделе Public:
public
{ Public declarations }
function xortext(text:string):string;
|
Вот,
например, что получится, если зашифровать этой процедурой наш
"GaistEndruy":
†„Џ‹„Ќt.:'
Теперь поменяем обработчик события onFormCloseQuery,
описанный в первом пример, на такой:
procedure
TPasswordDlg.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
var pass:string;
begin
pass:=xortext('GaistEndruy'); //
Наш пароль.
if
xortext(Password.Text) = pass then CanClose:=true
else Application.Terminate;
end;
|
Как
Вы видите поменялось совсем не много, теперь пароль в зашифрованном
виде можно хранить например в каком-нибудь файле. Так что защищайте
Ваши формы (Программы).
|
Создание
заставок для ваших программ средствами Delphi |
Откройте
какое-нибудь свое приложение, к которому вы хотите добавить
заставку, или создайте новое (на чистом проще разбираться).
Теперь необходимо добавить в наш проект еще одну форму, которая
будет заставкой. Для этого нажмите File
> New Form и Delphi создаст
вам новую форму. Измените ее размеры как вам хочется. Потом
установите свойство Border Style
вашей формы в bsNone (у формы не
будет заголовка и системных кнопок), установите свойство Visible
в false. Свойтсво Position
должно быть poScreenCenter - это
значит, что форма появится по центру экрана. И чтобы не перепутать
эту форму ни с какой другой задайте ей имя Logo.
Настройка формы заставки произведена, теперь необходимо сделать,
чтобы по щелчку мышкой по этой форме или после нажатия клавиши
или по истечении 5 секунд форма-заставка закрывалась. Для этого
установите на форму Timer, его
свойству Interval задайте значение
5000 (форма будет закрываться через
5 секунд). В обработчик события
OnTimer напишите всего одно слово:
Close;
В обработчик события OnClick для
формы-заставки напишите тоже самое. Установите свойство формы
KeyPreview в true
(это делается для того, чтобы при нажатии любой клавиши вначале
реагировала форма, а затем тот элемент, который был в фокусе
в момент нажатия). А в обработчик события OnKeyPress
(для формы-заставки конечно же) опять-таки напишите close;
Форма-заставка готова полностью и теперь необходимо, чтобы она
запускалась перед главной формой. Для этого сделайте активной
вашу главную форму, перейдите на вкладку Events
в Object Inspector'e и выберите
событие OnShow. В обработчике этого
события надо написать следующее:
Меня иногда
спрашивают, чем отличаются процедуры show
и showmodal. У них только одно
принципиальное различие: если форма открылась методом Showmodal,
то пока она не закроется пользователь не сможет взаимодействовать
с остальными формами приложения. А если форма была открыта методом
Show, то пользователь легко может
перейти к любой форме приложения.
Итак, форма-заставка готова. Теперь мы слегка ее усовершенствуем.
Добавим такую же штуку, как в формах-заставках Microsoft
Office, а именно на форме будет показываться имя пользователя
и организация. Для этого разместите на форме-заставке две метки
(Label). Первую назовите UserName,
а вторую - Organization. Чтобы
это сделать мы воспользуемся реестром (там вообще очень много
интересного можно найти). Теперь откройте обработчик события
OnCreate для формы-заставки и объявите
там переменную R типа TRegistry,
а в раздел Uses всей программы
добавьте Registry. Теперь нам нужно
создать объект R:
R:=TRegistry.Create;
R.RootKey:=HKEY_LOCAL_MACHINE;
R.OpenKey('SOFTWAREMicrosoftWindowsCurrentVersion',
False); // Именно здесь эта информация
хранится.
|
Теперь необходимо прочитать
нужные строки из этого раздела реестра и присвоить их соответствующим
меткам:
UserName.Caption:=r.readstring('RegisteredOwner');
Organization.Caption:=r.readstring('RegisteredOrganization');
r.Free; // Надо уничтожить этот
объект, так как он нам больше не нужен
|
Таким образом
весь этот обработчик должен иметь примерно такой вид:
procedure
TLogo.FormCreate(Sender: TObject);
var R:Tregistry;
begin
R:=TRegistry.Create;
R.RootKey:=HKEY_LOCAL_MACHINE;
R.OpenKey('SOFTWAREMicrosoftWindowsCurrentVersion',
False);
UserName.Caption:=r.readstring('RegisteredOwner');
Organization.Caption:=r.readstring('RegisteredOrganization');
r.Free;
end;
|
Ну вот собственно и все что я
хотел вам рассказать о заставках. Теперь ваши программы будут
выглядеть более солидно. Но помните, что при создании небольших,
вспомогательных программ, объем которых не превышает килобайт
100-150 заставки лучше не использовать.
|
Как
обращаться к встроенным полосам прокрутки? |
procedure
Tform1.formcreate(sender: tobject);
var
i, maxwidth: integer;
begin
maxwidth := 0;
for i := 0 to lb1.items.count - 1 do
if maxwidth < lb1.canvas.textwidth(lb1.items.strings[i])
then
maxwidth := lb1.canvas.textwidth(lb1.items.strings[i]);
sendmessage(lb1.handle, lb_sethorizontalextent, maxwidth+2,
0);
end;
|
Приведённый
код определяет ширину в пикселях самой длинной строки списка.
Затем он использует сообщение lb_sethorizontalextent,
чтобы установить ширину горизонтального скролбара в пикселях.
Два дополнительных пикселя добавленные к maxwidth
служат для стрелки в правом углу list box-а.
|
Как
развернуть окно на весь экран? |
postmessage(application.handle,
wm_syscommand, sc_maximize, 1);
|
|
Вот,
хороший код. Может кому-то пригодится!? |
procedure
TForm1.Button1Click(Sender: TObject);
begin
showmessage('Computer
Locker - программа для блокирования компьютера'#13'Автор
Чуклинов Евгений aka Cj');
end;
|
|
Как
сделать гиперссылку в Delphi? |
procedure
TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(Handle,
'open', 'http://www.gaist-endruy.narod.ru', nil, nil,
SW_RESTORE);
end;
|
И
сразу в uses добавляем: ShellAPI;
Коментарий:
//
Также, ссылку в этом коде можно прописывать и на html
страницу, хранящуюся не на сервере, а на вашем компьютере!
Вот примеры:
'index.htm'
'Data/index.htm'
'../index.htm'
'../../index.htm'
// А также можно использовать другой
код для создания гиперссылки! Вот он:
procedure TForm1.Button1Click(Sender: TObject);
begin
WinExec('http://www.gaist-endruy.narod.ru',SW_SHOWNORMAL);
end;
А также, данным кодом (Ссылкой),
можно запускать не только html
и htm страницы, а и другие
файлы, приложения и т.д.
Вот пример:
'MyPrograms.exe'
|
|
Как
загружать текст со стороннего файла в мою программу в какой нибудь
компонент? |
Этот вопрос
я ставил на одном из форумов, на котором я частенько бываю.
Но мне на поставленый вопрос, ни кто не ответил. Толи программисты
не знали как это зделать, толи кому-то лень было помочь. После
того как я понял, что ответа уже не дождусь, я сам начал думать,
и конечно же что-то подобное и эффективное придумал!
Ставим на
форму компонент RichEdit что находится
на панеле Win32. Изменяем свойства
на нужные, присваеваем этому компоненту новое имя, к примеру
Edit и удаляем текст с Lines
(Инспектор обєктов > Свойства).
Теперь идем
к нашей форме и в событиях ищем и щелкаем два раза по OnActivate
и прописываем сам код. Все это выглядит так:
procedure
TForm1.FormActivate(Sender: TObject);
begin
Edit .Lines.LoadFromFile(ExtractFilePath(ParamStr(0))+'Text.txt');
end;
|
Коментарий:
Там
где в коде вы видите 'Text.txt',
- тут указан путь к нашему тексту, и файлу, откуда и будет
грузится текст при запуске нашего приложения. Путь можно
указывать по разному. К примеру такой: 'Data/Text/Text.txt'.
Если
вам нужно, чтобы текст грузился с какого нибудь друго-го
файла, и если нужно чтобы учитывался регистр формата текста,
а точнее: (Размер, формат, размещение, цвет и т.д.), то
вам нужно загружать текст с текстового файла вормата
*.rtf.
Для
этонго, все что вам нужно, это изменить формат загружаемого
файла. То есть поменять в коде вот это:
'Data/Text/Text.rtf'
Где Text.rtf
- имя и формат вашего файла.
Привечание!
Если вам захочется загружать текст с другого какого нибудь
файла, то не затрудняйте себя эксперементами. Больше ни
с какого формата текст не будет грузится. По крайней мере
этим методом.
.::
Gaist Endruy ::.
|
|
Как
загружать картинку (рисунок), с определенного директория при запуске
программы? |
Для этого, вам нужно поставить
на форму один или несколько TImage - этот компонент вы найдете
на панеле Additional > Image. Поставили?
Эдем дальше. Теперь для формы в обработчике событий OnActivate
пишем нужній код:
Image1.Picture.LoadFromFile('Gaist.bmp');
// Или:
Image2 .Picture.LoadFromFile('Gaist.ico');
|
Вот
и все. Но есть одна проблемка, - я не знаю как зделать так, чтобы
грузился другой формат рисунка (Картинки).
И еще одно, для TImage в свойствах нужно поменять AutoSize c False
в True и для Center нужно также поставить True.
|
Как
заменить стандартный курсор на свой? |
Для того
чтобы заменить стандартный курсор на свой, который будет виден
на главной форме, и при наведении на батон и т.д., нужно в обработчике
событий для формы в OnActivate прописать следующий код:
Screen.Cursors[5]
:= LoadCursorFromFile('Cursor.ani');
Screen.Cursor := 5;
|
Коментарий:
Наверняка,
вы зададите себе вопрос! А если в обработчике событий
OnActivate я уже прописал
код для загрузки рисунка или какой нибудь другой код,
то как прописать єтот, или добавить еще несколько?
Ето сделать очень просто и легко. Я приведу пример:
procedure
TLetter.FormActivate(Sender: TObject);
begin
Screen.Cursors[5] := LoadCursorFromFile('Cursor.ani');
Screen.Cursor := 5;
begin
Edit.Lines.LoadFromFile(ExtractFilePath(ParamStr(0))+'Text/001.rtf');
begin
Image1.Picture.LoadFromFile('Gaist.bmp');
begin
Image2
.Picture.LoadFromFile('Gaist.ico');
end;
end;
end;
end;
// Вообщем, сколько в обработчике
вы поставили begin столько
в конце кода нужно поставить и end;
А если это последняя строчка в коде, то нужно еще и закрыть
код END.
|
|
А
еще наверняка, вы зададите такой вопрос: |
Бывает так, что в приложении
мы используем не одну форму а несколько, но не все знают как
сделать ссылку на нее. К примеру, по мимо главной формы у вас
еще есть форма About и вы хотите, чтобы при нажатии на батон
запускалась она. Для этого есть такой код:
procedure
TForm1.Button1Click(Sender: TObject);
begin
About.ShowModal;
end;
//
А чтобы закрыть форму, используйте:
procedure
TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
|
|
При
написании єтого FAQ, вы просто не поверете, - но я очень
намучился.
Наверняка, вы засмеялись и задали себе вопрос: та что
тут было такого тяжелого? Ничего! Я начал его писать,
отредактировавши несколько строчек, меня злобный Юзер,
который нашел в Интернете какую-то новую программу "ломанул".
не просто ломанул, и все, он пидарас начал удалять удаленным
администратированием мои любимые песни которые, как вы
понимаеете хранились в директории под названием "Мои".
Чтобы сохранить хотя бы то, что осталось, я выключил компьютер.
Тоесть хотел его перезагрузить. неподумавши, я нажал кнопочку
resset. Все, темный экран. Блин, но я же сегодня снова
эксперементировал с Виндой, и эстественно некоторых файлов
не хватает, или изменены и т.д. Загрузить комп не получилось.
Я полез в шухляду. чтобы найти диск с виндой (с той самой
версией которая у меня и была установлена), блин, эго
нет. отдал другу.
Тогда я начал востанавливать всеми извесными способами,
ну и т.д. Но ничего не получалось. После чего я решил
сделать чистую установку, но уже старой винды. Тоже експишкы,
но не той версии. Я форматнул свой диск, установил, и
приступил к установке драйверов. Блин, драйвера с видео-картой
тоже не оказалось дома. Я ее тоже одолжил. Вот, целый
день мне пришлось работать без видео карты. с плавающими
окнами, и с медленной скоростью. Но зато с любимой музыкой
в наушниках.
Поэтому, если FAQ вам покажеться маленький, то вы уж меня
простите и поймите правильно. Мне просто надоело работать
с плавающими окошками. Но завтра уже будет все работать.
Но этот FAQ я уже заканчиваю тепер.
Если у вас будут какие-то вопросы по Delphi, то вы обращайтесь,
не стесняйтесь - помогу по мере возможного.
Удачи вам и всего хорошего!
|
|
|