Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.17;
Скачать: CL | DM;

Вниз

Как в компоненет создавать about?   Найти похожие ветки 

 
h0use ©   (2004-02-06 15:46) [0]

ВОт видел я в компонентах типа Jedy и Raze, что есть у каждой их компоненты свойство About и соотв. в нем выводится текущая версия библиотеки и если на него кликнуть, то появляется About.

Пытаюсь разобраться в процессе работы. Сначала создал форму с about, потом как у них там создал класс от TPropertyEditor в котором два метода (вызов на открытие того about и занесение в строку названия), затем засунул в компонету этот класс...но не работает...какой-то бред получается. Как надо делать правильно?

PS В тех компонетах, на котрых я учился все раскидано по нескольким файлам, в результате где-то я теряю нить логики.


 
Reindeer Moss Eater ©   (2004-02-06 15:47) [1]

File->New->AboutBox


 
h0use ©   (2004-02-06 15:54) [2]

Это и ежу понятно :) Я спрашиваю, как сделать, чтоб в IDE при кликанье на свойство About выскакивало соотв. окно


 
Юрий Зотов ©   (2004-02-06 16:08) [3]

> Я спрашиваю, как сделать, чтоб в IDE при кликанье на свойство
> About выскакивало соотв. окно

Само свойство типа string, объявляется со Stored=False. К нему пишется редактор свойства (наследник TStringProperty), в нем замещаются методы GetArrributes и Edit. Первый должен вернуть [inherited + paDialog], второй - создать, модально показать, а затем убить форму About. Сама форма делается обычным способом.

Чтобы версия отображалась прямо в Инспекторе Объектов, замещаются методы GetValue и SetValue. Первый возвращает нужную строку с версией, второй должен быть пустым - только begin и end.


 
Reindeer Moss Eater ©   (2004-02-06 16:16) [4]

Вот пример из APro.
Причем ничего не размазано по десяти файлам.

