сидел тучу времени, чтобы найти пример, который не работает. все таки нашел, только фичу или багу - еще не понял. (код внизу поста)
вот пожалуйста. логика та же.
- выбираем любой файл в том же каталоге, где сама программа (например ее саму).
- выбрасывается имя файла, остается путь.
- записывается этот путь в INI файл.
- тут же считывается и выводится в ListBox
- пока элемент "память" хранит значение error.ini или .error.ini (string) можно выбирать где угодно лежащие файлы, и в листбоксе будет показываться путь до них и error.ini будет создаваться в каталоге, где лежит программа.
меняем условия.
- элемент "память" меняем на ..error.ini
- перекомпилируем программу, запускаем.
- выбираем файл в каталоге с программой (или ее саму) - пока все правильно, уровнем выше создался error.ini
- уходим в любой другой каталог уровнем выше, чем программа - наблюдаем error.ini уровнем выше, чем выбранный файл.
то есть, элемент "работа с ini-файлами" в моем примере ведет себя вот так:
Add(Ini,8976951,427,238)
{
FileName="" (пусто !!!)
Section="main"
Key="path"
Type=1
}
так как FileName не задан в свойствах, а задается внешним элементом "память" (так как имя может менятся), то поданный на вход в качестве значения параметра ini-файла полный путь он принимает за значение FileName. пусть я ему сунул на входе таку строку: "d: emp", тогда
FileName="d: emp"
а потом, видимо, он видит, что внешний элемент тоже содержит путь, в нашем случае такой "..error.ini". получается что
FileName="d: emp..error.ini"
что, как всем хорошо понятно,
FileName="d:error.ini"
в итоге там ini-файл и пишется.
а у меня изначально проблема была в другом. инишник должен был лежать в подкаталоге относительно самой программы, т.е. внешнее значение .dataerror.ini даже при наличии такого каталоге на уровне программы путем этих махинаций превращается в случае подачи на вход того же "d: emp" в следущее:
FileName="d: empdataerror.ini"
а не
FileName="каталог_программыdataerror.ini"
такого пути есстественно не наблюдается (если только случайно). создавать ini-файлы с нуля элемент умеет, а каталоги - нет, в результате чего ничего туда не пишет.
только вот непонятно, почему при указании в элементе "память" полного имени файла от начала диска все получается? то есть ini-файл создается именно там, где надо? ведь пользуясь вышеописанной логикой работы можно предположить, чтоэтот путь в итоге превратится в кашу..
то есть, если выбрали тот же "d: emp", а полный путь к ini-файл в "d:softdataerror.ini", то должно получится такое:
FileName="d: empd:softdataerror.ini"
как такое переваривается?
или при работе элемент сам прошаривает, что это такое и как это надо использовать?
вобщем полночи убил, в связи с чем пожелание.
дабы предусмотреть такие случаи не изменить ли логику обхода заданных параметров? то есть если есть 4 свойства, 2 заданы внутри, 1 через внешний элемент, то любой поданный на вход параметр считать оставшимся четвертым без вариантов.
ну и вот этот злополучный код...
Add(Memory,12225769,238,7)
{
Default=String(error.ini)
}
Add(Ini,8976951,238,63)
{
Section="main"
Key="path"
Type=1
link(onResult,277663:doAdd,[])
link(FileName,12225769:Value,[])
}
Add(ListBox,277663,301,63)
{
Left=10
Top=60
Width=270
Height=100
AddType=1
SelectAdd=0
}
Add(Button,15913341,14,70)
{
Left=10
Top=10
Width=90
Height=35
Caption="Выберите файл"
link(onClick,3859134:doExecute,[])
}
Add(Hub,12703950,161,70)
{
OutCount=3
link(onEvent1,8976951:doWrite,[])
link(onEvent2,8976951:doRead,[(212,83)(212,69)])
}
Add(ODialog,3859134,63,70)
{
Filter="All|*"
Title="Выберите любой файл"
FileName="fsgame"
link(onExecute,15988081:doPart,[])
}
Add(FilePart,15988081,112,70)
{
link(onPath,12703950:doEvent1,[])
}