Вверх ↑
Этот топик читают: Гость
Ответов: 10
Рейтинг: 0
#1: 2018-11-23 19:38:14 ЛС | профиль | цитата
Простейший пример: кнопка и компонент "INI" с доп.точками "doSectionNames" и "onSectionNames". При нажатии на кнопку, секции из ini-файла не читаются, но если изменить кнопке свойство "Данные" с NULL на Integer (можно даже цифру не ставить) - всё читается на ура. Можно это как-нибудь починить?
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 2193
Рейтинг: 673
#2: 2018-11-23 22:08:45 ЛС | профиль | цитата
Aroyl, вы не выложили схему в которой можно увидеть ошибку.
Aroyl писал(а):
если изменить кнопке свойство "Данные" с NULL на Integer (можно даже цифру не ставить)

То там автоматически будет выставлен 0. Integer всегда чему то равен, если вы не устанавливаете нужное вам значение, то по умолчанию присваивается значение равное 0.
карма: 10

0
Ответов: 10
Рейтинг: 0
#3: 2018-11-24 04:37:01 ЛС | профиль | цитата
sla8a писал(а):
Aroyl, вы не выложили схему в которой можно увидеть ошибку.
Aroyl писал(а):
если изменить кнопке свойство "Данные" с NULL на Integer (можно даже цифру не ставить)

То там автоматически будет выставлен 0. Integer всегда чему то равен, если вы не устанавливаете нужное вам значение, то по умолчанию присваивается значение равное 0.

Спасибо, кэп А по существу вопроса?
карма: 0

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#4: 2018-11-24 11:31:44 ЛС | профиль | цитата
Aroyl писал(а):
А по существу вопроса?

А по существу вопроса -- код построен так, что имя Section не должно содержать пустой строки для всех методов, и все из-за наличия общего метода Open во всех этих методах. NULL в функции ReadString (внутри кода) трансформируется в пустую строку, а вот Integer -- в цифру, потому и работает. Пропиши любое отличное от пустой строки дефолтное значение в свойстве Section, и все должно работать. Это азы построения циркуляции данных в HiAsm-e, описан в справке (а кто ее читает, эту справку) -- сначала считываются верхние точки, затем свойства и только в последнюю очередь поток.

Редактировалось 5 раз(а), последний 2018-11-24 11:40:34
карма: 22

0
Ответов: 2193
Рейтинг: 673
#5: 2018-11-24 13:09:50 ЛС | профиль | цитата
Aroyl, по существу:

Aroyl писал(а):
кнопка и компонент "INI" с доп.точками "doSectionNames" и "onSectionNames". При нажатии на кнопку, секции из ini-файла не читаются
Что мне нужно сделать, чтоб получить вашу "ошибку"?
карма: 10

0
Ответов: 10
Рейтинг: 0
#6: 2018-11-26 18:28:50 ЛС | профиль | цитата
sla8a писал(а):
Что мне нужно сделать, чтоб получить вашу "ошибку"?


На примере вашей схемы - после нажатия кнопки Read ничего не происходит, если Section в компоненте Ini пустая.
Пример неработающей схемы


Add(MainForm,2953706,161,77)
{
Height=165
}
Add(Button,4958922,161,168)
{
Left=10
Top=10
Caption="Read"
link(onClick,15562302:doSectionNames,[])
AddHint(0,37,43,13,Data)
}
Add(Ini,15562302,224,154)
{
FileName="d:\example.ini"
Point(doSectionNames)
Point(onSectionNames)
link(onSectionNames,14690594:doAdd,[])
AddHint(-29,-32,81,13,FileName)
}
Add(ListBox,14690594,287,161)
{
Left=80
Top=10
Width=290
Height=105
}

А если заменить NULL на Integer и 0 - всё работает
А так работает


Add(MainForm,2953706,161,77)
{
Height=165
}
Add(Button,4958922,161,168)
{
Left=10
Top=10
Caption="Read"
Data=Integer(0)
link(onClick,15562302:doSectionNames,[])
AddHint(0,37,21,13,Data)
}
Add(Ini,15562302,224,154)
{
FileName="d:\example.ini"
Point(doSectionNames)
Point(onSectionNames)
link(onSectionNames,14690594:doAdd,[])
AddHint(-29,-32,81,13,FileName)
}
Add(ListBox,14690594,287,161)
{
Left=80
Top=10
Width=290
Height=105
}

--- Добавлено в 2018-11-26 18:38:33

nesco писал(а):
А по существу вопроса -- код построен так, что имя Section не должно содержать пустой строки для всех методов, и все из-за наличия общего метода Open во всех этих методах. NULL в функции ReadString (внутри кода) трансформируется в пустую строку, а вот Integer -- в цифру, потому и работает. Пропиши любое отличное от пустой строки дефолтное значение в свойстве Section, и все должно работать. Это азы построения циркуляции данных в HiAsm-e, описан в справке (а кто ее читает, эту справку) -- сначала считываются верхние точки, затем свойства и только в последнюю очередь поток.


Спасибо за чёткое и подробное объяснение. Про азы циркуляции данных в курсе, но никогда за всё время использования Hiasm не сталкивался с ситуацией, когда значение параметра в компоненте, заданное по-умолчанию (в данном случае пустая строка для Section) вызывало бы ошибку (в данном случае несрабатывание метода doSectionNames) Даже не представляю, как я мог бы догадаться... Что до справки - после того, как chm файл перестал отображать содержимое страницы из-за ошибки с bbcode - стало жутко неудобно лезть каждый раз на Wiki. Ещё раз спасибо!

Редактировалось 3 раз(а), последний 2018-11-26 18:38:33
карма: 0

0
Ответов: 9906
Рейтинг: 351
#7: 2018-11-26 21:22:18 ЛС | профиль | цитата
Aroyl писал(а):
после нажатия кнопки Read ничего не происходит, если Section в компоненте Ini пустая.
Не подтверждается
4Aroyl.png
карма: 9

0
Ответов: 2193
Рейтинг: 673
#8: 2018-11-26 21:57:01 ЛС | профиль | цитата
Aroyl, у меня нет ошибки и при Null, как видите и у Galkov-а тоже.
Нет ошибки

nesco писал(а):
имя Section не должно содержать пустой строки для всех методов

nesco, а при чем Section в Open к doSectionNames? Понятно что происходит вызов Open, но даже если закоментировать (//Ini.Section := ReadString(_Data,_data_Section,_prop_Section);) все равно doSectionNames отрабатывает. Зачем doSectionNames значение Section если происходит поиск всех секций?

Редактировалось 6 раз(а), последний 2018-11-26 22:18:29
карма: 10

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#9: 2018-11-26 22:19:31 ЛС | профиль | цитата
Может у нас код разный, а может тогда я чего-то не догнал
Смотрим код и попытаемся его разобрать
procedure THIini.Open;
begin
Result := false;
Ini := OpenIniFile(ReadFileName(ReadString(_Data,_data_FileName,_prop_FileName)));
Ini.Section := ReadString(_Data,_data_Section,_prop_Section);
if Ini.Section = '' then exit;
// ifmRead - флаг для чтения; ifmWrite - флаг для записи
Ini.Mode := ifm;
Result := true;
end;
и
procedure THIini._work_doSectionNames;
var StrList:PStrList;
I:integer;
begin
TRY
if not Open(_Data,ifmRead) then exit;
StrList := NewStrList;
Ini.GetSectionNames(strList);
for i := 0 to strList.Count-1 do
_hi_OnEvent(_event_onSectionNames,strList.Items[i]);
strList.free;
FINALLY
Ini.Free;
END;
end;
Как может выполнятся код после Open в doSectionNames, если функция Open вернет False, а вернет она ее, если Ini.Section = '' ?
Это чисто логические разборки кода, но честно, я не проверял его конкретно, может я где-то и ошибаюсь.

Редактировалось 4 раз(а), последний 2018-11-26 22:24:41
карма: 22

0
Ответов: 2193
Рейтинг: 673
#10: 2018-11-26 22:24:18 ЛС | профиль | цитата
 if Ini.Section = '' then exit; 
Вот этого у меня нет. Это только у вас или на SVN тоже внесено? И вообще зачем это?

Вижу что на SVN есть обновление. Вопрос зачем это?

Редактировалось 2 раз(а), последний 2018-11-26 22:27:05
карма: 10

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#11: 2018-11-26 22:25:33 ЛС | профиль | цитата
sla8a писал(а):
Вот этого у меня нет. Это только у вас или на SVN тоже внесено? И вообще зачем это?

Понятия не имею, сейчас проверю.

--- Добавлено в 2018-11-26 22:28:21

Да, на SVN тоже так же, как и у меня. А вот когда и почему, я в упор не помню, посмотрю коммент, но только завтра.

--- Добавлено в 2018-11-26 22:29:28

sla8a писал(а):
Вижу что на SVN есть обновление. Вопрос зачем это?

А что в комментах написано?

PS Вот в упор не помню, зачем я это туда всунул.

Редактировалось 3 раз(а), последний 2018-11-26 22:30:59
карма: 22

0
Ответов: 2193
Рейтинг: 673
#12: 2018-11-26 22:31:13 ЛС | профиль | цитата
Тут смотрю http://svn.hiasm.com/packs/delphi/code/, коментов нет.
карма: 10

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#13: 2018-11-26 22:32:11 ЛС | профиль | цитата
sla8a писал(а):
Тут смотрю http://svn.hiasm.com/packs/delphi/code/, коментов нет.

Надо черепахой смотреть, но это только завтра.

--- Добавлено в 2018-11-26 22:41:39

Может вот поэтому я это вставил -- http://forum.hiasm.com/topic/66481

Редактировалось 4 раз(а), последний 2018-11-26 22:46:50
карма: 22

0
Ответов: 2193
Рейтинг: 673
#14: 2018-11-26 22:46:09 ЛС | профиль | цитата
Вот это помню: Ini очистка файла а
if Ini.Section = '' then exit; [/code] пока не нашел.
[color=gray][size=9]Редактировалось 1 раз(а), последний 2018-11-26 22:46:37[/size][/color]
карма: 10

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#15: 2018-11-26 22:47:49 ЛС | профиль | цитата
В коде вот еще что есть -- if key = '' then exit;. Скорее всего, именно по причине RunTime Errora и была правка (см. мой предыдущий пост).

Редактировалось 1 раз(а), последний 2018-11-26 22:50:31
карма: 22

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