Вверх ↑
Этот топик читают: Гость
Ответов: 499
Рейтинг: 1
#1: 2007-03-29 22:13:35 ЛС | профиль | цитата
некая странность обнаружилась. для чтения параметра из файла не в текущем каталоге достаточно проставить относительную ссылку:
( файл stalked.ini находится в каталоге data)
Add(Ini,15103339,182,126)
{
FileName=".datastalked.ini"
Section="main"
Key="gamepath"
Type=1
}

однако для записи этого же параметра путь необходим абсолютный, причем с двойными слешами:

Add(Ini,8976951,308,189)
{
FileName="D:\soft\tools\HiAsm\stalker\data\stalked.ini"
Section="main"
Key="gamepath"
Type=1
}

очнь неудобно держать два компонента для одного ключа. да еще и две переменные, хранящие путь к файлу.
карма: 0

0
Ответов: 9906
Рейтинг: 351
#2: 2007-03-29 22:17:01 ЛС | профиль | цитата
HikeR писал(а):
однако для записи этого же параметра путь необходим абсолютный, причем с двойными слешами:

Доказательства в студию
карма: 9

0
Администрация
Ответов: 15295
Рейтинг: 1519
#3: 2007-03-29 22:18:07 ЛС | профиль | цитата
HikeR писал(а):
однако для записи этого же параметра путь необходим абсолютный

неподтверждается.

HikeR писал(а):
причем с двойными слешами

двойной должен стоять только перед каталогом tools
карма: 27
0
Ответов: 3514
Рейтинг: 184
#4: 2007-03-29 22:22:14 ЛС | профиль | цитата
FileName=".datastalked.ini"

точка там нафиг?
карма: 0
0
Администрация
Ответов: 15295
Рейтинг: 1519
#5: 2007-03-29 22:28:39 ЛС | профиль | цитата
стандартное обозначение текущего каталога
карма: 27
0
Ответов: 3514
Рейтинг: 184
#6: 2007-03-29 22:36:41 ЛС | профиль | цитата
Я делаю без точки, и всё отлично читается и записывается
карма: 0
0
Ответов: 499
Рейтинг: 1
#7: 2007-03-29 23:50:50 ЛС | профиль | цитата
такс... я так понимаю, что проблема в том, что " " - это табуляция, "
" - конец строки (или что типа этого)
можно список всех спецсимволов, которые HiAsm интерпетирует как управляющие?

p.s.
блин, даже в надписях слэш трактуется как начало спецсимвола...
карма: 0

0
Ответов: 3514
Рейтинг: 184
#8: 2007-03-29 23:57:52 ЛС | профиль | цитата
ставь два слэша
карма: 0
0
Ответов: 9906
Рейтинг: 351
#9: 2007-03-30 00:09:30 ЛС | профиль | цитата
HikeR, проблема совершенно в другом

Что 99% новичков (и не только) не понимают, что понятие "очевидно" - ОТНОСИТЕЛЬНОЕ
Это твоими очами видно, что у тебя на компе.
А нашими - не видно.
Если ставить ставки как в казино - я бы поставил на то, что ты перед записью каким-то образом менял текущую папку.
Впрочем, с самого начала предполагать, что она совпадает с папкой запуска программы - не умно как минимум.

Но это гадание на кофейной гуще, которое мало кому интересно.
Прочитай разделы
!Наши_правила!
!Обмен_файлами!
И выложи простенькую схему, которую каждый сможет у себя воспроизвести и увидеть твою незадачу.
И помощь получишь незамедлительно
А словесами можно еще неделю упражняться - и бестолку

От тебя не просят ничего сверхестественного: лишь чтобы то, что видишь ты - увидели другие.


А про обратные косые - читаешь справку, и все
карма: 9

0
Ответов: 499
Рейтинг: 1
#10: 2007-03-30 01:13:36 ЛС | профиль | цитата
я не совсем новичок, просто то, что для вас очевидно, для меня стало не сразу.
вот схема.
Add(StrList,3616182,154,42)
{
Strings=#3:.a|3:.|3:.c|3:.d|3:.e|3:.f|3:.g|3:.h|3:.i|3:.j|3:.k|3:.l|3:.m|3:.
|3:.o|3:.p|3:.q|3:.|3:.s|3:. |3:.u|3:.v|3:.w|3:.x|3:.y|3:.z|
}
Add(ArrayEnum,2768686,119,133)
{
link(onItem,5118179:doWrite,[])
link(onEndEnum,2120324:doEnum,[(166,146)(166,195)])
link(Array,1070503:Var1,[(125,107)])
}
Add(Ini,5118179,245,126)
{
FileName="abc"
Section="main"
Type=1
link(Key,2768686:Item,[(265,116)(198,116)(198,175)(125,175)])
}
Add(Button,6822326,56,133)
{
Left=10
Top=180
link(onClick,2768686:doEnum,[])
}
Add(ListBox,15334728,245,189)
{
Left=80
Top=10
Height=360
}
Add(ArrayEnum,2120324,182,189)
{
link(onItem,15334728:doAdd,[])
link(onEndEnum,7704623:doEnum,[(224,202)(224,243)(158,243)(158,272)])
link(Array,1070503:Var3,[(188,107)])
}
Add(GetDataEx,1070503,161,98)
{
link(Data,3616182:Array,[])
}
Add(ListBox,14604827,315,266)
{
Left=150
Top=10
Height=360
}
Add(ArrayEnum,7704623,168,266)
{
link(onItem,3607995:doRead,[])
link(Array,1070503:Var2,[(174,189)(174,189)])
}
Add(Ini,3607995,245,266)
{
FileName="abc"
Section="main"
Type=1
link(onResult,14604827:doAdd,[])
link(Key,7704623:Item,[(265,256)(223,256)(223,308)(174,308)])
}
сразу видно, что символы
обрабатываются неверно (для этого примера)

реальный пример. при запуске программы проверяется наличие файла настроек, в котором указан путь к некоторому каталогу для дальнейшего использования.
если файла нет, то предлагается выбрать файл, лежащий в нужном каталоге, потом из его полного пути выкидывается имя файла, и оставшийся путь пишет в файл настроек (не нашел средство для выбора просто каталогов).
если файл есть, и путь прописан, то считывается значение пути и присваивается глобальной переменной. (в примере нет)
вот пример. для упрощения выбираем путь к самом экзешнику программы, но в реале нужный каталог может быть где угодно.
Add(MainForm,4314951,63,119)
{
Left=20
Top=105
Width=421
Height=293
Visible=1
link(onCreate,16534992:doFileExists,[])
}
Add(FilePart,15988081,315,133)
{
link(onPath,3851752:doEvent1,[])
}
Add(FileTools,16534992,119,133)
{
link(onEnd,2800087:doCompare,[])
link(FileName,12202576:Var1,[(125,121)])
}
Add(Memory,12225769,266,77)
{
Default=String(data\test.ini)
}
Add(If_else,2800087,168,133)
{
Op2=Integer(0)
link(onTrue,14717202:doMessage,[])
link(onFalse,8976951:doRead,[(211,146)(211,188)])
}
Add(GetDataEx,12202576,259,112)
{
link(Data,12225769:Value,[])
}
Add(Ini,8976951,420,182)
{
Section="main"
Key="path"
Type=1
link(onResult,3956664:doEvent2,[(460,188)(460,153)])
link(FileName,12202576:Var3,[(426,121)])
}
Add(ODialog,3859134,266,133)
{
Filter="exe|*.exe|All|*"
Title="Укажите путь к файлу fsgame.ltx в папке игры."
FileName="test"
link(onExecute,15988081:doPart,[])
}
Add(Message,14717202,217,133)
{
Message="Похоже, что это первый запуск программы.
После нажатия кнопки ОК укажите расположение
файла test.exe"
Caption="Первый запуск"
Icon=4
link(onMessage,3859134:doExecute,[])
}
Add(Message,4539096,525,168)
{
Caption="расположение:"
link(onMessage,4314951:doClose,[(572,174)(572,222)(54,222)(54,146)])
}
Add(Hub,3956664,469,140)
{
InCount=2
link(onEvent1,9664091:doValue,[])
link(onEvent2,4539096:doMessage,[(513,153)(513,174)])
}
Add(Hub,3851752,364,133)
{
link(onEvent1,8976951:doWrite,[(408,139)(408,195)])
link(onEvent2,3956664:doEvent1,[])
}
Add(GlobalVar,9664091,525,140)
{
Name="path"
}
здесь файл настроек test.ini должен быть в каталоге data (здесь его надо создать самому).
пока элемент "память" содержит этот путь в виде data\test.ini все хорошо. здесь встретилась буква "t" в имени, этот случай понятен и решаем, так как мы сами определяем имя файла.
но если расположение файла настроек будет предварительно указываться пользователем? тогда придется элементу "работа c ini-файлами" передавать полный путь, в котором могут встретиться "запрещенные" последовательности...
карма: 0

