RAD Studio Создание собственного Компонента на основе TPanel с размещением на нем дочерних Компонентов без использования SetSubComponent

ser4270

Местный
Регистрация
5 Май 2022
Сообщения
25
Реакции
1
Credits
86
Могу сразу сказать, что я потратил на изобретение этого "велосипеда" около 10 дней. Перепробовал многое. Те коды, что предлагаются в инете по динамическому созданию компонентов в Run-Time - это совсем не одно и тоже, чем размещение Своего Компонента на TForm с адекватным поведением при нажатии Alt+F12, переоткрытием формы. В тоже время это дало возможность прямого изменения СубКомпонентов в радакторе объектов, т.к. использование SetSubComponent хоть упрощает жизнь с кодом компонента, но и усложняет его разработку в визуальной среде.

Постараюсь не только привести конечный кода, но и упоминуть "грабли", на которые не следует наступать, а заодно и поделюсь с русскоязычным клубом необходимыми знаниями по теории поведения компонентов при сохранении в DFM и создании на форме.
 

ser4270

Местный
Регистрация
5 Май 2022
Сообщения
25
Реакции
1
Credits
86
А это вот зачем?
Код:
    SetLength(B, Length(S) div SizeOf(Char));
    HexToBin(PWideChar(S), B, Length(S) div SizeOf(Char));
    MemStream.WriteBuffer(B[0], Length(B));
    MemStream.SaveToFile(WinTemp);
    xButton.OptionsImage.Glyph.LoadFromFile(WinTemp);

Храним в строке, потом загружаем в стрим, затем сохраняем в файл и из файла грузим в глиф.
По сути, реализация не нравится мне изначальное. После разработки лучше ресурс подключить, либо картинку считать из файла. Но тут неплохо это можно реализовывать в такой методике: Ты накидал кучу картинок на форму - выбрал оттуда нужную. Посмотрел строчку в DFM и скопировал себе в код..... К тому же (если почитать форумы) на эту тему, есть тоже разные подходы для преобразования строки из файла DFM.
Но самым жирным минусом моего этого кода - является то, что в DesignTime ты не видишь этой картинки!!! Для видимости - нужно этот фрагмент вернуть в Create !!!
 

ser4270

Местный
Регистрация
5 Май 2022
Сообщения
25
Реакции
1
Credits
86
А это вот зачем?
Код:
    SetLength(B, Length(S) div SizeOf(Char));
    HexToBin(PWideChar(S), B, Length(S) div SizeOf(Char));
    MemStream.WriteBuffer(B[0], Length(B));
    MemStream.SaveToFile(WinTemp);
    xButton.OptionsImage.Glyph.LoadFromFile(WinTemp);

Храним в строке, потом загружаем в стрим, затем сохраняем в файл и из файла грузим в глиф.
и еще: признаюсь, не знаю, как из строки лучше всего преобразовать сразу в картинку. То что находил - не работало!
 

jonik

Местный
Регистрация
26 Мар 2005
Сообщения
111
Реакции
36
Credits
450
я бы картинку закинул бы в ресурс и грузил бы из ресурса. Можно в stream, а можно и сразу из ресурса грузить, у TcxButton вроде как есть метод загрузки иконки из ресурса.