В предыдущем уроке я обещал рассказать о том, как добавить в проект, состоящий из одной формы, еще одну и из нее сделать форму “О программе”.
Наберитесь терпения, этот урок Delphi будет не таким простым, как предыдущий.
Приступим.
Наберитесь терпения, этот урок Delphi будет не таким простым, как предыдущий.
Приступим.
Откройте проект с программой “Таймер”, и выберите пункт меню
File - New - Form Delphi For Win 32. В проект будет добавлена новая форма.
File - New - Form Delphi For Win 32. В проект будет добавлена новая форма.
В Инспекторе объектов измените свойства формы:
Caption - О программе,
Position - poScreenCenter (при открытии форма будет всегда выводиться в центре экрана).
Name - AboutFrm.
Visible - False (после создания форма будет оставаться невидимой)
KeyPreview - True (форма будет реагировать на нажатие клавишей).
Caption - О программе,
Position - poScreenCenter (при открытии форма будет всегда выводиться в центре экрана).
Name - AboutFrm.
Visible - False (после создания форма будет оставаться невидимой)
KeyPreview - True (форма будет реагировать на нажатие клавишей).
Расположите на форме панель, несколько меток, гиперссылку и кнопку.
Сохраните модуль формы под именем About.pas.
Перейдите в раздел Implementation главной формы таймера, добавьте ключевое слово Uses и дайте описание модуля About в нем. В принципе, Вы вправе дать это описание выше, в разделе interface Uses, но... О разнице двух объявлений читайте в учебниках.
Перейдите в раздел Implementation главной формы таймера, добавьте ключевое слово Uses и дайте описание модуля About в нем. В принципе, Вы вправе дать это описание выше, в разделе interface Uses, но... О разнице двух объявлений читайте в учебниках.
Откройте код проекта, воспользовавшись меню Project - View Source.
Найдите в тексте строчку:
Найдите в тексте строчку:
Application.CreateForm(TAboutFrm, AboutFrm);.
выделите ее и вырежте (Ctrl-X) для того, чтобы новая форма, добавленная в проект, не создавалась и не выводилась на экран сразу после старта программы.
Перейдите в главную форму таймера, найдите заготовку процедуры, обрабатывающей вызов справки и вставьте этот оператор в тело данной процедуры.
Добавьте ниже два оператора:
AboutFrm.ShowModal; // Вывод формы на эран
// в модальном окне (другие окна недоступны)
AboutFrm.Free; // Освобождение памяти
// после окончания работы с формой
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;
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;
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;
AboutFrm: TAboutFrm;
implementation
{$R *.dfm}
Function TAboutFrm.CurrentFileInfo(AFileName: string): string;
{функция для того чтоб получить версию файла программы}
{запускать функцию с такими параметрами, если нужна версия своей программыFileVersion(Paramstr(0));}
{функция для того чтоб получить версию файла программы}
{запускать функцию с такими параметрами, если нужна версия своей программы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;
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;
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;
begin
Action:= caFree;
end;
procedure TAboutFrm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Shift: TShiftState);
begin
case Key of // Start Case
VK_ESCAPE:
begin
if MessageDlg('Закрыть?',mtConfirmation, [mbYes]+[mbNo], 0)=6
then
close;
end;
begin
if MessageDlg('Закрыть?',mtConfirmation, [mbYes]+[mbNo], 0)=6
then
close;
end;
else
End; // End case
end;
procedure TAboutFrm.MyOkButton1Click(Sender: TObject);
begin
close;
end;
begin
close;
end;
end.
Что же дальше?
еще раз вернемся к вопросу удаления формы из проекта и на основе формы “О программе” создадим компонент.
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.