Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Добавление published свойства


Страницы:   1 2 3 4 5 6

RASkov ©   (2006-09-10 05:27:00) 

Подскажите пожалуйста как при написании компанента добавить ему паблишед свойство чтобы в инспекторе объектов, значение свойства выбиралось из выподающего списка. В список должны добавляться компаненты имеющиеся на форме и имеющие Canvas. В написании компанент опыта мало т.е. нет.

TMyCompanent = class(TCompanent)
private
FCanvas: TCanvas;
....
published
property Canvas: TCanvas ....?????...
....
end;

Можно кусок примера как это делается. Т.е. если "кинуть" мой компанент на читую("голую") форму то в Инсп.Объектов у моего компанента в списке свойства Canvas должна быть Form1. Бросили на форму Image1 - и его в список. Ну и так всех у кого есть канва.


RASkov   (2006-10-13 23:19:00) [1]

Если амперсант - это собака, то все равно помоему не правильный адрес, одно письмо вернулось с такой мессагой -- The following addresses had permanent fatal errors ---
Здесь в этой ветке есть мыло в моем синем нике.


RASkov   (2006-10-13 17:02:00) [2]

> [117] DimaBr   (13.10.06 09:30)

Воощем отправил....


RASkov   (2006-10-13 14:42:00) [3]

> Изменяйте размер шрифта, согласно размеру одного итема,
> неужеле это так сложно ?

Итем может масштабироваться и по высоте и пошироте:)

> При выходе с кнопки за пределы формы, кнопка остаётся нажатой

Что верно то верно:(

> Reg.pas

?

> Любопытно посмотреть на код

Вот доделаю, нимного впорядок преведу и обязательно.


DimaBr   (2006-10-13 09:30:00) [4]

Масштабирование.
Изменяйте размер шрифта, согласно размеру одного итема, неужеле это так сложно ?

При выходе с кнопки за пределы формы, кнопка остаётся нажатой. Вообще, хватит засорять форум, пишите в почту.

На счёт файлов для установки.
Необходимы: Reg.pas, dcr, dcu, dpk.  Если используется редактор в виде отдельной формы, то + dfm, res,dcu формы.

Любопытно посмотреть на код (DymondBox(амперсант)yandex.ru)


RASkov   (2006-10-13 03:40:00) [5]

Т.е вот этих файлов достаточно будет для установки?
D7PicMenu.dcu (4 Kb)- хрен его знает, наверное D7PicMenu.dpk скомпилиный
PicMenu.dcu (39 Kb)- модуль с компанентом
PropEditPicMenu.dcu - модуль с редакторами
PicMenu.dcr (2 Kb)- иконка
D7PicMenu.bpl (48 Kb)- пакет
D7PicMenu.dcp (46 Kb)- хрен его знает, большой однако
там вот еще res, dof, cfg и dpk - они нужны?
подзабыл я стандартные расширения делфевые что в чем лежит, pas, dfm, dpr, dpk, dcu, bpl, res, dcr - вроде бы помню(знаю), а об остальных догадываюсь.


RASkov   (2006-10-13 03:27:00) [6]

Ну вот вроде все основное сделал, осталось подрихтовать немного, задействовать некоторые свойства (AllowFixed, AllowAllUp, GroupIndex...) и можно хелп делать:) Спасибо Вам огромное.
А Масштаб надписей... да фик с ним.
С редактором разобрался. Свойства сгрупировал. Если все доделаю то выложу, но только не исходник а скомпилированный (про код см выше 87:)), кстати что для это надо выложить, т.е. для того чтобы установить компанент в Делфи нужна bpl и dcu модули с компанентом и редакторами?, а файл пакета dpk нужен? Сорри за такие вопросы про компаненты - первый мой компанент.

ЗЫ Моргает только зараза, если DoubleBuffered отключить. Но я думаю нужно вместо Invalidate - InvalidateRect прикрутить, все ректы есть в свойствах - только чето не получилось сначала... ну и забросил это гиблое дело.
Еще раз Огромное Спасибо всем кто не бросил меня в этой нелегкой битве:)


RASkov   (2006-10-12 19:26:00) [7]

Незнаю смотрели демку или нет, там (у моего компанента) есть свойство которое отвечает за "масштабирование всего компанента" (раз разговор зашол про масштаб [107], думаю смотрели демку), там есть галочка "Масштабирование", так вот если ее поставить и поменять размеры окна то... будет видно вообщем косяк с надписями.

> P.S. Да кстати, свойство-коллекция должна быть published

Оно published;
-------------------


> > или же это можно заменить на GetComponent(0)?
>
> Нет, поскольку допустим мы вибираем сначала например Label,
> а потом TPicMenus
. Тогда у GetComponent(0) свойства MenuCollection
> нет.

Имелось ввиду они оба будут выделены? если так то по идее если сделать двойной клик по одному из выделенных то выделение со всех остальных снимается и производится действие по умолчанию на котором даблкликнули, если кликнуть правой кнопкой - то меню должно пренадлежать тому по которому кликнули а не всей группе. или же отсчет идет от того кого первым выделили?. Спасибо, сейчас буду пробовать все что почерпнул из новых ответов.
DimaBr, Наиль - Oгромное спасибо!


DimaBr   (2006-10-12 15:49:00) [8]


> Наиль ©   (12.10.06 14:37) [112]

Вообще-то, как сейчас испробывал, у меня на D6 DblClick & Popup на двух выбранных компонентах не отрабатывается, поэтому можно голову не морочить и выбирать только первый.

P.S. Да кстати, свойство-коллекция должна быть published


Наиль   (2006-10-12 14:37:00) [9]

С утра приготовил ответ на [103], но из-за неполадок с интернет не смог отправить. Т.к. первый вопрос достаточно ясен, то замечу только, что отличным примером является TLabeledEdit.
А вот по второму вопросу (вернее по ответам на него) есть замечания.
В [106] GetComponentProperties(Selections, [tkClass], Designer, GetPropProc)вызывает GetPropProc, для всех свойств всех выделеных компонент, следовательно FPropEdit.Editбудет вызван для последнего найденого свойства, а остальные изменены не будут.
Мой облегчёный вариант (без обработки исключений) предполагает, что двойной клик производится лишь по одному компоненту. Написан по аналогии с генофондом.
Пример запуска текущего редактора свойства Font.
procedure Register;

Type
TPanelEdit=class(TDefaultEditor)
private
 FFontProp:IProperty;
protected
 procedure CheckEdit(const Prop: IProperty);
public
 procedure Edit; override;
End;
---------------------------
procedure Register;
begin
RegisterComponentEditor(TPanel,TPanelEdit);
end;
{ TPanelEdit }

procedure TPanelEdit.Edit;
var
 Components: IDesignerSelections;
begin
// По аналогии с TDefaultEditor.Edit
Components := TDesignerSelections.Create;
Components.Add(Component);
FFontProp:=nil;
GetComponentProperties(Components, tkProperties, Designer, CheckEdit);
if FFontProp<>nil then FFontProp.Edit;
end;

procedure TPanelEdit.CheckEdit(const Prop: IProperty);
begin
if FFontProp<>nil then Exit;
if SameText(Prop.GetName,'FONT') then FFontProp:=Prop;

После регистрации сделай двойной щелщок по любой панели (TPanel)


DimaBr   (2006-10-12 14:03:00) [10]


> Ну это чтоб при масштабировании и текст "надписи"(Caption)  тоже масштобировался:)

При масштабировании чего ?


DimaBr   (2006-10-12 13:03:00) [11]

В конструкторе запоминаем какое свойство ищем (FPropInfo), далее перебираем все свойтства компонента и сравниваем является ли текущее свойство тем самым, которое ищем. Если да то запоминае его (FPropEdit). Далее, если такое свойство нашли, вызываем его редактор (FPropEdit.Edit).
Использование:

TPicMenusEditor = class(TColunmEditor)
  function GetPropertyName:string; override;
end;

function TPicMenusEditor.GetPropertyName:string;
begin
 Result := 'MenuCollection';
end;

procedure Register;
begin
.................
 RegisterComponentEditor(TPicMenus,TPicMenusEditor);
end;

Если подразумевается несколько пунктов меню, то перекрываем несколько методов, при этом первый будет - редактирование коллекции


type TPicMenusEditor = class(TColunmEditor)
  function GetPropertyName:string; override;
  procedure ExecuteVerb(Index: Integer); override;
  function GetVerb(Index: Integer): string; override;
  function GetVerbCount: Integer; override;
end;


> или же это можно заменить на GetComponent(0)?

Нет, поскольку допустим мы вибираем сначала например Label, а потом TPicMenus. Тогда у GetComponent(0) свойства MenuCollection нет.


RASkov   (2006-10-12 12:35:00) [12]

Вечером попробую..., вот по первому вопросу я в принципе так и думал что через класс их объеденять нужно, поэтому теперь доступ к непосредственно свойству необходим будет через префикс MyGroup.<бывшее не в группе свойство>:=...; Так ведь? И также я думал что можно и попросче сделать, но наверное так и сделаю.
А вот в ответе на 2 чето немного запутался. GetPropertyName virtual должна вернуть имя свойства т.е. Result:='MenuCollection';?
И Designer.GetSelections(Selections); что, только если будет выделенно свойство откроется редактор? или же это можно заменить на GetComponent(0)? которое возврощает (0) первый компанент из выделенных вроде.
И наверное правельнее будет переписать все в метод Edit; (он же на двойной клик) а в ExecuteVerb - n: Edit;... так вродебы красивее.


RASkov   (2006-10-12 11:56:00) [13]

> [106] DimaBr   (12.10.06 08:39)

Спасибо.

> [107] DimaBr   (12.10.06 08:50)

Ну это чтоб при масштабировании и текст "надписи"(Caption) тоже масштобировался:)


DimaBr   (2006-10-12 08:50:00) [14]

Что значит "Масштаб надписей" ???


DimaBr   (2006-10-12 08:39:00) [15]


> 1) можно ли как нибудь объеденять некоторые свойства(разного
> типа) в группы (т.е. чтоб в инспекторе был + и имя группы)

Можно. Это  делается так.

TMyGroup = class(TPersistent)
 private
   fMyProperty: integer;
 published
    property MyProperty: integer read fMyProperty write fMyProperty;
end;

TMyComponent = class(TComponent)
 private
   fMyGroup: TMyGroup
 published
   property MyGroup: TMyGroup read fMyGroup write SetMyGroup;
end;

constructor TMyComponent.Create();
begin
  inherited;
  fMyGroup := TMyGroup.Create;
end;

destructor;
begin
 fMyGroup.Free;
 inherited;
end;


> 2) Как реализовать двойной клик по компаненту в дизайнере,  что бы появилось окно свойства TCollection?


С позволения Юрия Зотова, выкладываю его творчество.

TColunmEditor = class(TComponentEditor)
private
  FPropInfo: PPropInfo;
  FPropEdit: IProperty;
  procedure GetPropProc(const PropEdit: IProperty);
public
  constructor Create(AComponent: TComponent; ADesigner: IDesigner); override;
  procedure ExecuteVerb(Index: Integer); override;
  function GetVerb(Index: Integer): string; override;
  function GetVerbCount: Integer; override;
  function GetPropertyName:string; virtual;
end;

{ TColunmEditor }
//  редактор свойства - коллекции (возвращаем имя свойства)
function TColunmEditor.GetPropertyName: string;
begin //
end;

constructor TColunmEditor.Create(AComponent: TComponent; ADesigner: IDesigner);
begin
 inherited;
 FPropInfo := GetPropInfo(GetComponent.ClassInfo, GetPropertyName, [tkClass])
end;

procedure TColunmEditor.GetPropProc(const PropEdit: IProperty);
begin
 if PropEdit.GetPropInfo = FPropInfo then FPropEdit := PropEdit
end;

procedure TColunmEditor.ExecuteVerb(Index: Integer);
var Selections: TDesignerSelections;
begin
 case Index of
  0: begin
       if (FPropEdit = nil) and (FPropInfo <> nil) then begin
         Selections := TDesignerSelections.Create;
         try
           Designer.GetSelections(Selections);
           GetComponentProperties(Selections, [tkClass], Designer, GetPropProc)
         finally
           Selections.Free
         end;{try}
       end;{if}
       if FPropEdit <> nil then FPropEdit.Edit
     end
  else inherited;
 end;{case}
end;

function TColunmEditor.GetVerb(Index: Integer): string;
begin
 case Index of
   0: Result := GetPropertyName+' Editor...';
   else Result := inherited GetVerb(Index);
 end;
end;

function TColunmEditor.GetVerbCount: Integer;
begin
 Result := inherited GetVerbCount + 1;
end;


RASkov   (2006-10-12 04:25:00) [16]

Только здесь мнения, просьба не высказывать, если необходимо можно завести ветку в прочих. Дабы эта ветка туда не перекочевала.
[103] в силе вопрос 2
по первому, я так понял, просто не получится.


RASkov   (2006-10-12 04:13:00) [17]

Кому интересно вот можно посмотреть что получается, в архиве только exe с использованием этого компанента
http://slil.ru/23237676(610 Kb)
Вот скрин:
http://slil.ru/23237678(110 Kb)


RASkov   (2006-10-11 20:34:00) [18]

Вот пару вопросиков появились:
1) можно ли как нибудь объеденять некоторые свойства(разного типа) в группы (т.е. чтоб в инспекторе был + и имя группы), ну типа как у свойства Font только без кнопки диалога? Или же опять редактор нужен, но тут уже походу непросто будет.
2) Как реализовать двойной клик по компаненту в дизайнере, что бы появилось окно свойства TCollection? ну т.е. в инспекторе у свойства типа TCollection есть кнопочка, так вот как даблкликнув по компаненту кликнуть по этой кнопочке?

Вот как сделал, а дальше чето несоображу:(
procedure TPicMenusEditor.Edit;
begin
 ExecuteVerb(1);
end;

procedure TPicMenusEditor.ExecuteVerb(Index: Integer);
begin
 case Index of
  0: MessageDlg('Author RASkov 2006'#13'Thanks DimaBr'#13
     +'and www.delphimaster.ru', mtInformation, [mbOk], 0);
  1: MessageDlg('Unknow edit', mtInformation, [mbOk], 0);
 end;
end;

function TPicMenusEditor.GetVerb(Index: Integer): String;
begin
 case Index of
  0: Result:='&About PicMenus';
  1: Result:='&Edit Menu';
 end;
end;

function TPicMenusEditor.GetVerbCount: Integer;
begin
 Result:=2;
end;


RASkov   (2006-10-10 16:11:00) [19]

> Не, ну да ладно, в данный моментя не сильно за это переживаю:)

Хотя потом нужно будет научится различать версии Delphi....Чебы проблем не было:)


RASkov   (2006-10-10 15:45:00) [20]

DesignIntf в D4 такого нет помоему, там вроде DsgnInf или че то так.


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо