-
Реализовываю редактор компонента в виде отдельного окна, в котором видны компоненты на текущей форме. Хотелось бы отрисовать их иконки (ListView Style-> vsReport). Может кто знает, как их отыскать.
-
> Может кто знает, как их отыскать
Иконка компонента, очевидно, находится в ресурсах той bpl, в которой размещен этот компонент.
-
Это и так понятно, цель - зная класс компонета вытащить его иконку.
-
Для компонентов, имеющих собственные иконки, соотв.ресурс как правило имеет тип RT_BITMAP и имя, совпадающее с именем класса компонента (в верхнем регистре символов)
-
Не получается, может не так ???
procedure TBrCollectionEditorFrm.ToolButton1Click(Sender: TObject);
var Res,Res1: cardinal;
begin
Res := GetModuleHandle(nil);
Res1 := FindResource(Res,'TLABEL',RT_BITMAP);
ShowMessage(IntToStr(Res1));
end;
-
> Res := GetModuleHandle(nil);
Почему ищешь ресурс в модуле приложения ?
> FindResource
Почему не TResourceStream.Create() ?
> TLABEL
У лейбла в ран-тайм нет иконки, о ней можно вести речь только в дизайн-тайм.
-
Впрочем как нет в ран-тайм иконок любых других компонентов - а зачем они нужны в ран-тайм ?
-
Как выриант можно наделать иконок для стандартных компонентов
-
> DimaBr © (05.12.07 16:58) [4]
> Res := GetModuleHandle(nil);
Res = FindClassHInstance(TLabel);
-
Хотя не факт. Дело в том, что часто сами компоненты (и поддерживающие их классы) сидят в run-time пакете, а прочее (включая иконки палитры) - в design-time пакете. Получается, что по классу находим пакет, в котором иконок нет, а как найти тот, в котором они есть - это вопрос.
Конечно, список нужных design-time пакетов можно прописать и ручками, но как-то некрасиво это...
-
> У лейбла в ран-тайм нет иконки, о ней можно вести речь только в дизайн-тайм.
А никто о Run-Time и не говорил Реализовываю редактор компонента в виде отдельного окна
-
> DimaBr © (06.12.07 08:40) [10]
Ну тогда все упрощается.
TLabel в Д7, например, размещен в модуле dclstd70.bpl, это легко обнаруживается с пом. вызовов FindHInstance+GetModuleFileName. Там же, в ресурсе с именем TLABEL типа RT_BITMAP, находится иконка, с легкостью извлекаемая средствами, например, TResourceStream
-
Пока что ничего другого не придумал как добавлять к названию модуля "DCL". Может есть другие идеи ???
procedure TBrCollectionEditorFrm.ToolButton1Click(Sender: TObject);
var Res,MH: cardinal;
F: TForm;
FN : array[0..MAX_PATH] of char;
ClassName, FileName: string;
AClass: TClass;
begin
AClass := FindClass('TcxLookAndFeelController');
Res := FindClassHInstance(AClass);
ClassName := AnsiUppercase(AClass.ClassName);
FillChar(FN, sizeof(FN), #0);
GetModuleFileName(Res, FN, sizeof(FN));
FileName := ExtractFilePath(FN) + 'dcl' + ExtractFileName(FN);
MH := GetModuleHandle(PChar(FileName));
F := TForm.Create(nil);
try
F.Icon.Handle := GetIconFromResource(MH,ClassName,clFuchsia);
F.ShowModal;
finally
F.Icon.ReleaseHandle;
F.Free;
end;
end;
-
Если компонент сидит в том же модуле, где и его иконка, то все проще:
F.Icon.Handle := GetIconFromResource(
FindClassHInstance(AClass),
AnsiUpperCase(AClass.ClassName),
clFuchsia);
-
> добавлять к названию модуля "DCL"
Не понял ..
Что в дан.случае возвращает GetModuleFileName ?
-
> Что в дан.случае возвращает GetModuleFileName ?
Конкретно по данному примеру () возвращает cxLibraryVCLD6.bpl, а иконки сидят в dclcxLibraryVCLD6.bpl Переписал проверку на два модуля, но это же не выход
MH := GetModuleHandle(FN);
if MH = 0 then begin
FileName := ExtractFilePath(FN) + 'dcl' + ExtractFileName(FN);
MH := GetModuleHandle(PChar(FileName));
end;
-
Хм ... интересно ..
Если это действительно дизайн-тайм, то FindClassHInstance по идее обязан вернуть хэндл именно dclcxLibraryVCLD6.bpl. Почему он у тебя возвращает хэндл ран-тайм модуля - это мне пока не понятно.
С другой стороны, можно в цикле перечислить модули пакетов в ВАП процесса IDE и для каждого перечисленного модуля поискать в его ресурсах требуемую иконку.
-
> Сергей М. © (06.12.07 12:23) [16]
> Если это действительно дизайн-тайм
Само собой.
> то FindClassHInstance по идее обязан вернуть > хэндл именно dclcxLibraryVCLD6.bpl.
Нет. Возвращается хэндл модуля, содержащего класс. Это может быть (и очень часто бывает) именно run-time модуль. А к нему обычно прилагается design-time модуль, в котором сидят иконки, редакторы - да и вообще все, что нужно только для IDE, но не нужно для приложений. Этим достигается уменьшение размера приложений за счет исключения ненужных им ресурсов.
> можно в цикле перечислить модули пакетов в ВАП процесса IDE > и для каждого перечисленного модуля поискать в его ресурсах > требуемую иконку.
А вот это вариант, кстати.
-
> в цикле перечислить модули пакетов в ВАП процесса IDE
Интересно, а как ?
-
> как ?
Подозрительно странный вопрос для Мастера)
см. psapi EnumProcessModules()
-
Спасибо, буду тренироваться.
> Подозрительно странный вопрос для Мастера)
"Нельзя объять необъятное". Коль ни разу не сталкивался.
-
EnumModules, видимо.
Дима, загляни в System.pas, там немало на эту тему интересного.
|