![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Добавление published свойства
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 или че то так.