Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-53638
bespasian
2004-02-06 17:18
2004.02.17
Выделить строку другим цветом в DBGrid.


8-53656
Romio
2003-10-09 22:31
2004.02.17
Увеличение картинки


1-53447
evvcom
2004-02-09 13:26
2004.02.17
Правильный синтаксис inline asm


14-53758
Dzhuffin_Hally
2004-01-24 22:53
2004.02.17
Люди. Плз помогите програмку написать.


6-53665
Pavels
2003-12-15 12:54
2004.02.17
посылка письма из ActiveX





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский