Форум: "Компоненты";
Текущий архив: 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.49 MB
Время: 0.013 c