Форум: "Основная";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
ВнизКак в компоненет создавать 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c