пятница, 10 июня 2011 г.

Урок 12. Добавление в проект формы “О программе”


В предыдущем уроке я обещал рассказать о том, как добавить в проект, состоящий из одной формы, еще одну и из нее сделать форму “О программе”.
Наберитесь терпения, этот урок Delphi будет не таким простым, как предыдущий.
Приступим.
Откройте проект с программой “Таймер”, и выберите пункт меню
File - New - Form Delphi For Win 32. В проект будет добавлена новая форма.
В Инспекторе объектов измените свойства формы:
Caption - О программе,
Position - poScreenCenter (при открытии форма будет всегда выводиться в центре экрана).
Name - AboutFrm.
Visible - False (после создания форма будет оставаться невидимой)
KeyPreview - True (форма будет реагировать на нажатие клавишей).
Расположите на форме панель, несколько меток, гиперссылку и кнопку.
Сохраните модуль формы под именем About.pas.
Перейдите в раздел Implementation главной формы таймера, добавьте ключевое слово Uses и дайте описание модуля About в нем. В принципе, Вы вправе дать это описание выше, в разделе interface Uses, но... О разнице двух объявлений читайте в учебниках.
Откройте код проекта, воспользовавшись меню Project - View Source.
Найдите в тексте строчку:
Application.CreateForm(TAboutFrm, AboutFrm);.
выделите ее и вырежте (Ctrl-X) для того, чтобы новая форма, добавленная в проект, не создавалась и не выводилась на экран сразу после старта программы.
Перейдите в главную форму таймера, найдите заготовку процедуры, обрабатывающей вызов справки и вставьте этот оператор в тело данной процедуры.
Добавьте ниже два оператора:
AboutFrm.ShowModal;                        // Вывод формы на эран
// в модальном окне (другие окна недоступны)
AboutFrm.Free;                                   // Освобождение памяти
// после окончания работы с  формой
На этом урок можно закончить. Но! В наглядном видео уроке, который Вы можете посмотреть или скачать , показан еще один момент - удаления формы из проекта.
PS Полный текст модуля формы “О программе” приведен ниже:
unit about;
interface
uses Windows, Classes, Graphics, Forms, Controls, StdCtrls,
Dialogs, Buttons, ExtCtrls, SysUtils, OK_CANCEL, MyLabels, SHELLAPI,
MyLinkLabel, PrDLinkLabel;
type
TAboutFrm = class(TForm)
Panel1: TPanel;
ProgramIcon: TImage;
ProductName: TLabel;
Version: TLabel;
Copyright: TLabel;
MyVersion: TLabel;
Label1: TLabel;
MyOkButton1: TMyOkButton;                    // Кнопка с рисунком, 
// можно заменить на стандартную
PrDLinkLabel1: TPrDLinkLabel;
procedure MyOkButton1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
Function CurrentFileInfo(AFileName: string): string;      // Источник - База знаний Delphi
// Как вариант, можно взять здесь:
// http://www.delphisources.ru/pages/faq/base/versioninfo.html
public
{ Public declarations }
end;
var
AboutFrm: TAboutFrm;
implementation
{$R *.dfm}
Function TAboutFrm.CurrentFileInfo(AFileName: string): string;
{функция для того чтоб получить версию файла программы}
{запускать функцию с такими параметрами, если нужна версия своей программыFileVersion(Paramstr(0));}
// Компиллятор выдает некритическую ошибку при использовании этой функции
var
szName: array[0..255] of Char;
P: Pointer;
Value: Pointer;
Len: UINT;
GetTranslationString: string;
FFileName: PChar;
FValid: boolean;
FSize: DWORD;
FHandle: DWORD;
FBuffer: PChar;
begin
try
FFileName := StrPCopy(StrAlloc(Length(AFileName) + 1), AFileName);
FValid := False;
FSize := GetFileVersionInfoSize(FFileName, FHandle);
if FSize > 0 then
try
GetMem(FBuffer, FSize);
FValid := GetFileVersionInfo(FFileName, FHandle, FSize, FBuffer);
except
raise;
end;
Result := '';
if FValid then
VerQueryValue(FBuffer, '\VarFileInfo\Translation', p, Len)
else
p := nil;
if P <> nil then
GetTranslationString := IntToHex(MakeLong(HiWord(Longint(P^)),
LoWord(Longint(P^))), 8);
if FValid then
begin
StrPCopy(szName, '\StringFileInfo\' + GetTranslationString +
'\FileVersion');
if VerQueryValue(FBuffer, szName, Value, Len) then
Result := StrPas(PChar(Value));
end;
finally
try
if FBuffer <> nil then
FreeMem(FBuffer, FSize);
except
end;
try
StrDispose(FFileName);
except
end;
end;
end;
procedure TAboutFrm.FormActivate(Sender: TObject);
begin
MyVersion.Caption:=CurrentFileInfo(Paramstr(0));
ProductName.Caption:=Application.Title;
Label1.Caption:='Москва - 2010 год';
icon:=Application.Icon;
ProgramIcon.Picture.LoadFromFile('Clock.ico');
end;
procedure TAboutFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
end;
procedure TAboutFrm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of            // Start Case
VK_ESCAPE:
begin
if MessageDlg('Закрыть?',mtConfirmation, [mbYes]+[mbNo], 0)=6
then
close;
end;
else
End;                   // End case
end;
procedure TAboutFrm.MyOkButton1Click(Sender: TObject);
begin
close;
end;
end.

Что же дальше?
еще раз вернемся к вопросу удаления формы из проекта и  на основе формы “О программе” создадим компонент.

Комментариев нет:

Отправить комментарий