Форум: "Основная";
Текущий архив: 2003.09.18;
Скачать: [xml.tar.bz2];
Внизclass and forms Найти похожие ветки
← →
vaa (2003-09-05 14:59) [0]В IDE Project – Options в разделе Available Form видны все формы данного проекта.
Возможно ли получить список этих форм из главной формы в run-time (не регистрируя предварительно классы)
← →
Calm (2003-09-05 15:30) [1]Обратимся к первоисточникам :)
вот что приводится в примере к справке по свойству Forms класса TScreen
This example assumes that the main form of the application has a main menu with a Windows menu item. The following code adds a separator, and the name of all forms to the Windows menu.
var
NewItem: TMenuItem;
I : integer;
begin
{ first create the separator }
NewItem := TMenuItem.Create(Self);
NewItem.Caption := "-";
{ add the new item to the Windows menu }
Windows.Add(NewItem);
{ now create and add a menu item for each form }
for I := 0 to Screen.FormCount-1 do
begin
NewItem := TMenuItem.Create(Self);
NewItem.Caption := Screen.Forms[I].Name;
Windows.Add(NewItem);
end;
end;
← →
vaa (2003-09-05 16:42) [2]это из другой оперы.
Нужно найти все классы форм, доже не открытые.
← →
Vuk (2003-09-05 16:47) [3]Средств для этого нет. Теоретически, конечно, можно просканировать память приложения и попытаться найти все классы. Это задача выполнимая, но в реальной жизни лучше так не делать.
← →
Calm (2003-09-05 17:06) [4]imho ты не прав, Vuk © (05.09.03 16:47) [3]
Если приглядеться к модулям, расположенным в каталоге ToolsAPI, то можно увидеть, что в эксперте можно получить доступ ко всем модулям проекта, причем можно определить, является ли модуль самым обычным или же является формой.
Другой вопрос, что это совсем не просто использовать. Но, как говорится, было бы желание.
← →
Calm (2003-09-05 17:07) [5]ToolsAPI.pas
← →
Calm (2003-09-05 17:08) [6]Сорри, не внимательно прочитал вопрос :((
[4] Относится в design-time, а автор спрашивал о run-time.
← →
Camus (2003-09-05 18:32) [7]> vaa
unit Unit1;
interface
...
type
TForm1 = class(TForm)
...
end;
var
FormClassesList: TList // Или TThreadList, если надо.
implementation
....
initialization
FormClassesList := TList.Create;
FormClassesList.Add(TForm1); // В модуле каждой формы
finalization
FormClassesList.Free;
end.
Собственно, вот и все.
← →
vaa (2003-09-05 19:36) [8]Лучше сказать что мне надо. Может другое решение подскажите.
Многоязыковая поддержка через ini - файл.
почему ini? - так надо.
В проекте очень много форм, и чтобы не перечислять
все ручками (RegisterClasses([.....])
хотел бы нажать кнопку и получить в ini все формы с ресурсами.
Как это сделать с RegisterClasses([.....]) я знаю,
Но возникли две проблемы:
- как и говорил перечисление ручками
- есть вызываемые формы в компонентах. RegisterClasses тут
не поможет
Можно, конечно взять Restorator и сделать патч.
Но это тоже долго.
← →
Camus (2003-09-05 19:48) [9]А зачем вообще перечислять формы? Вот пример структуры секции:
[имя_класса_формы]
Button1.Caption = Отмена
DBGrid1.Colums[1].Title.Caption = Наименование
Теперь в каждой форме перекрываем Loaded, а в нем присваиваем строки из соответствующей секции. Для этого можно парсить каждую строку и присваивать свойства через RTTI, а можно наоборот, формировать Name и получать Value.
Вот форма сама все и загрузит, без всяких списков.
← →
vaa (2003-09-05 19:54) [10]Я это и делаю,
но чтобы создать
[имя_класса_формы]
Button1.Caption = Отмена
DBGrid1.Colums[1].Title.Caption = Наименование
нужно все прошерстить. А если форм много...
Я хочу автоматизировать создание первоначального ini
← →
vaa (2003-09-05 20:04) [11]А вообще-то Camus в чем-то прав.
Спасибо за идею.
← →
Camus (2003-09-05 20:18) [12]> vaa (05.09.03 19:54) [10]
> Я хочу автоматизировать создание первоначального ini
Тогда непонятно, почему Вы спрашивали про run-time - ИМХО, гораздо проще создавать его именно в design-time. И еще непонятно, при чем тут RegisterClasses.
1. Можно написать эксперт IDE. Из него через BorlandIDEServices доступен весь проект и можно создавайть что угодно.
2. Если поместить формы во временный пакет и инсталлировать его в IDE, то способ с собственным списком FormClassesList сработает и в design-time тоже. А после формирования первого же INI-файла пакет будет уже не нужен и может быть удален.
← →
nikkie (2003-09-05 20:37) [13]> Я хочу автоматизировать создание первоначального ini
1. dfm2txt если dfm не хранятся уже в текстовом виде
2. поиск в текстовых файлах всех строк .Caption, .Text, .Hint и т.п.
и никаких вам экспертов
← →
Юрий Зотов (2003-09-05 22:20) [14]> nikkie © (05.09.03 20:37) [13]
Слишком большое "и т.п." получится. Уж тогда лучше искать строки по апострофам.
← →
nikkie (2003-09-05 22:34) [15]>Уж тогда лучше искать строки по апострофам.
Не уверен. Есть вероятность зацепить много лишнего, что не имеет отношения к интернационализации. Вот, например, я пробежался по одному своему dfm на предмет апострофов:
object MainForm: TMainForm
Font.Name = "MS Sans Serif"
object IdHTTP: TIdHTTP
Request.Accept = "text/html, */*"
Request.UserAgent = ""
object WindowClose: TWindowClose
Category = "Window"
← →
Юрий Зотов (2003-09-06 08:08) [16]> nikkie © (05.09.03 22:34) [15]
Значит, и по апострофам тоже плохо. "Тоже" - это потому, что писать код поиска свойств с заранее известными именами - это практически то же самое, что править текст DFM вручную (пожалуй, второе будет даже проще и быстрее). Наверное, самое надежное и универсальное - это все же эксперт (или специальный компонент, который временно (один раз) кладется на форму). В коде поиска нужно сделать рекурсивный проход по компонентам и их объектным свойствам (через RTTI) и поиск свойств типа TStrings, tkString и т.п.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.09.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c