TApdVersionProperty = class(TStringProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure Edit; override;
end;

function TApdVersionProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;

procedure TApdVersionProperty.Edit;
begin
with TApdAboutForm.Create(Application) do begin
try
ShowModal;
finally
Free;
end;
end;
end;

procedure Register;
begin
{ register our Version property editors }
RegisterPropertyEditor(TypeInfo(string), TApdBaseComponent,
"Version", TApdVersionProperty);
.............


 
h0use ©   (2004-02-06 16:40) [5]

Так хорошо...а теперь как это все прикрутить к property About моей компонеты...именно здесь у меня затык


 
Reindeer Moss Eater ©   (2004-02-06 16:43) [6]

procedure Register;
begin
{ register our Version property editors } RegisterPropertyEditor(TypeInfo(string), TYourComponent,
"About", TYourAboutProperty);
.............


 
h0use ©   (2004-02-06 16:45) [7]

Это куда засунуть?


 
Reindeer Moss Eater ©   (2004-02-06 16:46) [8]

В твой компьютер засунь.


 
Reindeer Moss Eater ©   (2004-02-06 16:48) [9]

procedure Register;
...
Ты что, не знаком с процедурой регистрации компонента в палитре?
И как тогда твое творение там оказалось?


 
h0use ©   (2004-02-06 16:52) [10]

Я знаю что это за процедура...но я регистрирую в модуле с About и оно все равно не работает :(


 
Skier ©   (2004-02-06 17:01) [11]

>h0use © (06.02.04 16:52) [10]
Хм...вроде бы большой мальчик уже...


 
h0use ©   (2004-02-06 17:09) [12]

Я пишу :

TMyAboutBoxProperty = class(TStringProperty)
public
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
end;

TMyComponent = class(TComponent)
private
FAbout: TMyAboutBoxProperty;
published
property About: TMyAboutBoxProperty read FAbout write FAbout stored False;
end;

В результате в About у меня запись TMyAboutBoxProperty и никакие кликанья на ней не вызывают диалогового окна.

PS Все методы описаны по аналогии с [4]


 
Юрий Зотов ©   (2004-02-06 17:11) [13]

> h0use

IMHO, Вы рановато подумали об About - у Вас есть проблемы куда поважнее. Читайте про Property Editors и RegisterPropertyEditor.


 
h0use ©   (2004-02-06 17:15) [14]

Чиатал я, но так и не могу понять где я неверно делаю


 
Юрий Зотов ©   (2004-02-06 17:17) [15]

1. Не хватает SetValue.
2. Должен быть написан класс самой формы.
3. Приведите полный код методов редактора и процедуры Register.


 
Юрий Зотов ©   (2004-02-06 17:20) [16]

Блин, сразу не заметил....

Что сказано в [3]? Что свойство должно быть типа string. А вы что понаобъявляли?


 
h0use ©   (2004-02-06 17:22) [17]


unit MyComponent;

interface

uses
Windows,SysUtils,Classes,Graphics,Forms,Controls,StdCtrls,Buttons,ExtCtrls,
DesignEditors,DesignIntf;

const
MyVersionInfo="1.0.0.1";
MyProductInfo="bla-bla";
MyCopyright="bla-bla";

type

TMyAboutBoxProperty = class(TStringProperty)
public
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
end;

TMyAboutInfo = class(TForm)
Panel1: TPanel;
ProgramIcon: TImage;
ProductName: TLabel;
Version: TLabel;
Copyright: TLabel;
OKButton: TButton;
lbProd: TLabel;
lbVer: TLabel;
lbCopy: TLabel;
procedure FormShow(Sender: TObject);
procedure OKButtonClick(Sender: TObject);
end;

TMyComponent = class(TComponent)
private
FAbout: TMyAboutBoxProperty;
published
property About: TMyAboutBoxProperty read FAbout write FAbout stored False;
end;

procedure Register;

implementation

{$R *.dfm}

function TMyAboutBoxProperty.GetAttributes: TPropertyAttributes;
begin
Result := [ paDialog, paReadOnly ];
end;

function TMyAboutBoxProperty.GetValue: string;
begin
Result := MyVersionInfo;
end;

procedure TNSWAboutBoxProperty.Edit;
var
Dialog: TMyAboutInfo;
begin
Dialog := TMyAboutInfo.Create(Application);
try
Dialog.ShowModal;
finally
Dialog.Free;
end;
end;

procedure TMyAboutInfo.FormShow(Sender: TObject);
begin
lbProd.Caption:=MyProductInfo;
lbVer.Caption:=MyVersionInfo;
lbCopy.Caption:=MyCopyright+FormatDateTime("yyyy", Now);
end;

procedure TMyAboutInfo.OKButtonClick(Sender: TObject);
begin
Close;
end;

procedure Register;
begin
RegisterPropertyEditor(TypeInfo(string),TMyComponent,"About",TMyAboutBoxProperty);
end; // Register

end.

Вот собственно весь модуль


 
h0use ©   (2004-02-06 17:24) [18]


> Юрий Зотов © (06.02.04 17:20) [16]

Супер, спасибо, именно здесь собака и покопалась!


 
Юрий Зотов ©   (2004-02-06 17:31) [19]

TMyComponent = class(TComponent)
private
FAbout: string;
published
property About: string read FAbout write FAbout stored False;
end;

И уберите TMyComponent в ДРУГОЙ юнит (иначе в любую программу, которая его использует, потащится ресурс формы About, который ей на фиг не нужнен).

TMyAboutBoxProperty = class(TStringProperty)
public
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure SetValue(const Value: string); override;
end;

procedure T My AboutBoxProperty.Edit;
begin
with TMyAboutInfo.Create(nil) do
try
ShowModal
finally
Free
end
end;

procedure TMyAboutBoxProperty.SetValue(const Value: string); override;
begin
// Do nothing!!!
end;


 
Юрий Зотов ©   (2004-02-06 18:08) [20]

Еще момент. Поле FAbout не нужно, это лишний расход памяти. Лучше убрать его совсем и сделать так:
property About: string read GetAbout write SetAbout stored False;

GetAbout - возвращает MyVersionInfo;
SetAbout - ничего не делает.



Страницы: 1 вся ветка

Текущий архив: 2004.02.17;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.014 c
14-53717
Vitalik
2004-01-29 13:10
2004.02.17
Не открывается файл


1-53580
nester
2004-02-07 05:10
2004.02.17
Как файл впихнуть в сам exe-шник, чтобы потом извлечь


14-53774
Tornado
2004-01-30 10:43
2004.02.17
Где взять иконки


7-53794
beglec
2003-11-30 23:01
2004.02.17
Возможно ли получить более подробную информацию ?


14-53722
Clift
2004-01-23 19:08
2004.02.17
---|Ветка была без названия|---