Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];




Вниз

макроподстановки 


IIL   (2002-02-08 08:51) [0]

Здравствуйте мастера! В FOXe есть понятие макроподстановки. Например если есть переменная I = "1" то к переменной B1 можно обратиться так B&I.
Есть ли что-нибудь подобное в DELPHI чтобы например объекты B1 B2 B3 и т.д. можно было бы создавать в цикле FOR I := 1 To ....



Digitman   (2002-02-08 09:21) [1]

Механизма макроопределений/макроподстановок в делфи нет. Нет его и в Паскале как таковом. Но то, что тебя интересует, в Делфи реализуемо иными средствами, не менее удобными и эффективными, чем макросредства иных языков программирования.
Единственное, что хотелось бы заметить еще, это то, что макромеханизм FOX"а в части приведенных тобой возможностей базируется исключительно на механизме интерпретации, в то время как классический макромеханизм (реализованный, например, в MASM, C/С++) предназначен для несколько иных целей.

Пример :
Пусть объекты B1, B2, .., BN являются наследниками TComponent и имеют соотв.имена "B1", "B2", ..,"BN" (т.е. подчиняются некоему заданному при кодировании правилу регулярности в однозначной их идентификации, в дан.случае - по свойству "Name")

Тогда циклический код обращения к объектам может выглядеть, например, вот так :

for i:= 1 to N do
Bi:= SomeOwnerComponent.FindComponent("B" + IntToStr(i));



KSergey   (2002-02-08 09:36) [2]

Хотя ответ Digitman"а возможно более соответствует заданному вопросу (хотя если под переменными подразумевается просто, например, целочисленные, то тащить для этого TComponent...), но что-то в вашем вопросе меня натолкнуло предложить вам массивы. По-моему, для циклов (т.е. обрацению к переменным по индексу) они как раз то что надо. И городить из-за этого макроподстановку даже в FOX"е - это слишком, однако.



22606   (2002-02-08 10:44) [3]

Если Вы имеете ввиду вычисления строки типа "a+b*(c+d)",
то для реализации этого механизма применяют парсеры.
Их написано очень много и Вы их легко найдете. (Пример для поиска в любом поисковике Delphi+Parser). Чтобы Вас не пугало незнакомое слово, парсер - это подпрограммка, которая разбирает Вашу символьную строку на состовляющие и производит необходимые действия - раскрывет скобки, делит, умножает и т.д. - все зависит от мощности парсера. Это может быть или функция или компонент - все зависит от реализации. Так-же как и производимые действия - простенькие (сложение, вычитание...) или сложные (тригонометрические ф-ции, факториалы, логарифмы...).



IIL   (2002-02-08 11:08) [4]

Задача состояла в том чтобы считать (например из INI) описания неизвесного количества таблиц и создать их и компоненты для работы с ними.



Digitman   (2002-02-08 11:35) [5]

И какие проблемы ? Все это вполне решаемо без всяких "макроподстановок" ! Приведи структуру INI



homa   (2002-02-08 23:50) [6]

Не знаю что за INI, а вот такой примерчик вам не подойдет:

Dimen FileNames(1,4) &&
Kolich=adir(Filenames,"*.DBF") && Список файлов - в массив
For i=1 to Kolich
NAMEFILE = FileNames(i,1) && Первая колонка массива - имя файла

use &NAMEFILE

? reccount() && Печатаем количество записей

EndFor

И мне тоже интересно - как подобную операцию проделать в Delphi?



Digitman   (2002-02-09 09:06) [7]

>homa
Все это абсолютно реализуемо в Делфи ! Не в 7 строчек, правда. Но какое отношение данная задача имеет к механизму макроподстановок ?



homa   (2002-02-09 11:50) [8]

Насколько я понимаю - и автора вопроса, и меня интересует именно как в Дельфи реализуется примерчик, описанный мной. Не придирайся к терминам, не подменяй тему - мы говорим о макроподстановках FOX"а, а не о классических макроподстановках языков компилирующего типа.



Digitman   (2002-02-09 12:53) [9]

>homa
1. Где ты видишь, что я "подменяю" тему ?
2. Не вижу, что автора на сей момент хоть сколь либо интересует именно твой пример, так что собственный вопрос помещай в отдельную дискуссию - суть его вовсе не в макроподстановках как языковых возможностях той или иной среды, а в принципиальной возможности реализации конкретной целевой задачи, а именно :
<k>
- получить список табличных файлов БД, находящихся в заданной директории;
- определить размер списка;
- для каждой таблицы из полученного списка получить число записей в ней и вывести в некое окно в текстовом виде;
</k>
Не так ли ? И при чем же здесь "макроподстановка" как тема дискуссии ? Твоя задача - тривиальная задача, решаемая (и не менее удобно и эффектно) средствами тех же BDE и обычного Паскаля, и конкретные языковые особенности и возможности Делфи как среды здесь ни при чем.

Так что создавай новую ветку и вопрошай в ней на здоровье, как реализовать в Делфи-коде задачу, в действительности поставленную тобой (см.текст курсивом).

А на свой вопрос автор уже получил ответ :
Механизма макроопределений/макроподстановок в Делфи нет, потому что нет его в Паскале (и никогда не было, и вряд ли будет)



Digitman   (2002-02-09 15:31) [10]

см. к примеру
метод TSession.GetTableNames()
метод TADOConnection.GetTableNames()
св-во TIBTable.TableNames
и т.п.

любой из этих вызовов безо всяких там "макроподстановок" решает 90% твоей задачи



Digitman   (2002-02-09 15:32) [11]

см. к примеру
метод TSession.GetTableNames()
метод TADOConnection.GetTableNames()
св-во TIBTable.TableNames
и т.п.

любой из этих вызовов безо всяких там "макроподстановок" решает 50% твоей задачи



homa   (2002-02-11 09:34) [12]

Цитирую автора вопроса:
"Есть ли что-нибудь подобное в DELPHI..."
"Задача состояла в том чтобы считать (например из INI) описания неизвесного количества таблиц..."
Не знаю как его, а меня не устраивает ответ "макроподстановок в Дельфи нет!", вопрос был не о их наличии, а о "чем-нибудь подобном" FOX-овским макроподстановкам. Мой же пример всего лишь иллюстрация к вопросу. Суть которого в том - как работать с объектами, имена которых заранее неизвестны?



Digitman   (2002-02-11 10:00) [13]

>>"..имена которых заранее неизвестны"

см. <Digitman> © (09.02.02 15:32)



homa   (2002-02-11 10:03) [14]

Ладно, допустим мой пример неточен. Как его сделать в Дельфи я уже сам вижу. Давай возьмем другую ситуацию: несколько файлов *.dbf с неизвестной структурой. Требуется перебрать все файлы и все их поля, выполнив над каждым некую операцию, зависящую от типа поля. Имена полей заранее неизвестны, количество их неизвестно. Т.е. имеем случай когда объекты не "...подчиняются некоему заданному при кодировании правилу регулярности в однозначной их идентификации...". Я знаю, что структуру файла я получу - и количество полей, и их имена у меня будут. Вопрос: имея в строковой переменной имя объекта, как я могу к нему обратиться?
И, пожалуйста, избавь меня от уверений, что в Дельфи подобные средства есть. Лучше дай исходник - мы ж программисты, в конце концов...



Basilio   (2002-02-11 10:20) [15]

А что мешает к DBF обращатся через BDE - там же есть метод
у таблиц: FieldByName(Name:String)



homa   (2002-02-11 10:35) [16]

Потому и спрашиваю, что еще не все знаю. Необъятен он, этот ваш Дельфи...:)



Digitman   (2002-02-11 10:38) [17]

>homa
Еще раз повторяю - заводи новую ветку в разделе "Базы данных" - это из той оперы. Ты рискуешь быть удаленным модератором за несоответствие вопроса тематике раздела



PVOzerski   (2002-02-11 10:53) [18]

Вернемся к макроподстановкам. Во-первых, невзирая на более последовательно, чем в Си/Си++,
реализованный модульный подход и концепцию unit/uses, Борландовские и совместимые с ними
диалекты Паскаля не запрещают использовать и include-файлы, что позволяет реализовывать не
только макроподстановки, но даже шаблоны классов (подробнее - ищите на Королевстве Delphi),
хотя по сути это из разряда трюков. Во-вторых, Open-source-компилятор FreePascal поддерживает
также простенькие (беспараметрные) макроопределения, что в сочетании с перегружаемыми
функциями и операторами все равно дает немало дополнительных возможностей. Правда, у него
RAD пока нет, но написать DLL и вызывать из Delphi можно.



Romkin   (2002-02-11 11:16) [19]

1. Берем TDatabase, ставим там PATH=... на каталог,
LANGDRIVER=... как надо, смотрим, чтобы в BDEADMIN Drivers->NAtive->dBase LEVEL был нужного уровня
2. Берем TTable, соединяем с Database
3. var DBList: TStrings;
DBList := TStringList.Create;
DataBase1.Connected := true;
После грузим имена таблиц:
DatabaseName - из Database1, Extensions -> true
Database1.Session.GetTableNames(const DatabaseName, Pattern: String; Extensions, SystemTables: Boolean; List: TStrings);
4.
for i := 0 to DBList.Count - 1 do
begin
Table1.Active := false;
Table1.TableName := DBList[i];
Table1.Active := true;
with Table1 do
for j := 0 to FieldCount - 1 do
begin
with Fields[i] do ....
end;
end;



AlexanderK   (2002-02-11 12:59) [20]

Все таки, я думаю суть вопроса в том, что в уже в ходе
выполнения программы: в FOXе, можно формировать строки самой
этой программы Например:

s="RUN arj.exe a a.arj *.*" && Формируем любую строку
&s && Выполняем

Решить можно конечно любую задачу, вопрос в удобстве решения
для тех кто решает.



homa   (2002-02-12 08:40) [21]

>Romkin: Thanks!:)
>Digitman: Базы данных тут ни при чем. Не нравятся мои примеры - посмотри пример AlexanderK. От темы вопроса никаких отклонений нет. Если же ты в нее въехать не можешь или не хочешь - так ведь я ж тебя не принуждаю. Предлагаю перепалку закрыть.



Иван Шихалев   (2002-02-13 17:29) [22]

> Все таки, я думаю суть вопроса в том,
> что в уже в ходе выполнения программы:
> в FOXе, можно формировать строки самой
> этой программы.


Это возможно только в интерпретаторе. Delphi - компилятор, что имеет свои (и серьезные) преимущества.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.77 MB
Время: 0.041 c
4-9346            Burmistroff           2002-01-05 18:42  2002.03.04  
К скрывают PopUp menu?


1-9132            Fast                  2002-02-17 09:45  2002.03.04  
Элементарная вещь


3-9086            Sergant               2002-01-11 12:54  2002.03.04  
Фильтрация в базах DBF в DOS-кодировке


14-9278           Сергей Чурсин         2001-08-07 19:14  2002.03.04  
---|Ветка была без названия|---


3-9084            karafuto              2002-02-07 10:10  2002.03.04  
Глюк клиента MS SQL 2000?