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

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

Количество строк в выпадающем списке св-ва в Objeсе Inspector


Priest ©   (2005-07-05 17:47:00) 

Я создал компонент со свойством типа TComponent. Я хочу чтобы для данного свойства в выпадающем списке появлялось 20 значений. А то не очень удобно листать :)


Priest   (2005-07-08 09:59:00) [1]

Да нет.Есть все исходники Дримов. Только сейчас есть и более важные задачи чем делать длинный выпадающий список :)))


Ученик   (2005-07-07 22:20:00) [2]

>Priest   (07.07.05 09:27) [7]
И что пользуетесь компонентами без исходников ? :-)


Priest   (2005-07-07 09:27:00) [3]

>>Ученик
Вот точно так сделал и я. Я только написал Height := Screen.Height - Top-10 а то на весь экран не очень красиво. Только вот Dream Designer не понимает интерфейса ICustomPropertyListDrawing. Он всё равно по умолчанию прорисовывает 7 пунктов.


Ученик   (2005-07-06 23:12:00) [4]

Пример для TComponentProperty


unit Component1;

interface

uses
 SysUtils, Classes, Graphics;

type
 TComponent1 = class(TComponent)
 private
   { Private declarations }
   FMyProperty: TComponent;
 protected
   { Protected declarations }
 public
   { Public declarations }
 published
   { Published declarations }
   property MyProperty: TComponent read FMyProperty write FMyProperty;
 end;

procedure Register;

implementation

uses
 Controls, DesignIntf, Forms, Windows, DesignEditors, VclEditors;

type
 TMyPropertyEditor = class(TComponentProperty, ICustomPropertyListDrawing)
   procedure ListMeasureHeight(const Value: string; ACanvas: TCanvas;
                                var AHeight: Integer);
   procedure ListMeasureWidth(const Value: string; ACanvas: TCanvas;
                                var AWidth: Integer);
   procedure ListDrawValue(const Value: string; ACanvas: TCanvas;
                                const ARect: TRect; ASelected: Boolean);
 end;

procedure TMyPropertyEditor.ListMeasureHeight(const Value: string; ACanvas: TCanvas;
                            var AHeight: Integer);
begin

end;

procedure TMyPropertyEditor.ListMeasureWidth(const Value: string; ACanvas: TCanvas;
                            var AWidth: Integer);
begin

end;

procedure TMyPropertyEditor.ListDrawValue(const Value: string; ACanvas: TCanvas;
                           const ARect: TRect; ASelected: Boolean);
begin
 with TControlCanvas(ACanvas).Control do
   if Screen <> nil then
     if Height < Screen.Height - Top then
       Height := Screen.Height - Top;
 DefaultPropertyListDrawValue(Value, ACanvas, ARect, ASelected)
end;

procedure Register;
begin
 RegisterComponents('Samples', [TComponent1]);
 RegisterPropertyEditor(TypeInfo(TComponent), TComponent1, 'MyProperty', TMyPropertyEditor);
end;

end.


Priest   (2005-07-06 13:33:00) [5]

Попробовал я реализовать интерфейс ICustomPropertyListDrawing. Что ни один из его методов не вызывается. Видно где то ошибку сделал :(


Юрий Зотов   (2005-07-06 12:12:00) [6]

> Priest   (06.07.05 11:19) [3]

Насколько я понял, даже и копать уже не надо, надо только слегка изменить код примера. Например, так:

procedure TMyPropertyEditor.ListDrawValue(const Value: string; ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean);
begin
 TControlCanvas(ACanvas).Control.Height :=
   20 * (ARect.Bottom - ARect.Top);
 inherited
end;

Только нужно проверить, что произойдет, если высота списка окажется слишком большой для его размещения на экране.


Priest   (2005-07-06 11:19:00) [7]

>>Юрий Зотов ©   (05.07.05 18:49) [1]
Вы меня не поняли. Предположим у меня на форме 20 компонент. А высота выпадающего списка 7 строк. А я хочу сделать, чтобы выводились все 20 строк сразу.....

>>Ученик
Я так понимаю, что нужно копать в сторону интерфейса ICustomPropertyListDrawing...


Ученик   (2005-07-06 00:59:00) [8]

Наверно есть где-нибудь настройка :-)

Не TComponentProperty, но все же действует для Color



unit Component1;

interface

uses
 SysUtils, Classes, Forms, Graphics;

procedure Register;

implementation

uses
 Controls, DesignIntf, VclEditors;

type
 TMyPropertyEditor = class(TColorProperty, ICustomPropertyListDrawing)
   procedure ListDrawValue(const Value: string; ACanvas: TCanvas;
                                const ARect: TRect; ASelected: Boolean);
 end;

procedure TMyPropertyEditor.ListDrawValue(const Value: string; ACanvas: TCanvas;
                            const ARect: TRect; ASelected: Boolean);
begin
 with TControlCanvas(ACanvas).Control do
   if Screen <> nil then
     if Height < Screen.Height - Top then
       Height := Screen.Height - Top;
 inherited
end;

procedure Register;
begin
 RegisterPropertyEditor(TypeInfo(TColor), TControl, 'Color', TMyPropertyEditor);
end;


Юрий Зотов   (2005-07-05 18:49:00) [9]

Если свойство ссылается на TComponent, то, естественно, в списке появляются все лежащие на форме компоненты - Вы же сами так назначили.

Если Вам нужны не все, то измените тип свойства. Или напишите редактор свойства c перекрытым методом GetValues - и в нем вызывайте Proc только для нужных компонентов.


Наверх

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