::: 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.showmodal;

Этот код запустит нашу форму запроса пароля (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. В обработчике этого события надо написать следующее:

logo.showmodal;


Меня иногда спрашивают, чем отличаются процедуры 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, то вы обращайтесь, не стесняйтесь - помогу по мере возможного.
Удачи вам и всего хорошего!

.:: Gaist Endruy ::.
Андрей Иванович Гепенко