Форум: "Компоненты";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
ВнизДобавление published свойства Найти похожие ветки
← →
RASkov (2006-10-02 16:33) [80]
> DimaBr (02.10.06 16:10) [79]
Спасибо за индех. То что надо.
> Лучше всего организовать правильно, иначе плохо будет работать
> :)))
Это понятно.... :) я имел ввиду обработать OnMove и PtInRect() или еще как? и на 5 - ?
← →
DimaBr (2006-10-02 17:02) [81]
> я имел ввиду обработать OnMove и PtInRect() или еще как?
Да, естественно, только не OnMove, а procedure MouseMove(Shift: TShiftState; X, Y: Integer);override;
> 5 - Чем лучше?
Тем что в OwnedCollection уже реализован GetOwner и гораздо удобнее динамически менять класс элементов коллекции (хотя в вашем случае в этом не необходимости)
← →
RASkov (2006-10-04 02:52) [82]DimaBr, Вот еще такокой вот вопрос попробую сформулировать...
Как отловить в дизайнтайме выделение/выбор-невыбор itema в редакторе TCollection в инсп. объектов. (ниже конкретней попробую описать) Если это возможно конечно, я думаю возможно, но если это сложно то отставить пока.
Вообщем идея такая когда выделяю на форме свой компанент и жму кнопку[...] в поле MenuCollection - то открывается редактор этого поля - так вот хотелось бы при выборе элемента в коллекции (именно в дизайнтайме) группа итемов меню этого элемента, которые рисуются на канве вертикально или горизонтально, обводились пунктир. прямоугольником ну или еще как выделялись бы. Т.е. когда их (эл. коллекции) штуки 3 и более при выборе различать где он свои итемы рисует... Вот. Если вопрос не понятен, то не судьба мне...:( все равно спасибо.
← →
DimaBr (2006-10-04 09:19) [83]Не знаю точно, но думаю что со стандартным редактором ничего не выйдет.
Я бы ввёл в элемент коллекции свойство DesignerSelected: boolean и написал свой редактор для коллекции, который изменяет это свойство. А отрисовка уже просто. Вы можете написать свой редактор ?
← →
RASkov (2006-10-04 10:32) [84]
> Вы можете написать свой редактор ?
Я пока даже и незнаю что и ответить. Впервой с написанием компанентов и ихими "причендалами". А почему не смогу - смогу, но только потом:). По всей видимости пока отставить в эту сторону. Сейчас нужно немного доделать (на данный момент компанент умеет себя рисовать) функционал компанета а там посмотрим....
Ну я так понял, что не совсем просто это [82].
А вот при удалении элемента коллекции нужно перерисовать компанент - я так думаю нужно перекрыть метод коллекции (TOwnedCollection - он получше:) чутьчуть) Notify - наверное в перекрытом нужно просто вызвать inherited; и GetOwner.Invalidate; Его параметр (Notify(Item: TColl...Item;...) Item я так думаю не надо ни с кем сравнивать?
← →
DimaBr (2006-10-04 11:18) [85]Не знаю, отрабатывает ли Notify в дизайнере, можно и в TPicMenuCollectionItem.Destroy;
procedure TPicMenuCollectionItem.Destroy;
var AOwner: TPicMenus;
begin
AOwner := GetPicMenus;
inherited Destroy;
AOwner.Invalidate
end;
← →
RASkov (2006-10-04 14:02) [86]Блин, почему мне такая мысль не пришла на ум, ведь элементарно ж:)
DimaBr, незнаю уже как и благодарить.... постараюсь "мелочные" вопросы в этой ветке больше не спрашивать. Спасибо.
← →
RASkov (2006-10-08 15:53) [87]Вот такой вот вопрос - добавил свойство:
property FileSoundEnter: TFileName read FFileSoundEnter write SetFileSoundEnter;
ну и такое же для Leave.
как можно задать фильтр в диалоговом окне выбора файлов когда в инспекторе щелкаем [...] кнопку?
Или это опять ужасно сложно?
На данный момент компанент почти готов осталось реализовать клики по итемам, думаю с этим справлюсь. А прикольный получается компанентик:)
А реально ли в компаненте использовать библиотеку, к примеру BASS? (само собой эту версию BASS распростронять с компанентом), или никчему это.
Хотел сделать (т.е. уже сделал) звуки на смену итемов, ну и само собой есть свойство UseSound которое запрещает звуки.
Доделаю полностью выложу - но только в скомпелированном виде (стыдно за код:|) постараюсь с ридмиком, но если кого заинтересует.... хотя врядли, писал его для себя и в целях обучения:) DimaBr если нужно код - без разговора:)
ЗЫ 2 вопросика в посте. Спасибо.
← →
atruhin © (2006-10-08 16:20) [88]Создать свой PropertyEditor в твоем варианте не сложно.
← →
RASkov (2006-10-08 17:36) [89]> как можно задать фильтр в диалоговом окне выбора файлов
> когда в инспекторе щелкаем [...] кнопку?
Блин, щас вот второй раз прочитал... короче вот:
в published добавил вышеописанное свойство - в инспекторе для этого свойства прикрутился FileOpenDialog - как задать фильтр на типы файлов которые можно выбрать в нем *.wav;*.mp3... Вооще одного wav"a хватит.
← →
RASkov (2006-10-08 17:41) [90]> [88] atruhin © (08.10.06 16:20)
Да не приходилось никогда иметь дело с PropertyEditor, даже не знаю с какой стороны подойти... Если не трудно в трех словах с кодом - можно рассказать про это нехитрое дело. Создание своих редакторов свойств. Или как это делает например, RxLib, подменяет обычный/стандартный редактор Caption"ов на свой диалог?
← →
atruhin © (2006-10-09 03:49) [91]В двух словах не получится. Найди в сети книгу "Создание оригинальных компонент с среде Delphi 2" Рэй Конопка, там все хорошо описано, с примерами.
← →
DimaBr (2006-10-09 11:12) [92]
TFindFileProperty = class(TStringProperty)
function GetAttributes: TPropertyAttributes; override;
procedure Edit; override;
end;
{ TFindFilerProperty }
procedure TFindFolderProperty.Edit;
begin
inherited;
with TOpenDialog.Create(nil) do
try
Filter := "*.wav";
if Execute then SetValue(FileName);
finally
Free;
end;{try}
end;
function TFindFolderProperty.GetAttributes: TPropertyAttributes;
begin
Result := inherited GetAttributes + [paDialog];
end;
procedure Register;
begin
...
RegisterPropertyEditor(TypeInfo(string), TMyComponent, "NameProperty", TFindFileProperty);
end;
← →
RASkov (2006-10-09 13:32) [93]> [92] DimaBr (09.10.06 11:12)
Спасибо, помоему ничего сложного, вечером попробую.
procedure Register; я так понимаю одна и для регистрации компанента и свойства. Ну т.е. это все в одном модуле с компанентом писать? ответ наверное: можно но не обязательно. Верно?
А по второму вопросу про "звуки в компаненте"?
← →
DimaBr (2006-10-09 13:52) [94]
> Ну т.е. это все в одном модуле с компанентом писать?
Всё зависит от версии Delphi, для шестёрке и выше - отдельный модуль с регистрацией + DesignIDE.dcp в пакет
← →
RASkov (2006-10-09 14:16) [95]> [94] DimaBr (09.10.06 13:52)
Ух. Понял. У меня D7. А ведь я бы все в одном прикрутил и "заработало" бы:)
т.е. в пакете создать новый модуль в нем описать редактор свойства и добавить еще и DesignIDE.dcp в пакет? DesignIDE.dcp а че в нем? он тай большой. Спасибо.
← →
DimaBr (2006-10-09 15:01) [96]Начиная с шестёрки идёт разделение дизайн кода и Run-Time кода. Вы просто не сможете добавить DesignEditors (в котором описаны редакторы) и скомпилять в одном модуле - будет ругаться - не хватает Proxies.dcu
← →
RASkov (2006-10-09 16:52) [97]
> Начиная с шестёрки идёт разделение дизайн кода и Run-Time
> кода. Вы просто не сможете добавить DesignEditors (в котором
> описаны редакторы) и скомпилять в одном модуле - будет ругаться
> - не хватает Proxies.dcu
Я вот в прочих вопросик задавал - ответа толкового нет. Может есть соображения какие. Вопрос кое каким боком относится к компанентам.
http://delphimaster.net/view/15-1159716860/
и вот из последнего
> Paket и ни в каком другом (пакете) он не already, кроме
> как в тестовом проекте в модуле тестовой формы.....
Даже если и просто один пакет открыть в IDE и ничего более, иногда (даже без явных и неявных ошибках) т.е. проверяешь синтаксис нормально (не хинтов не варнингов ни errorов), произведешь несущественное изменение (сотрешь буковку и ее же напишешь), хочешь опять проверить синтаксис - и тут эта ошибка.:( Спасибо.
← →
RASkov (2006-10-10 01:10) [98]> помоему ничего сложного, вечером попробую.
Спасибо разобрался, минут 10 попарился с регистрацией... с толку сбило TypeInfo(string) у меня то TFileName; (TFileName = type string;)
И я у метода Edit убрал inherited, он ведь в цепочке TFindFileProperty = class(TStringProperty) вызывается непосредственно из TPropertyEditor в котором ничего путевого для OpenDialog не нашел, да еще TStringList там создается к чему то - незнаю... может я и неправ - убрав его.
DimaBr, вот уже я немного вник в редакторы свойст, спасибо большое за [92].
Близится к завершению мой чудо-юдо компанент.
>
И вот еще вопросик: как ограничить установку моего компанента только в D7?
Потому, что делал его в D7, а заморачиваться с дерективами пока нехочу.
Знаю, что это грубое решение... но пока учусь сойдет, тем более для себя его делал. Хотя сам компанент использует
Windows, SysUtils, Classes, Graphics, Controls; У меня нет уверенности, что везде они одинаковые... да еще редактор свойства
SysUtils, DesignIntf, DesignEditors, PicMenu;
То что подчеркнул сомнительные; А может я зря переживаю?
← →
DimaBr (2006-10-10 08:20) [99]
> А может я зря переживаю?
Зря, если не будите устанавливать на < Delphi 6
← →
RASkov (2006-10-10 15:44) [100]> [99] DimaBr (10.10.06 08:20)
Ну дык если кто нить попросит компанент а у него D4 или ниже?
Точнее выложу в инете для "ознакомления" без исходников:) ну и чебы ...
Ведь как то можно вопрос решить?:) Не, ну да ладно, я не сильно за это переживаю:)
← →
RASkov (2006-10-10 15:45) [101]DesignIntf в D4 такого нет помоему, там вроде DsgnInf или че то так.
← →
RASkov (2006-10-10 16:11) [102]> Не, ну да ладно, в данный момент я не сильно за это переживаю:)
Хотя потом нужно будет научится различать версии Delphi....Чебы проблем не было:)
← →
RASkov (2006-10-11 20:34) [103]Вот пару вопросиков появились:
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-12 04:13) [104]Кому интересно вот можно посмотреть что получается, в архиве только exe с использованием этого компанента
http://slil.ru/23237676 (610 Kb)
Вот скрин:
http://slil.ru/23237678 (110 Kb)
← →
RASkov (2006-10-12 04:25) [105]Только здесь мнения, просьба не высказывать, если необходимо можно завести ветку в прочих. Дабы эта ветка туда не перекочевала.
[103] в силе вопрос 2
по первому, я так понял, просто не получится.
← →
DimaBr (2006-10-12 08:39) [106]
> 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;
← →
DimaBr (2006-10-12 08:50) [107]Что значит "Масштаб надписей" ???
← →
RASkov (2006-10-12 11:56) [108]> [106] DimaBr (12.10.06 08:39)
Спасибо.
> [107] DimaBr (12.10.06 08:50)
Ну это чтоб при масштабировании и текст "надписи"(Caption) тоже масштобировался:)
← →
RASkov (2006-10-12 12:35) [109]Вечером попробую..., вот по первому вопросу я в принципе так и думал что через класс их объеденять нужно, поэтому теперь доступ к непосредственно свойству необходим будет через префикс MyGroup.<бывшее не в группе свойство>:=...; Так ведь? И также я думал что можно и попросче сделать, но наверное так и сделаю.
А вот в ответе на 2 чето немного запутался. GetPropertyName virtual должна вернуть имя свойства т.е. Result:="MenuCollection";?
И Designer.GetSelections(Selections); что, только если будет выделенно свойство откроется редактор? или же это можно заменить на GetComponent(0)? которое возврощает (0) первый компанент из выделенных вроде.
И наверное правельнее будет переписать все в метод Edit; (он же на двойной клик) а в ExecuteVerb - n: Edit;... так вродебы красивее.
← →
DimaBr (2006-10-12 13:03) [110]В конструкторе запоминаем какое свойство ищем (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 нет.
← →
DimaBr (2006-10-12 14:03) [111]
> Ну это чтоб при масштабировании и текст "надписи"(Caption) тоже масштобировался:)
При масштабировании чего ?
← →
Наиль © (2006-10-12 14:37) [112]С утра приготовил ответ на [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 15:49) [113]
> Наиль © (12.10.06 14:37) [112]
Вообще-то, как сейчас испробывал, у меня на D6 DblClick & Popup на двух выбранных компонентах не отрабатывается, поэтому можно голову не морочить и выбирать только первый.
P.S. Да кстати, свойство-коллекция должна быть published
← →
RASkov (2006-10-12 19:26) [114]Незнаю смотрели демку или нет, там (у моего компанента) есть свойство которое отвечает за "масштабирование всего компанента" (раз разговор зашол про масштаб [107], думаю смотрели демку), там есть галочка "Масштабирование", так вот если ее поставить и поменять размеры окна то... будет видно вообщем косяк с надписями.
> P.S. Да кстати, свойство-коллекция должна быть published
Оно published;
-------------------
> > или же это можно заменить на GetComponent(0)?
>
> Нет, поскольку допустим мы вибираем сначала например Label,
> а потом TPicMenus. Тогда у GetComponent(0) свойства MenuCollection
> нет.
Имелось ввиду они оба будут выделены? если так то по идее если сделать двойной клик по одному из выделенных то выделение со всех остальных снимается и производится действие по умолчанию на котором даблкликнули, если кликнуть правой кнопкой - то меню должно пренадлежать тому по которому кликнули а не всей группе. или же отсчет идет от того кого первым выделили?. Спасибо, сейчас буду пробовать все что почерпнул из новых ответов.
DimaBr, Наиль - Oгромное спасибо!
← →
RASkov (2006-10-13 03:27) [115]Ну вот вроде все основное сделал, осталось подрихтовать немного, задействовать некоторые свойства (AllowFixed, AllowAllUp, GroupIndex...) и можно хелп делать:) Спасибо Вам огромное.
А Масштаб надписей... да фик с ним.
С редактором разобрался. Свойства сгрупировал. Если все доделаю то выложу, но только не исходник а скомпилированный (про код см выше 87:)), кстати что для это надо выложить, т.е. для того чтобы установить компанент в Делфи нужна bpl и dcu модули с компанентом и редакторами?, а файл пакета dpk нужен? Сорри за такие вопросы про компаненты - первый мой компанент.
ЗЫ Моргает только зараза, если DoubleBuffered отключить. Но я думаю нужно вместо Invalidate - InvalidateRect прикрутить, все ректы есть в свойствах - только чето не получилось сначала... ну и забросил это гиблое дело.
Еще раз Огромное Спасибо всем кто не бросил меня в этой нелегкой битве:)
← →
RASkov (2006-10-13 03:40) [116]Т.е вот этих файлов достаточно будет для установки?
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 - вроде бы помню(знаю), а об остальных догадываюсь.
← →
DimaBr (2006-10-13 09:30) [117]Масштабирование.
Изменяйте размер шрифта, согласно размеру одного итема, неужеле это так сложно ?
При выходе с кнопки за пределы формы, кнопка остаётся нажатой. Вообще, хватит засорять форум, пишите в почту.
На счёт файлов для установки.
Необходимы: Reg.pas, dcr, dcu, dpk. Если используется редактор в виде отдельной формы, то + dfm, res,dcu формы.
Любопытно посмотреть на код (DymondBox(амперсант)yandex.ru)
← →
RASkov (2006-10-13 14:42) [118]> Изменяйте размер шрифта, согласно размеру одного итема,
> неужеле это так сложно ?
Итем может масштабироваться и по высоте и пошироте:)
> При выходе с кнопки за пределы формы, кнопка остаётся нажатой
Что верно то верно:(
> Reg.pas
?
> Любопытно посмотреть на код
Вот доделаю, нимного впорядок преведу и обязательно.
← →
RASkov (2006-10-13 17:02) [119]> [117] DimaBr (13.10.06 09:30)
Воощем отправил....
← →
RASkov (2006-10-13 23:19) [120]Если амперсант - это собака, то все равно помоему не правильный адрес, одно письмо вернулось с такой мессагой -- The following addresses had permanent fatal errors ---
Здесь в этой ветке есть мыло в моем синем нике.
Страницы: 1 2 3 вся ветка
Форум: "Компоненты";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
Память: 0.72 MB
Время: 0.055 c