Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Вниз

Простейший Редактор свойств   Найти похожие ветки 

 
Ilg   (2004-11-21 14:32) [0]

Здравствуйте!
У меня написано несколько компонентов, имеющих свойство About...
Для этого свойства написан простейший редактор свойств, который просто выводит информацию о компоненте. При переходе с Delphi 5 на Delphi 7 компоненты не удалось установить - выдается сообщение, что не найден модуль DsgnIntf. Если удалить вызов этого модуля, то не удастся обратиться к классу TStringProperty.
Что делать, можно ли чем-то заменить класс TStringProperty в данном случае?
Заранее, Большое Спасибо!
Вот текст модуля одного из компонентов:
unit SVFormFill;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DsgnIntf;

type
 TSVFormFill = class(TComponent)
 private
   { Private declarations }
   FAbout:string;
   FTexture:TPicture;
   .
   .
   .
 protected
   { Protected declarations }
   procedure SetAbout(Value:string);
   procedure SetTexture(Value:TPicture);
   procedure FormPaint(Sender:TObject);
 public
   { Public declarations }
   constructor Create(aOwner:TComponent);override;
 published
   { Published declarations }
   property About:string read FAbout write SetAbout;
   property Texture:TPicture read FTexture write SetTexture;
 end;

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

procedure Register;

implementation

const
 CName:string="Компонент TSVFormFill для Delphi";
 CDescription:string="Компонент для ...";
 CVersion:string="Версия 2.0";

constructor TSVFormFill.Create(aOwner:TComponent);
var i:integer;
begin
inherited Create(aOwner);
.
.
.
About:="";

end;

procedure TSVFormFill.SetAbout(Value:string);
begin
FAbout:=CVersion;
end;

procedure TSVFormFill.SetTexture(Value:TPicture);
begin
FTexture.Assign(Value);
Form.Repaint;
end;

procedure TAboutProperty.Edit;
begin
SetValue("");
MessageBox(Application.Handle,
           PChar(CName+" ("+CVersion+")"+
                 #13"Автор: Волобуев С. А."#13#13+CDescription),
           "О компоненте...",MB_OK+MB_ICONINFORMATION);
end;

function TAboutProperty.GetAttributes:TPropertyAttributes;
begin
result:=[paDialog];
end;

procedure Register;
begin
 RegisterComponents("SV Компоненты", [TSVFormFill]);
 RegisterPropertyEditor(TypeInfo(string), TSVFormFill, "About", TAboutProperty);
end;

end.


 
Юрий Зотов ©   (2004-11-21 21:25) [1]

> Ilg   (21.11.04 14:32)  

> Что делать, можно ли чем-то заменить класс TStringProperty в
> данном случае?

Не надо его менять. В uses замените DsgnIntf на DesignEditors, а к секции requires пакета подколючите DesignIDE.dcp. Вcе.

А в GetAttributes не помешало бы добавить paReadOnly. Тогда и вызов SetValue из Edit не потребуется.
:о)


 
Ilg   (2004-11-22 21:05) [2]

Спасибо, Юрий Зотов!
Я все сделал, как было сказано, даже paReadOnly - Компоненты установились.
Но возникла новая проблема:
При компиляции проекта, содержащего данные компоненты возникла ошибка - не найден файл DesignEditors.pas. После добавления пути Source\ToolsAPI в список поиска возникла следующая ошибка - не найден файл Proxies (На него ссылается DesignEditors в разделе uses). Такой файл мне найти не удалось. Что делать?


 
Юрий Зотов ©   (2004-11-22 22:03) [3]

> Ilg   (22.11.04 21:05) [2]

> При компиляции проекта, содержащего данные компоненты возникла
> ошибка - не найден файл DesignEditors.pas

Потому что Вы все поместили в один пакет. Это нехорошо, но в D5 и ниже проходило, а начиная с D6 уже не проходит.

Пакет разбиваете на два: run-time и design-time.

RT-пакет содержит ТОЛЬКО код самих компонентов и больше НИЧЕГО. Ни один его модуль не должен ссылаться в uses ни на один модуль DT-пакета. В его секции Requires могут содержаться ТОЛЬКО run-time модули VCL.

Компилируется RT-пакет в любой каталог, доступный через пути поиска IDE, либо через переменную системного окружения Path. Инсталлировать в IDE его не нужно.

DT-пакет содержит процедуру Register, иконки компонентов и все design-time редакторы (свойств и компонентов), если такие есть. Любой его модуль может ссылаться в uses на любой модуль из RT-пакета. В его секцию Requires и подключается DesignIDE.dcp. Компилируется он куда угодно и должен инсталлироваться в IDE.

Таким образом, в конечные приложения будут подключаться только модули RT-пакета, в которых нет ссылок на DesignEditors - а тогда не потребуется и Proxies. Кроме того, в конечный проект не будут подтягиваться ненужные в run-time код и ресурсы из DT-пакета.


 
Ilg   (2004-11-22 23:32) [4]

Извините, я не очень понял... (или совсем не понял)
Как я понимаю, мне нужно:
1) Переписать модули компонентов так, чтобы они не содержали Register и описания редакторов свойств.
2) Все процедуры Register вынести в отдельный модуль.
3) Все редакторы свойств - в отдельный модуль.
4) В RT-пакет поместить все компоненты + что-то в Requires (Что? У меня сейчас там vcl и rtl)
5) В DT-пакет - все иконки компонентов, модули из п. 2),3) + что-то в Requires (DesignIDE.dcp+Что? Должен ли он ссылаться на RT?)

Что-то я запутался...
И еще RT и DT-пакеты создаются одинаково: я должен как-то пометить их, или будет понятно по содержимому?

А может, я все усложняю? (Простите, сталкиваюсь с этим впервые)


 
Юрий Зотов ©   (2004-11-23 00:10) [5]

У Вас сейчас так (на примере одного юнита с одним компонентом и одним редактором свойства):

unit MyComp;
interface
uses
 ..., DesignEditors; // Потребуется Proxies.
type
 TMyComp = class(...) // Компонент.
   ...
 end;
 TMyPropEdit = class(...) // Редактор свойства.
   ...
 end;
procedure Register;
implementation
{$R MyComp.res} // Иконка компонента для палитры.
... // Код компонента, редактора и процедуры Register.
end.

И этот юнит помещен в пакет MyPackage. Как видите, проект, использующий компонент будет требовать Proxies.

А надо сделать так. Разбиваем этот юнит на два:

unit MyCompRT;
interface
uses
 ...; // Уже без DesignEditors - поэтому Proxies не потребуется.
type
 TMyComp = class(...) // Компонент
   ...
 end;
// Уже без Register
implementation
// Уже без иконки
... // Здесь только код самого компонента.
end.

Этот юнит помещаем в пакет MyPackageRT, ставим в его опциях птичку Run-time only и компилируем в каталог, доступный по Path.

Пишем второй юнит:

unit MyCompDT;
interface
uses
 ..., DesignEditors, MyCompRT; // Потребуется Proxies.
type
 TMyPropEdit = class(...) // Редактор свойства.
   ...
 end;
procedure Register;
implementation
{$R MyComp.res} // Иконка компонента для палитры.
... // Здесь код редактора и процедуры Register.
end.

Этот юнит помещаем в пакет MyPackageDT, в его Requires добавляем DesignIDE и MyPackageRT, ставим в его опциях птичку Design-time only, компилируем в любой каталог и инсталлируем в IDE.

Вот и все. Как видите, в RT-пакет вошел код, используемый и приложениями, и самой Delphi, а в DT-пакет - код, используемый только самой Delphi. Приложения же к этому пакету не обращаются и поэтому им не будет нужен Proxies.


 
Ilg   (2004-11-24 13:43) [6]

Огромное Спасибо!


 
Стас   (2005-02-12 13:43) [7]

А вот у мя проблема: Создании пакета, и его установке, некоторые значения не найдены...


 
Стас   (2005-02-12 13:45) [8]

Undeclared identifier: "TPropertyAttributes"


 
Юрий Зотов ©   (2005-02-12 18:21) [9]

> Стас [8]

uses
"указать нужный модуль"



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

Форум: "Компоненты";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.049 c
1-1129365346
Jimm
2005-10-15 12:35
2005.11.06
Как заставить показываться Hint на неактивной форме ?


3-1127898294
Tab
2005-09-28 13:04
2005.11.06
транзакции в MySQL, ODBC


2-1129097058
Smolin
2005-10-12 10:04
2005.11.06
Строковые функции


1-1129549303
Trifle
2005-10-17 15:41
2005.11.06
Поменять надписи на кнопках MessageDlg?


1-1128935230
leonidus
2005-10-10 13:07
2005.11.06
Почему не удается восстановить буфер обмена ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский