![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение многострочного ключа ini-файла
Kostafey © (2007-04-27 17:25:00)Подкажите пожалуйста существует ли возможность чтения/записи многстрочных ключей ini-файлов ?
Т.е. что бы вместо
[section1]
key1='жили у бабуси 2 веселых гуся'
key2=...
можно было писать:
[section1]
key='жили у
бабуси 2
веселых
гуся'
key2=...
Kostafey (2007-05-01 14:09:00) [1]> [32] Kostafey © (30.04.07 23:36)
Все, разобрался.
Kostafey (2007-04-30 23:36:00) [2]все же не понятно:
void lua_gettable (lua_State *L, int index); - Pushes onto the stack the value t[k]
получается, что мы читаем значение [k] из таблицы, которая уже должна находится в стеке
А как же таблицу в стек помещать ? lua_pushtable - то нет
void lua_getfield (lua_State *L, int index, const char *k); - Pushes onto the stack the value t[k]
Опять получается поже самое, только для ассоциативного массива.
Саму таблицу-то как загружать ?
Kostafey (2007-04-30 22:24:00) [3]> напиши так: WriteLn(WriteLn('text'));. не удивительная ли
> конструкция? %-)
Я ж исправился: [28] Kostafey © (30.04.07 21:11):
showmessage(inttostr(luaL_dostring(LuaS, 'print("Hellow World")')));
> кто тебе наврал, что print() возвращает какой-то результат?
Результат возвращает не print, а luaL_dostring - успешно/неуспешно.
По поводу таблиц попробую еще с мануалом поколдовать...
Ketmar (2007-04-30 22:00:00) [4]пардон. забыл тэг закрыть. %-)
Ketmar (2007-04-30 21:59:00) [5]барин, не надо извращений. %-)
>Скомпилировался файл lua5.1.dll, а lua51U.pas просит lua51.dll.
для кого в .pas константа сделана с именем библиотеки?
>Вопрос: на другом PC понадобятся какие-либо еще библиотеки помимо этих двух ?
собери нормально. или скачай вменяемую. нужна только одна -- lua*.dll.
>Получается по-другому ее не записать (структур я в языке не нашел) ?
таблицы -- это и массивы, и структуры, и классы, и словари и ещё много чего. да. %-)
а зачем тебе Params.Count? массивы -- они и числовые индексы принимают. если начинать с 1, то длина массива -- #<var>. и никаких ручных _1, _2, ...
>Выводит в диалоге "2".
и что неясно? медитируем:
print(print("zzz"));
кто тебе наврал, что print() возвращает какой-то результат? напиши так:WriteLn(WriteLn('text'));. не удивительная ли конструкция? %-)
>Получается, чтобы считать из файла нужно сначала записть
в стек, а затем считывать в программу.
да. для чего делается функция-"обёртка". один раз. и потом весело юзается.
>То как привильно считывать таблицы я так и не понял.
искать в районе lua_getfield(). которую применять на table в стеке. %-)
а lua_gettable() -- это для нумерованых индексов в таблице. внимательно кури мануал, там всё написано. %-)
Kostafey (2007-04-30 21:11:00) [6]> showmessage(inttostr(luaL_dostring(LuaS, 'print(print("Hellow > World"))')));
showmessage(inttostr(luaL_dostring(LuaS, 'print("Hellow World")')));
Kostafey (2007-04-30 21:04:00) [7]Ситуация такая.
Компиляция.
При обработке строк .bat - файла, например:
cl /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE /DLUA_BUILD_AS_DLL l*.c
выдает: Программа не умещается в памяти.
Ну да ладно, скомпилоровалось в Visual Studio 2005.
Скомпилировался файл lua5.1.dll, а lua51U.pas просит lua51.dll.
ну да ладно lua51.dll есть в любой готовой компиляции.
Запускаем приложение на Delphi - просит msvcr80d.dll.
Ищем msvcr80d.dll - их куча.
Подходящая в C:\Program Files\Microsoft Visual Studio 8\VC\ce\Dll\x86\.
Запускаем - просит CORE.dll. Находим CORE.dll, запускаем - все рушится (не найдена такая-то строка в CORE.dll).
Ладно, есть готовые компиляции всей библиотеки. Например, lua5_1_2_Win32_dll7_lib.zip.
Берем от туда lua5.1.dll и lua51.dll - все, приложение работает.
Вопрос: на другом PC понадобятся какие-либо еще библиотеки помимо этих двух ?
Что до самого Lua.
Я хотел бы хранить там информацию типа:
#Sql.lua
--Количество запросов
Count=1
--Список запросов
Query_1 = {}
Query_1.Name='Запрос №1'
Query_1.SQL=[[
Select *
From Dogovor, Subject
Where ?Param_1 and ?Param_2
and Dogovor.D_S_id = Subject.S_id'
]]
--
Query_1.Params={}
Query_1.Params.Count=2
Query_1.Params.Param_1={}
Query_1.Params.Param_1.Name='Data'
Query_1.Params.Param_1.FieldName='Dogovor.Data'
Query_1.Params.Param_1.Operation='between'
Query_1.Params.Param_1.Operand1=''
Query_1.Params.Param_1.Operand2=''
--
Query_1.Params.Param_2={}
Query_1.Params.Param_2.Name='Familiya'
Query_1.Params.Param_2.FieldName='Subject.Familiya'
Query_1.Params.Param_2.Operation='='
Query_1.Params.Param_2.Operand1=''
Получается по-другому ее не записать (структур я в языке не нашел) ?
Обработка команд
Вот что непонятно:
procedure TForm1.Button4Click(Sender: TObject);
var LuaS: PLuaState;
begin
LuaS := lua_open();
showmessage(inttostr(luaL_dostring(LuaS, 'print(print("Hellow World"))')));
end;
Выводит в диалоге "2".
В модуле lua51U.pas: LUA_ERRRUN = 2;
Как мне кажется вернуть он наверное должен 0, и на консоль вывести Hellow World ?
Считывание из файла
API довольно непривычный. Получается, чтобы считать из файла нужно сначала записть
в стек, а затем считывать в программу.
Если с переменными все OK:
LuaS := lua_open();
luaL_dofile(LuaS, ExtractFilePath(Application.ExeName) + '\sql.lua');
lua_getglobal(LuaS, 'Count');
ShowMessage(lua_tostring(LuaS, 1));
То как привильно считывать таблицы я так и не понял.
lua_gettable на сколько я понял передает таблицу в стек. Но какую и как потом из нее извлекать значения ?
Ketmar (2007-04-29 02:20:00) [8]да я пример с прокси так привёл, "с потолка". с проксей -- это вообще куски из in-house проекта. %-)
Kostafey (2007-04-29 01:33:00) [9]> положить lua5.dll в тот же каталог, где твоя софтина лежит.
> %-)
Да я про настройку прокси сервера. Хорошо бы без этого.
Вдруг у них уже сеть есть.
Кто говорит что у них есть, кто нет, никто ничего не понимаент,
а почтой однако пользуются, мда... без комментариев...
> а дефолтные конфиги должны идти с софтиной. или она должна
> уметь их делать сама.
это-то само собой
> классами и свойствами. %-)
А, черный юмор ;]
Ketmar (2007-04-29 01:18:00) [10]> Kostafey © (29.04.07 01:05) [23]
> не понял ни слова. :)
просто перевод заголовочного файла с импортами из DLL. с сей на паскаль.
> Было бы здорово. Но это ж нужно незнамо как настраивать
> пользовательскую машину при установке.
положить lua5.dll в тот же каталог, где твоя софтина лежит. %-)
а дефолтные конфиги должны идти с софтиной. или она должна уметь их делать сама.
> Ох да. я даже в Delphi не знаю как это делается.
классами и свойствами. %-)
> Первое не знаю что такое
tnx==thanx==thank you.
Kostafey (2007-04-29 01:05:00) [11]> нет. имея в виду FPC. ибо модуль -- он просто wraper для
> DLL/so. я ведь и в консольном/WinAPI/Linux libc софте использую
> Lua. %-)
понял... с 4-го прочтения...
> собственно, я вообще сейчас достаточно много мелкого утиля
> пишу на "чистом" Lua (с допбиблиотеками %-). имея биндинги
> к сокетам, GTK и прочим вкусностям можно не заморачиваться
> всякими сями и паскалями. %-)
Тоже понял. Пока мне это ни к чему.
> straightforward трансляция сишных хидеров
Ну с таким же успехлм мне можно было написать
Заджикали заджикали Все тенали бороговы (с)Льюис Кэрролл
не понял ни слова. :)
> надо тогда напомнить мне завтра в аську -- 43443522. накропаю.
OK
> но я поищу -- была где-то софтинка, которая читает "структурированые" конфиги и потом их можно получиать при помощи функций типа > CfgGetIntKey("server.proxy.port");.
Было бы здорово. Но это ж нужно незнамо как настраивать пользовательскую машину при установке.
> хотя потом я перешёл к варианту, который разбирает конфиг
> сам (Lua-скрипт) и настраивает софтину при помощи всяких
> штук типа SetProxyPort(8080); из самого скрипта.
>
> а потом и вовсе к server.proxy.port = 8080;, что автоматически
> вызывает SetProxyPort(8080) в "родном" коде. и, соотвтетсвенно,
> print(server.proxy.port); вызывает GetProxyPort();. и опять
> получается конфиг в виде plain text. %-)
Ох да. я даже в Delphi не знаю как это делается.
> я имел в виду пример использования API и оформления DLL
> так, чтобы Lua его поняла как внешний модуль и подключила
> при помощи require "module". оно с первого раза не совсем
> "прозрачно".
Как впрочем и со второго :)
> само слово. от благодарностей в виде tnx и спиртосодержащих
> не отказываюсь. %-)
Первое не знаю что такое, а что касается вторго, то все зависит в каком городе
вы находитесь/будете находится :))).
> при нужде попытаюсь пинком задать верное направление. %-)
Тоже правильно :)
Ketmar (2007-04-29 00:24:00) [12]> Kostafey © (29.04.07 00:05) [21]
> Функционал в скрипте? Гм. Вы меня заинтересовали.
а отчего бы и да? %-) удобно, гибко настраивается и вообще здорово.
> Вы говорите о FPC, имеется в виду Lazarus?
нет. имея в виду FPC. ибо модуль -- он просто wraper для DLL/so. я ведь и в консольном/WinAPI/Linux libc софте использую Lua. %-)
собственно, я вообще сейчас достаточно много мелкого утиля пишу на "чистом" Lua (с допбиблиотеками %-). имея биндинги к сокетам, GTK и прочим вкусностям можно не заморачиваться всякими сями и паскалями. %-)
более того, для Lua есть LuaJIT. который добавляет к .DLL где-то 50-60 кил, но скорость увеличивает ощутимо. и не накладывает никаких ограничений на язык. только не знаю, портанул ли его SuperMike под 5.1.2.
> Что касается модуля... модуля от Ketmar'a??? Я ж в нем буду
> до 2-го пришествия разбираться.
неа. это straightforward трансляция сишных хидеров.
> Впрочем, если не сложно, отправьте пожалуйста какие-нибудь
> простые примеры записи/чтения
> конфигоподобных файлов Lua.
надо тогда напомнить мне завтра в аську -- 43443522. накропаю.
на самом деле если учитывать, что у меня обычно (как я и говорил) масса функционала непосредственно на Lua сделана, то многие конфиги в самих скриптах и используются, до "родного" кода не добираясь. %-)
но я поищу -- была где-то софтинка, которая читает "структурированые" конфиги и потом их можно получиать при помощи функций типаCfgGetIntKey("server.proxy.port");.
хотя потом я перешёл к варианту, который разбирает конфиг сам (Lua-скрипт) и настраивает софтину при помощи всяких штук типаSetProxyPort(8080);из самого скрипта.
а потом и вовсе кserver.proxy.port = 8080;, что автоматически вызываетSetProxyPort(8080)в "родном" коде. и, соотвтетсвенно,print(server.proxy.port);вызываетGetProxyPort();. и опять получается конфиг в виде plain text. %-)
> С dll я работал. Как на СPP, так и Delphi, так что все равно
> для dll или exe код.
я имел в виду пример использования API и оформления DLL так, чтобы Lua его поняла как внешний модуль и подключила при помощиrequire "module". оно с первого раза не совсем "прозрачно".
> А вот с obj иметь дело не доводилось, так что разберусь
> я в этом навряд ли.
Lua без напильника собирается при помощи BCC. в DLL. %-) а отсюда уже не так далеко до просто .obj и{$LINK xxx.obj}. только пару стандартных Lua-библиотек придётся написать на Delphi, чтобы не тянуть с собой C runtime.
"не люблю, когда говорят спасибо"
само слово. от благодарностей в виде tnx и спиртосодержащих не отказываюсь. %-)
P.S. Документации немного набрал. Буду разбираться.
если что -- можно стукать в асю. при нужде попытаюсь пинком задать верное направление. %-)
Kostafey (2007-04-29 00:05:00) [13]> Вообще нет ограничения на длину строки при записи. Такое
> ограничение действует только при чтении.
Спасибо, а что же действительно запись в поток TMemIniFile невозможна ?
> на pIII/600 конфиги объёмом в 200-300 кил читает практически
> мгновенно
Впечатляет !
> я за своим более-менее большим софтом...
Функционал в скрипте? Гм. Вы меня заинтересовали.
> нифига. там настолько простое и внятное API, что достаточно
> почитать мануал и примеры на C. а модулем для Delphi/FPC
> я могу поделиться, нет проблем. и простыми примерами тоже.
> и примерами создания библиотек расширения в виде .DLL или
> сразу в своём коде.
Вы говорите о FPC, имеется в виду Lazarus?
Что касается модуля... модуля от Ketmar'a??? Я ж в нем буду до 2-го пришествия разбираться.
Впрочем, если не сложно, отправьте пожалуйста какие-нибудь простые примеры записи/чтения
конфигоподобных файлов Lua.
С dll я работал. Как на СPP, так и Delphi, так что все равно для dll или exe код.
А вот с obj иметь дело не доводилось, так что разберусь я в этом навряд ли.
<offtop>
помниться в старой инфе у вас было сказано что-то вроде:
"не люблю, когда говорят спасибо"
</offtop>
P.S. Документации немного набрал. Буду разбираться.
Ketmar (2007-04-28 22:12:00) [14]вдогон: вообще, Lua родилась именно как язык для конфигов. а потом уже "повзрослела". %-)
Ketmar (2007-04-28 22:11:00) [15]> Kostafey © (28.04.07 20:55) [17]
> Жесть, это же целый скриптовый язык.
угу. и очень изящный, к тому же. и очень быстрый.
у меня на pIII/600 конфиги объёмом в 200-300 кил читает практически мгновенно. %-)
> Несомненно, он применим сам по себе, но что ж такого особенного
> в нем, что позволяет использовать его для хранения небольшого
> количества информации?
а ничего особенного. просто красиво и удобно. и на халяву встроеный язык получаешь. %-)
опять же -- инкрементальный GC. халявная структуризация конфигов (а реализация ассоциативных массивов в Lua ОЧЕНЬ шустрая).
я за своим более-менее большим софтом заметил такую тенденцию: со временем всё больше функционала мигрирует из Delphi/C в Lua. на Lua удобно "прототипировать" новый код -- быстро отлаживается (есть отличная штука -- ldb: отладчик Lua на самой Lua, похож на gdb; монтируем в программу консоль (можно и по telnet'у общаться тогда %-) -- и отладка в руках; без перекомпиляции). а когда отлажено -- как-то уже и лениво переводить на "родной" язык. так и остаётся на Lua.
> Если использовать средства Lua, то это ж надо искать соотвествующие
> примеры кода/компоненты для Delphi.
> А если их не использовать, то игра и свеч не стоит.
нифига. там настолько простое и внятное API, что достаточно почитать мануал и примеры на C. а модулем для Delphi/FPC я могу поделиться, нет проблем. и простыми примерами тоже. и примерами создания библиотек расширения в виде .DLL или сразу в своём коде.
> а к нему еще и интерпритатор устанавливать надо
одна DLL, размером менее 200 килобайт. в принципе -- можно извратиться и собрать на BCC как набор .obj, после чего и DLL не нужна будет.
Loginov Dmitry (2007-04-28 21:34:00) [16]> Будет ли существовать в таком случае при записи с использованием
> TIniFile
> ограничение в 2048 символов ?
Вообще нет ограничения на длину строки при записи. Такое ограничение действует только при чтении.
Kostafey (2007-04-28 20:55:00) [17]Жесть, это же целый скриптовый язык.
Несомненно, он применим сам по себе, но что ж такого особенного
в нем, что позволяет использовать его для хранения небольшого количества информации?
Если использовать средства Lua, то это ж надо искать соотвествующие примеры
кода/компоненты для Delphi.
А если их не использовать, то игра и свеч не стоит.
а к нему еще и интерпритатор устанавливать надо
Ketmar (2007-04-28 20:36:00) [18]http://www.lua.org/
правда, оно щаз на maintenance. в понедельник поднимется. там и исходники, и доки, и ссылки, и вообще много вкусного. только вменяемого модуля для Delphi/FPC нет. у меня свой. тоже кривой. %-)
Kostafey (2007-04-28 20:27:00) [19]> [14] Ketmar © (28.04.07 20:21)
Lua, lua... что-то знакомое.
Не приходилось пользоваться. Не подскажете где документацию по нему поискать ?
З.Ы. Google, Yandex уже шуршат...
Ketmar (2007-04-28 20:21:00) [20]берём Lua. используем. получаем помимо читабельных инишек ещё и скриптовый язык задаром. %-)