Конференция "Компоненты" » Иконки компонента
 
  • DimaBr © (05.12.07 12:09) [0]
    Реализовываю редактор компонента в виде отдельного окна, в котором видны компоненты на текущей форме.
    Хотелось бы отрисовать их иконки (ListView Style-> vsReport).
    Может кто знает, как их отыскать.
  • Сергей М. © (05.12.07 12:39) [1]

    > Может кто знает, как их отыскать


    Иконка компонента, очевидно, находится в ресурсах той bpl, в которой размещен этот компонент.
  • DimaBr © (05.12.07 13:24) [2]
    Это и так понятно, цель - зная класс компонета вытащить его иконку.
  • Сергей М. © (05.12.07 13:47) [3]
    Для компонентов, имеющих собственные иконки, соотв.ресурс как правило имеет тип RT_BITMAP и имя, совпадающее с именем класса компонента (в верхнем регистре символов)
  • DimaBr © (05.12.07 16:58) [4]
    Не получается, может не так ???

    procedure TBrCollectionEditorFrm.ToolButton1Click(Sender: TObject);
    var Res,Res1: cardinal;
    begin
     Res := GetModuleHandle(nil);
     Res1 := FindResource(Res,'TLABEL',RT_BITMAP);
     ShowMessage(IntToStr(Res1));
    end;

  • Сергей М. © (05.12.07 17:11) [5]

    > Res := GetModuleHandle(nil);


    Почему ищешь ресурс в модуле приложения ?


    > FindResource


    Почему не TResourceStream.Create() ?


    > TLABEL


    У лейбла в ран-тайм нет иконки, о ней можно вести речь только в дизайн-тайм.
  • Сергей М. © (05.12.07 17:26) [6]
    Впрочем как нет в ран-тайм иконок любых других компонентов - а зачем они нужны в ран-тайм ?
  • Kolan © (05.12.07 18:50) [7]
    Как выриант можно наделать иконок для стандартных компонентов…
  • Юрий Зотов © (05.12.07 20:21) [8]
    > DimaBr ©   (05.12.07 16:58) [4]

    > Res := GetModuleHandle(nil);

    Res = FindClassHInstance(TLabel);
  • Юрий Зотов © (05.12.07 21:50) [9]
    Хотя не факт. Дело в том, что часто сами компоненты (и поддерживающие их классы) сидят в run-time пакете, а прочее (включая иконки палитры) - в design-time пакете. Получается, что по классу находим пакет, в котором иконок нет, а как найти тот, в котором они есть - это вопрос.

    Конечно, список нужных design-time пакетов можно прописать и ручками, но как-то некрасиво это...
  • DimaBr © (06.12.07 08:40) [10]

    > У лейбла в ран-тайм нет иконки, о ней можно вести речь только в дизайн-тайм.

    А никто о Run-Time и не говорил
    Реализовываю редактор компонента в виде отдельного окна

  • Сергей М. © (06.12.07 09:29) [11]

    > DimaBr ©   (06.12.07 08:40) [10]


    Ну тогда все упрощается.

    TLabel в Д7, например, размещен в модуле dclstd70.bpl, это легко обнаруживается с пом. вызовов FindHInstance+GetModuleFileName.
    Там же, в ресурсе с именем TLABEL типа RT_BITMAP, находится иконка, с легкостью извлекаемая средствами, например, TResourceStream
  • DimaBr © (06.12.07 10:29) [12]
    Пока что ничего другого не придумал как добавлять к названию модуля "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;

  • Юрий Зотов © (06.12.07 11:26) [13]
    Если компонент сидит в том же модуле, где и его иконка, то все проще:

    F.Icon.Handle := GetIconFromResource(
     FindClassHInstance(AClass),
     AnsiUpperCase(AClass.ClassName),
     clFuchsia);

  • Сергей М. © (06.12.07 11:36) [14]

    > добавлять к названию модуля "DCL"


    Не понял ..

    Что в дан.случае возвращает GetModuleFileName ?
  • DimaBr © (06.12.07 12:00) [15]

    > Что в дан.случае возвращает GetModuleFileName ?

    Конкретно по данному примеру () возвращает  cxLibraryVCLD6.bpl, а иконки сидят в dclcxLibraryVCLD6.bpl

    Переписал проверку на два модуля, но это же не выход

     MH := GetModuleHandle(FN);
     if MH = 0 then begin
       FileName := ExtractFilePath(FN) + 'dcl' + ExtractFileName(FN);
       MH := GetModuleHandle(PChar(FileName));
     end;

  • Сергей М. © (06.12.07 12:23) [16]
    Хм ... интересно ..

    Если это действительно дизайн-тайм, то FindClassHInstance по идее обязан вернуть хэндл именно dclcxLibraryVCLD6.bpl. Почему он у тебя возвращает хэндл ран-тайм модуля - это мне пока не понятно.

    С другой стороны, можно в цикле перечислить модули пакетов в ВАП процесса IDE и для каждого перечисленного модуля поискать в его ресурсах требуемую иконку.
  • Юрий Зотов © (06.12.07 12:39) [17]
    > Сергей М. ©   (06.12.07 12:23) [16]

    > Если это действительно дизайн-тайм

    Само собой.

    > то FindClassHInstance по идее обязан вернуть
    > хэндл именно dclcxLibraryVCLD6.bpl.

    Нет. Возвращается хэндл модуля, содержащего класс. Это может быть (и очень часто бывает) именно run-time модуль. А к нему обычно прилагается design-time модуль, в котором сидят иконки, редакторы - да и вообще все, что нужно только для IDE, но не нужно для приложений. Этим достигается уменьшение размера приложений за счет исключения ненужных им ресурсов.

    > можно в цикле перечислить модули пакетов в ВАП процесса IDE
    > и для каждого перечисленного модуля поискать в его ресурсах
    > требуемую иконку.

    А вот это вариант, кстати.
  • DimaBr © (06.12.07 12:55) [18]

    >  в цикле перечислить модули пакетов в ВАП процесса IDE

    Интересно, а как ?
  • Сергей М. © (06.12.07 13:15) [19]

    > как ?


    Подозрительно странный вопрос для Мастера)

    см. psapi EnumProcessModules()
  • DimaBr © (06.12.07 13:29) [20]
    Спасибо, буду тренироваться.

    > Подозрительно странный вопрос для Мастера)

    "Нельзя объять необъятное". Коль ни разу не сталкивался.
  • Юрий Зотов © (06.12.07 13:36) [21]
    EnumModules, видимо.

    Дима, загляни в System.pas, там немало на эту тему интересного.
 
Конференция "Компоненты" » Иконки компонента
Есть новые Нет новых   [134428   +41][b:0][p:0.002]