Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];

Вниз

Свойство 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.011 c
2-1153162403
дмитрий дельфи
2006-07-17 22:53
2006.08.06
подскажите значок градусов и оператор приостановки в делфи


2-1153147531
asail
2006-07-17 18:45
2006.08.06
Запрос SQL


15-1152166118
novill
2006-07-06 10:08
2006.08.06
Что с rsdn.ru?


15-1152545626
Andy BitOff
2006-07-10 19:33
2006.08.06
У кого есть опыт работы с компон. Developer Express


15-1152509474
Ega23
2006-07-10 09:31
2006.08.06
С Днём рождения! 10 июля





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский