-
Можно ли сделать так чтобы компонент после бросания на форму каким то образом имел список всех классов проекта?
Т.е. очень охота чтобы в инспекторе объектов можно было выбрать только что написанный клас о котором сам компонент на момент написания ничего не знал? Или знал бы только класс предка?
Иными словами хочу чтобы мой компонент мог исспользовать любой потомок некого базового класса. Желательно чтобы этот класс не нужно было устанавливать как компонент.
-
Нельзя в дизайнере отобразить класс не проинсталированный в системе
-
Если надо использовать "любой класс" - для этого достаточно объявить свойство типа ссылка-на-класс
Другой вопрос - как ты им собираешься пользоваться. если ты не знаешь что это за класс? Должны же быть у тебя какие-то требования к этому классу.
-
>Нельзя в дизайнере отобразить класс не проинсталированный в системе
Даже через ToolsAPI?
>Должны же быть у тебя какие-то требования к этому классу.
Ага. Наследники некого базового класса.
-
То что набрано в текстовом редакторе ещё не класс, а просто ТЕКСТ.
ToolsAPI работает с существующими классами, а не написанными на бумаге
-
В инспекторе класс выбрать нельзя, можно выбрать экземпляр класса.
Составить список классов проекта в дизайнере можно, для этого нужно иметь собственный парсер PAS файлов, которому скормить все файлы проекта.
Объясните подробнее свою задачу, для чего всё это нужно, и что вы собираетесь редактировать в инспекторе
-
>То что набрано в текстовом редакторе ещё не класс, а просто ТЕКСТ.
Текст. Но при этом например как только я написал end у класса он появляется в списке слева. Т.е. IDE его уже увидел и уже занёс в некий свой список. Я не прав?
>ToolsAPI работает с существующими классами, а не написанными на бумаге
Вот например Class Browser из состава GExperts показал пустой класс только что мной добавленный в проект и нигде не зарегистрированный. Т.е. всё же то что я хочу возможно.
Другой вопрос могу ли я в своём компоненте в Design Time исспользовать ToosAPI? Если да то осталось только выдрать с исходников GExpert нужный код.
-
Мдя... Посмотрел GExpert так они там парсят исходные файлы.... Неожиданно оказалось :(
Хотя дельфи же как то с списках классов показывает только что написанный класс... Вот только похоже доступа к этой инфе нету :(
-
procedure TClassItem.LoadClass(const FileName: string);
var
EditorStream: TMemoryStream;
Parser: TmEPTokenList;
Buf: array[0..30] of char;
p1, i, j: Integer;
ObjectInfo: TBrowseClassInfoCollection;
LocalEditReader: TEditReader;
begin
if not IsDprOrPas(FileName) or IsInc(FileName) then
Exit;
LocalEditReader := TClassList(Collection).EditRead;
LocalEditReader.FileName := FileName;
LocalEditReader.Reset;
EditorStream := TMemoryStream.Create;
try
LocalEditReader.SaveToStream(EditorStream);
EditorStream.Position := EditorStream.Size;
FillChar(Buf, 23, 0);
EditorStream.WriteBuffer(Buf, 23);
EditorStream.Position := 0;
Parser := TmEPTokenList.Create;
Дальше и читать не стал - СОБСТВЕННЫЙ ПАРСЕР
-
> Хотя дельфи же как то с списках классов показывает только что написанный класс...
В Delphi - тоже свой парсер, класса ещё не существует, и через ToolsAPI не достучаться
-
То что в дельфи собственный парсер я и не сомневался... Я думал к результатам его работы можно достучаться через ToolsApi.
В принципе выдрать парсер с GExpert тоже вариант но какой то уж очень громоздкий....
-
Лучше расскажите что вы хотите сделать
-
Хочу чтобы в компоненте была возможность использовать только что написанные классы. Т.е. написал класс, подцепил его тут же, настроил свойства :)
-
У класса нельзя настроить свойства, можно у экземпляра класса
-
Экземпляр класса будет создавать компонент в Design Time по имени класса.
-
Нельзя создать то, чего не существует.
И потом, допустим реализовалась ваша несбыточная мечта, и можно создавать классы в дизайнере из только что написанного кода. Тогда вы, например, бросаете компонент на форму и в коде конструктора пишите Left := 0, при этом компонент прыгнул на форме к левому краю, переводим курсор и добавляем 9 (получилось Left := 90), и компонент прыгнул уже немного правее. Далее пишем в коде цикл (for i := 0 to 1000 do Left := Random(10000)) и компонент начинает летать по форме. Это уже какой-то не DesignTime, а RunTime получается. Далее пишем ( while true do;) и после ";" Delphi умирает. Всё, нужно снимать процесс в диспетчере задач.
Пересмотрите свою задачу. Если вам действительно нужно RunTime в дизайнере, стоит посмотреть в сторону FastReport с собственным дизайнером и скриптом.
-
Признаю идея была хороша но нереализуема :((((((
Мне RunTime в дизайнере не нужен.
Что нужно:
Компонент визуальный наследник от виртуального ListView с OwnerDraw.
Хотелось бы:
- иметь в каждой колонке коллекцию классов унаследованных от некого базового. Каждый класс отвечает за отрисовку и реакцию на собиытия отдельного кусочка колонки. Например чекбокс + текст это уже коллекция из двух компонентов.
Сейчас пока реализовал коллекцию из базовых классов и в дизайн тайме можно задать им положение и некоторые общие параметры но само собой раз класс отвечающий за настоящее рисование не задан то в дизайнтайме не получается настроить все свойства и обработчики. А хотелось бы.
Вот что есть пока в дизайн тайме:
http://pixs.ru/showimage/ListViewpn_2260731_2920380.pngПервая колонка три элемента коллекции (второй невидимый), третья один.
Вот очень хочется чтобы вместо красных стандартных квадративок был реальный компонент с реальной отрисовкой и свойствами.
Готов регистрировать классы :)) Только вот вопрос регистрация класса регистрирует его где? В пользовательском пакете или как?
-
У вас в каждой строчке первого столбца отдельный редактор ? Или весь первый столбец одинаковые редакторы ?
-
В первой строчке на картинке 3 редактора но впринципе может быть сколько нужно.
-
В первом столбце на картинке 3 редактора но впринципе может быть сколько нужно.
Только это скорее не редакторы а некие элементы отображения(управления)