Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
3-58526
Akni
2003-08-28 14:22
2003.09.18
Объединение полей в запросе


3-58600
AlexWeb
2003-08-28 17:19
2003.09.18
Мастера!!! Нужна консультация...


1-58613
_ilya
2003-09-05 13:13
2003.09.18
Папка или файл?


3-58586
napil
2003-08-25 20:07
2003.09.18
dbf


3-58516
Nucl
2003-08-28 16:35
2003.09.18
OleDB for mssql





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский