Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.06;
Скачать: CL | DM;

Вниз

Свойство ImageIndex   Найти похожие ветки 

 
olegz77   (2006-01-13 19:22) [0]

Подскажите, пожалуйста: у меня написаны потомки TCollectionItem и TCollection. В элементе коллекции есть свойство ImageIndex (тип TImageIndex), а ImageList - общий, его ссылка хранится в самой коллекции в одноименном свойстве. Что надо сделать чтобы свойство ImageIndex можно было выбирать из выпадающего списка c иконками из ImageList.
Я просматривал код TMenuItem, но так и не понял как редактор свойства типа TImageIndex определяет какие иконки показывать в списке.????


 
Джо ©   (2006-01-13 19:54) [1]

Имеется ведь ссылка на конкретный TImageList, а у него имеются методы получения картинки по индексу. В чем проблема?


 
olegz77   (2006-01-13 19:59) [2]

В Runtime - нет проблем. Но в DesignTime при редактировании свойства ImageIndex в элементе коллекции не отображается выпадающий список с иконками, как это сделано, например, при редактировании пункта меню TMenuItem


 
jack128 ©   (2006-01-14 01:53) [3]

olegz77   (13.01.06 19:22)
а ImageList - общий, его ссылка хранится в самой коллекции в одноименном свойстве

поменяй название свойства на Images. Сам не проверял, но есть предположение, что стандартный редактор закладывается именно на такое название свойства.


 
Макс Черных ©   (2006-01-14 02:14) [4]

2 jack128

Женя, ты тут не прав. Не поможет переименование.

2 olegz77

Если надо, могу выложить пример под D2005. Вот только будет ли работать под D7 не помню.


 
jack128 ©   (2006-01-14 02:43) [5]

Макс Черных ©   (14.01.06 2:14) [4]
ты тут не прав

Угу.  Методом научного тыка ;) выяснил, что для того чтобы подцепился стандартный редактор, нужно чтобы свойство Images было у самого компонента, а не у коллекции.


 
olegz77   (2006-01-14 14:08) [6]


Макс Черных ©
> Если надо, могу выложить пример под D2005. Вот только будет
> ли работать под D7 не помню.


Макс, если не сложно, кинь пример мне на e-mail. В исходниках VCL такая засада. Делается это похоже через TActionLink какой-то.


 
jack128 ©   (2006-01-14 14:12) [7]

olegz77   (14.01.06 14:08) [6]
Делается это похоже через TActionLink какой-то.

:-D нет, делается это совсем по другому. не парься, а используй совет [5]


 
olegz77   (2006-01-14 14:26) [8]

Ура! Я все напутал. Свойство для imagelist у меня было конечно в компоненте - владельце коллекции, но оно называлось не Images. Переименовал свойство в Images и заработало !

jack128
Спасибо !!!


 
Rouse_ ©   (2006-01-15 19:35) [9]

Я писал вот так, не помню почему, но редактор стандартный у меня не встал :(

////////////////////////////////////////////////////////////////////////////////
//
//  ****************************************************************************
//  * Project   : Fangorn Wizards Lab Exstension Library v1.35
//  * Unit Name : FWTrayIcon
//  * Purpose   : Регистрация класса для работы с системным треем.
//  * Author    : Александр (Rouse_) Багель
//  * Copyright : © Fangorn Wizards Lab 1998 - 2003.
//  * Version   : 1.01
//  ****************************************************************************
//

unit FWTrayIconReg;

interface

{$I DFS.INC}

uses
 Windows, Classes, SysUtils, Controls, TypInfo, Graphics, ImgList,
 {$IFDEF VER130}
   DsgnIntf
 {$ELSE}
   DesignIntf, DesignEditors, VCLEditors
 {$ENDIF};

type
 // Редактор для свойства About
 TFWAboutPropertyEditor = class(TStringProperty)
   function GetAttributes: TPropertyAttributes; override;
   procedure Edit; override;
 end;

 // Редактор для свойств AnimFrom, AnimTo
 TImageIndexProperty = class(TIntegerProperty, ICustomPropertyListDrawing)
 protected
   function GetImages: TImageList; virtual;
 public
   function GetAttributes: TPropertyAttributes; override;
   procedure SetValue(const Value: string); override;
   procedure GetValues(Proc: TGetStrProc); override;
{$IFDEF DFS_COMPILER_5_UP}
   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);
{$ENDIF}
 end;

procedure Register;

implementation

uses FWTrayIcon, Math, Types;

procedure Register;
begin
 RegisterComponents("Fangorn Wizards Lab", [TFWTrayIcon]);
 RegisterPropertyEditor(TypeInfo(String), TFWTrayIcon, "About", TFWAboutPropertyEditor);
 RegisterPropertyEditor(TypeInfo(TShortCut), TFWTrayIcon, "ShortCut", TShortCutProperty);
 RegisterPropertyEditor(TypeInfo(TImageIndex), TFWAnimate, "AnimFrom", TImageIndexProperty);
 RegisterPropertyEditor(TypeInfo(TImageIndex), TFWAnimate, "AnimTo", TImageIndexProperty);
end;

{ TAboutPropertyEditor }

procedure TFWAboutPropertyEditor.Edit;
begin
 inherited;
 MessageBoxEx(0,
   PAnsiChar("Fangorn Wizards Lab Exstension Library v1.35"+ #13#10 +
   "© Fangorn Wizards Lab 1998 - 2003" + #13#10 +
   "Author: Alexander (Rouse_) Bagel" + #13#10 +
   "Mailto: rouse79@yandex.ru" + #13#10#13#10 +
   "Current "shell32.dll" version " + IntToStr(TFWTrayIcon.GetShellVersion)),
   "About...",  MB_ICONASTERISK, LANG_NEUTRAL);
end;

function TFWAboutPropertyEditor.GetAttributes: TPropertyAttributes;
begin
 Result := inherited GetAttributes + [paDialog];
end;

{ TImageIndexProperty }

function TImageIndexProperty.GetImages: TImageList;
var
 EditedComponent: TPersistent;
 PropInfo: PPropInfo;
begin
 Result := nil;
 try
   EditedComponent := GetComponent(0) as TPersistent;
   if EditedComponent <> nil then
   begin
     PropInfo :=
       Typinfo.GetPropInfo(PTypeInfo(EditedComponent.ClassType.ClassInfo), "Images");
     if PropInfo <> nil then
       Result := TObject(GetOrdProp(EditedComponent, PropInfo)) as TImageList;
   end;
 except
 end;
end;

function TImageIndexProperty.GetAttributes: TPropertyAttributes;
begin
 Result := [paMultiSelect, paValueList];
end;

procedure TImageIndexProperty.SetValue(const Value: String);
begin
 if Value = "" then
   inherited SetValue("-1")
 else
   inherited SetValue(Value);
end;

procedure TImageIndexProperty.GetValues(Proc: TGetStrProc);
var
 ImageList: TImageList;
 I: Integer;
begin
 Proc("-1");
 ImageList := GetImages;
 if ImageList <> nil then
   for I := 0 to ImageList.Count - 1 do
     Proc(IntToStr(I));
end;

{$IFDEF DFS_COMPILER_5_UP}
procedure TImageIndexProperty.ListDrawValue(const Value: string;
 ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean);
var
 ImageList: TImageList;
 vRight, vTop: Integer;
 ImageIndex: Integer;
begin
 ImageList := GetImages;
 if ImageList <> nil then
 begin
   if ImageList.Count = 0 then Exit;
   vRight := ARect.Left + ImageList.Width + 4;
   with ACanvas do
   begin
     ImageIndex := StrToInt(Value);
     ACanvas.FillRect(ARect);
     if ImageIndex = -1 then Exit;
     ImageList.Draw(ACanvas, ARect.Left + 2, ARect.Top + 2, ImageIndex, True);
     vTop := ARect.Top + ((ARect.Bottom - ARect.Top -
       ACanvas.TextHeight(IntToStr(ImageIndex))) div 2);
     ACanvas.TextOut(vRight, vTop, IntToStr(ImageIndex));
   end;
 end;
end;

procedure TImageIndexProperty.ListMeasureWidth(const Value: string;
 ACanvas: TCanvas; var AWidth: Integer);
var
 ImageList: TImageList;
begin
 ImageList := GetImages;
 if ImageList <> nil then
   if ImageList.Count > 0 then
     AWidth := AWidth + ImageList.Width + 4;
end;

procedure TImageIndexProperty.ListMeasureHeight(const Value: string;
 ACanvas: TCanvas; var AHeight: Integer);
var
 ImageList: TImageList;
begin
 ImageList := GetImages;
 if ImageList <> nil then
   if ImageList.Count > 0 then
     if Value = "-1" then
       AHeight := 0
     else
       AHeight := Max(AHeight, ImageList.Height + 4);
end;
{$ENDIF}

end.


 
olegz77   (2006-01-16 14:42) [10]

Rouse_
Спасибо! Теперь смогу замутить редактор с выпадающим списком любой сложности. А {$IFDEF DFS_COMPILER_5_UP} - это Дельфи 5 и выше ?


 
olegz77   (2006-01-16 14:45) [11]

Rouse_ И еще вопрос. Дельфи проверяет реализацию интерфейса ICustomPropertyListDrawing у тех свойств, у которых в PropertyAttributes есть paValueList ????


 
Rouse_ ©   (2006-01-16 15:25) [12]


> А {$IFDEF DFS_COMPILER_5_UP} - это Дельфи 5 и выше

Да.


> Дельфи проверяет реализацию интерфейса ICustomPropertyListDrawing
> у тех свойств, у которых в PropertyAttributes есть paValueList
> ????

Вот чего не знаю - того не знаю, по идее должна через QueryInterface()



Страницы: 1 вся ветка

Текущий архив: 2006.08.06;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
2-1153411217
Ivolg
2006-07-20 20:00
2006.08.06
Сообщение


2-1153316894
fast2
2006-07-19 17:48
2006.08.06
Не подключается ADOQuery


15-1152079517
Prohodil Mimo
2006-07-05 10:05
2006.08.06
Кто-нибудь продавал программы через SoftKey?


1-1150976550
wipr
2006-06-22 15:42
2006.08.06
Можно ли оживить QuickReport в Delphi 2006


9-1131923007
Ricks
2005-11-14 02:03
2006.08.06
Огонь