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