0
Администрация
Ответов: 15295
Рейтинг: 1519
#11: 2007-03-30 01:21:36 ЛС | профиль | цитата
пример из второй схемы работает.

HikeR писал(а):
но если расположение файла настроек будет предварительно указываться пользователем? тогда придется элементу "работа c ini-файлами" передавать полный путь, в котором могут встретиться "запрещенные" последовательности...

замена спец символов происходит на этапе кодогенерации и к конечному приложению отшения не имеет.
карма: 27
0
Ответов: 499
Рейтинг: 1
#12: 2007-03-30 06:06:50 ЛС | профиль | цитата
хорошо. второй пример и должен работать.

сидел тучу времени, чтобы найти пример, который не работает. все таки нашел, только фичу или багу - еще не понял. (код внизу поста)

вот пожалуйста. логика та же.
- выбираем любой файл в том же каталоге, где сама программа (например ее саму).
- выбрасывается имя файла, остается путь.
- записывается этот путь в 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,[])
}

карма: 0

0
Ответов: 9906
Рейтинг: 351
#13: 2007-03-30 11:02:20 ЛС | профиль | цитата
HikeR писал(а):
пока элемент "память" хранит значение error.ini или .error.ini (string) можно выбирать где угодно лежащие файлы, и в листбоксе будет показываться путь до них и error.ini будет создаваться в каталоге, где лежит программа

Не правда.
error.ini будет создаваться и читаться в текущей папке. Которая запросто меняется после работы ODialog.

HikeR писал(а):
а потом, видимо, он видит, что внешний элемент тоже содержит путь

Чего народ-то смешить: кто он, и кого видит ???
Делать ему (осталось выяснить - кому) больше нефиг, как чего-то смотреть и пытаться кого-то надурить.
Когда в ODialog (это просто виндячий модал) Вы выбираете d: empxxx, текущей папкой для всего процесса становится d: emp

Это не наша логика, а логика винды, и нам ее поменять - не судьба.
Не пользуйтесь относительными путями, не будет проблем.
Даже скажу больше, что гарантий того, что у Вас при старте программы текущая папка процесса совпадает с папкой приложения - НИКАКИХ.

То что делает пользователь Вашей программы, Вы не контролируете.
А он обязательно запустит ее как-нибудь хитрозадо (уверяю Вас, пользователь может сделать все что возможно, и даже нет - это аксиома), совершенно из другого места.
И что, опять топик для обсуждения создавать
карма: 9

0
Администрация
Ответов: 15295
Рейтинг: 1519
#14: 2007-03-30 13:39:16 ЛС | профиль | цитата
HikeR, правильная схема будет такая:
code_1169.txt
карма: 27
0
файлы: 1code_1169.txt [1.2KB] [379]
Ответов: 9906
Рейтинг: 351
#15: 2007-03-30 13:44:57 ЛС | профиль | цитата
Dilma, а мне не показалось, что менять расположение INI-файла входит в задачу
карма: 9

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)