Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 - компилятор, что имеет свои (и серьезные) преимущества.



Страницы: 1 вся ветка

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

Наверх





Память: 0.51 MB
Время: 0.004 c
1-9156
roman001
2002-02-13 18:25
2002.03.04
печать из Memo


6-9244
rubin
2001-12-11 11:57
2002.03.04
Выход в интернет ч-з HTTPS Proxi


1-9143
Hewlping
2002-02-17 19:03
2002.03.04
Помогите!


14-9269
mvg_first
2002-01-10 20:32
2002.03.04
Есть ли альтернатива АДО при доступе к MS SQL 2000


1-9150
Loxly
2002-02-17 14:22
2002.03.04
Выношу часть функциональности проги в DLL, но размер EXE шника НЕ УМЕНЬШАЕТСЯ.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский