purebasic.info

PureBasic forum
Текущее время: Чт сен 20, 2018 10:12 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Создать ini (?)
СообщениеДобавлено: Вт июн 19, 2018 2:07 pm 
Не в сети
док

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 199
Благодарил (а): 20 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Хочу перед запуском программы генерировать ini-файл, чтобы прога запускалась не на пустом месте, как устроить создание ini-файла?

Есть естественный способ создания ini-файла через WritePreferenceString, но мне кажется это заморочисто прописывать каждый параметр и значение с кучей вызовов, я всегда делал конвертированием текста в код и сохранял данные в файл, равносильно запись длинной строки в файл.

Сейчас я пытаюсь попробовать DataSection и IncludeBinary, но не пойму как записывать в файл.
Код:
1
2
3
4
5
DataSection
        Highlight_ini:
        IncludeBinary "Highlight.ini"
        Highlight_iniend:
EndDataSection



То ли WriteData, получив длину данных, то ли WriteString, конвертировав бинарные данные в строку.

Ещё вариант прописать строкой, типа
Код:
1
"привет=2" + #CRLF$ + "привет1=3"


но, есть ли конвертор, чтобы конвертировать текст в код, чтобы опять же не руками всё это писать.

Может иное что есть?

Нашёл пока это

Работает
Код:
1
2
3
4
5
6
7
8
CreateFile(0, "C:\plugin\Highlight-1111111.ini")
WriteData(0, ?IncMap, ?IncMapEnd-?IncMap)
CloseFile(0)
 
DataSection
  IncMap:
   IncludeBinary "Highlight.ini" : IncMapEnd:
EndDataSection



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Создать ini (?)
СообщениеДобавлено: Вт июн 19, 2018 3:53 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11255
Благодарил (а): 4 раз.
Поблагодарили: 429 раз.
AZJIO писал(а):
То ли WriteData, получив длину данных, то ли WriteString, конвертировав бинарные данные в строку.
Лучше использовать WriteData.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Procedure SaveFile_Buff(File.s, *Buff, Size)
  Protected Result = #False
  Protected ID = CreateFile(#PB_Any, File)
  If ID
    If WriteData(ID, *Buff, Size) = Size
      Result = #True
    EndIf
    CloseFile(ID)
  EndIf
  ProcedureReturn Result
EndProcedure
 
 
SaveFile_Buff("C:\plugin\Highlight-1111111.ini", ?Highlight_ini,
              ?Highlight_iniend - ?Highlight_ini)
 
DataSection
  Highlight_ini:
 IncludeBinary "Highlight.ini"
  Highlight_iniend:
EndDataSection


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Создать ini (?)
СообщениеДобавлено: Вт июн 19, 2018 4:04 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 147
Откуда: Україна
Благодарил (а): 10 раз.
Поблагодарили: 10 раз.
Пункты репутации: 4
DefaultValue - The default value to return if the key isn't found or the preference file haven't been opened correctly (file missing for example).


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Создать ini (?)
СообщениеДобавлено: Вт июн 19, 2018 5:36 pm 
Не в сети
док

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 165
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
Я тут viewtopic.php?f=1&t=4876&start=15#p89122 давал пример создания и чтения ини файла.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
;СОЗДАНИЕ ФАЙЛА ИНИЦИАЛИЗАЦИИ И СОХРАНЕНИЕ
If CreatePreferences("C:\ОДКРОЙ МОЙ.INI")
  PreferenceGroup("Global"); создание гуруппы, ниже перечислены ключи
    WritePreferenceString("ApplicationName", "MP3 Player")
    WritePreferenceString("Version", "1.1b")
    WritePreferenceString("йцук", "1.1112")
 
  PreferenceGroup("Window"); создание гуруппы
  PreferenceComment("это типа коментириев")
  PreferenceComment("1234...Координата относительно окна.")
 
  WritePreferenceLong ("WindowX. Координата относительно окна.", 123)
    WritePreferenceLong ("WindowY", 124)
    WritePreferenceFloat("WindowZ", -125.5)
 
  ClosePreferences()
EndIf



Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
;ЧТЕНИЕ ИЗ ФАЙЛА ИНИЦИАЛИЗАЦИИ
OpenPreferences("C:\ОДКРОЙ МОЙ.INI")
; при поиске групп и значений ключей имя должно 100% совпадать иначе ненайдет ничего
   PreferenceGroup("Window")
    Debug "WindowX. Координата относительно окна= "+ReadPreferenceLong ("WindowX. Координата относительно окна.", 50)
    Debug     ReadPreferenceLong ("WindowY", 100)
    Debug Str(ReadPreferenceLong ("WindowY.", 0) )+"   тут неверное имя ключа - WindowY."; тут введен неверное имя ключа
    Debug ReadPreferenceFloat("WindowZ", 300)
WindowZ= ReadPreferenceFloat("WindowZ", 300)
 
  PreferenceGroup("Global")
    Debug ReadPreferenceString("ApplicationName", "")
    Debug ReadPreferenceString("Version", "")
    Debug ReadPreferenceString("йцук", "")
   
    ClosePreferences()


Если нужно присвоять переменной значение то так
WindowZ=ReadPreferenceFloat("WindowZ", 300);
если такого параметра в ини файле ненайдется то присвоится автоматически число, в даном случае 300.
Т. е. если в файле параметр WindowZ будет иметь 123 то присвоит его, а если ненайдет то - 300.
Структура такова:
1 уровень это группы(как папки)
2 уровень это ключи(они как в подпапке)
многоуровневой системы нету, впрочем посмотри любой ини файл и станет ясно как описан, все стандартно.

П.С. а разве не ты это создал Preferences = одна программа - один файл ini?
там вроде все разобрались.
viewtopic.php?f=1&t=4876

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Создать ini (?)
СообщениеДобавлено: Ср июн 20, 2018 12:48 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2285
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
Огромной проблемой является то, что всякие ReadPreferenceInteger() не позволяют устанавливать лимиты.
Т.е. по хорошему после каждого чтения настроек, необходимо тут же проверять считанное число на адекватность. И более того, желательно при этом не просто изменять его на дефолтное, но и сразу записывать дефолт в INI.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Создать ini (?)
СообщениеДобавлено: Ср июн 20, 2018 5:07 am 
Не в сети
док

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 199
Благодарил (а): 20 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
qpAHToMAS писал(а):
Огромной проблемой является то, что всякие ReadPreferenceInteger() не позволяют устанавливать лимиты.
Т.е. по хорошему после каждого чтения настроек, необходимо тут же проверять считанное число на адекватность.

Так заранее не известно по какому критерию это определять. Я кстати сделал проверку данных на шестнадцатеричное число заданной длины, может темку создать(?).


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Создать ini (?)
СообщениеДобавлено: Ср июн 20, 2018 7:36 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 669
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
qpAHToMAS, ты про это?

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
PreferenceGroup("CHECKBOX")
;{
ForEach chk()
s=ReadPreferenceString(chk()\k, ""+chk()\d)
c=Val(s)
; проверка универсальна, только диапазон меняем
If s=""+c And (c>=0 And c=<1); если строка и число не совпали или не вписались в диапазон, то ошибка в ИНИ
chk()\d=c
Else
badINI=1; есть ошибка, при записи все проверки игнорим, сразу перезаписываем всё!
EndIf
Next
;}


когда то потратил прорву времени на проверку чтения из ИНИ чисел, этот способ оказался самым надёжным из всего что тогда придумал для проверки, что же там в реальности прочлось
попутно и этот флаг сам собой придумалься
ИНИ файл, это текстовый файл, по любому строка читается, когда мы читаем как число, нам сей код как число преподносят, 23ж67, вот тут то бардак и начинается


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Создать ini (?)
СообщениеДобавлено: Ср июн 20, 2018 11:31 am 
Не в сети
док

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 165
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
qpAHToMAS писал(а):
Огромной проблемой является то, что всякие ReadPreferenceInteger() не позволяют устанавливать лимиты.
Я непонял про лимиты?
Но зачем тебе это Integer сдался, если он непостоянен, используй
ReadPreferenceLong Long .l 4 bytes -2147483648 to +2147483647
или
ReadPreferenceQuad Quad .q 8 bytes -9223372036854775808 to +9223372036854775807

Integer всегда целочисленое но в зависимости от версии пурика можэт менять розрядность, но если прога сделана на одном пурике где Integer 8 байт то и пшется и читается все переменные и ИНИ тоже как 8 байтовое число.
newJS писал(а):
нам сей код как число преподносят, 23ж67, вот тут то бардак и начинается
Ты это о чем и что это за феншуй - 23ж67 :shock:, If s=""+c, зачем тут кавычки, непойму.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Создать ini (?)
СообщениеДобавлено: Ср июн 20, 2018 1:05 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2285
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
balex1978 писал(а):
qpAHToMAS писал(а):
Огромной проблемой является то, что всякие ReadPreferenceInteger() не позволяют устанавливать лимиты.
Я непонял про лимиты?
Но зачем тебе это Integer сдался, если он непостоянен, используй
ReadPreferenceLong Long .l 4 bytes -2147483648 to +2147483647
или
ReadPreferenceQuad Quad .q 8 bytes -9223372036854775808 to +9223372036854775807

Integer всегда целочисленое но в зависимости от версии пурика можэт менять розрядность, но если прога сделана на одном пурике где Integer 8 байт то и пшется и читается все переменные и ИНИ тоже как 8 байтовое число.
newJS писал(а):
нам сей код как число преподносят, 23ж67, вот тут то бардак и начинается
Ты это о чем и что это за феншуй - 23ж67 :shock:, If s=""+c, зачем тут кавычки, непойму.

Я не про лимит переменной. А про лимит того или иного числа в самой программе.
Например, у тебя в опциях есть ComboBox, у которого 3-и положения (0-2), ты читаешь ReadPreferenceInteger для него и тут же его ставишь как State ComboBox'а, но если там будет число отличное от 0-2, то получится ерунда.
Я делал чтение файла настроек программы так:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
Procedure.i ReadPreferenceIntegerCheck(string.s, min_value.i, max_value.i, def_value.i)
  Protected tmp.i
  tmp = ReadPreferenceInteger(string, def_value)
  If tmp < min_value Or tmp > max_value
    tmp = def_value
    WritePreferenceInteger(string, def_value)
  EndIf
  ProcedureReturn tmp
EndProcedure
 
Procedure.i get_settings()
  If OpenPreferences(settings\settings_file)
    PreferenceGroup("window")
      settings\x = ReadPreferenceInteger("x", #def_x)
      settings\y = ReadPreferenceInteger("y", #def_y)
      settings\mini = ReadPreferenceIntegerCheck("mini", #mini_min, #mini_max, #def_mini)
      settings\top = ReadPreferenceIntegerCheck("top", #top_min, #top_max, #def_top)
    PreferenceGroup("user")
      ;;;
      settings\login = endecode(ReadPreferenceString("login", #def_login), 0)
      settings\password = endecode(ReadPreferenceString("password", #def_password), 0)
      settings\isp = ReadPreferenceIntegerCheck("isp", 0, 1, #def_isp)
      settings\method = ReadPreferenceIntegerCheck("method", 0, 1, #def_method)
    PreferenceGroup("update")
      settings\interval = ReadPreferenceIntegerCheck("interval", #interval_min, #interval_max, #def_interval)
      ;;;
      settings\interval * 60 * 1000
      settings\timeout = ReadPreferenceIntegerCheck("timeout", #timeout_min, #timeout_max, #def_timeout)
      settings\auto_update = ReadPreferenceIntegerCheck("auto_update", 0, 1, #def_auto_update)
      settings\update_on_start = ReadPreferenceIntegerCheck("update_on_start", 0, 1, #def_update_on_start)
      settings\show_question_mark = ReadPreferenceIntegerCheck("show_question_mark", 0, 1, #def_show_question_mark)
      settings\ignore_errors = ReadPreferenceIntegerCheck("ignore_errors", 0, 1, #def_ignore_errors)
    PreferenceGroup("notices")
      settings\money_plus = ReadPreferenceIntegerCheck("money_plus", 0, 1, #def_money_plus)
      ;settings\money_plus_ignore = ReadPreferenceIntegerCheck("money_plus_ignore", 0, 1, #def_money_plus_ignore)
      ;settings\money_plus_ignore_max = ReadPreferenceIntegerCheck("money_plus_ignore_max", #money_plus_ignore_max_min, #money_plus_ignore_max_max, #def_money_plus_ignore_max)
      settings\money_plus_sound = ReadPreferenceIntegerCheck("money_plus_sound", 0, 1, #def_money_plus_sound)
      settings\money_plus_sound_file = ReadPreferenceString("money_plus_sound_file", #def_money_plus_sound_file)
      settings\money_minus = ReadPreferenceIntegerCheck("money_minus", 0, 1, #def_money_minus)
      settings\money_minus_min = ReadPreferenceIntegerCheck("money_minus_min", #money_minus_min_min, #money_minus_min_max, #def_money_minus_min)
      settings\money_minus_hours = ReadPreferenceIntegerCheck("money_minus_hours", #money_minus_hours_min, #money_minus_hours_max, #def_money_minus_hours)
      settings\money_minus_sound = ReadPreferenceIntegerCheck("money_minus_sound", 0, 1, #def_money_minus_sound)
      settings\money_minus_sound_file = ReadPreferenceString("money_minus_sound_file", #def_money_minus_sound_file)
      settings\new_month = ReadPreferenceIntegerCheck("new_month", 0, 1, #def_new_month)
      settings\new_month_days = ReadPreferenceIntegerCheck("new_month_days", #new_month_days_min, #new_month_days_max, #def_new_month_days)
      settings\new_month_hours = ReadPreferenceIntegerCheck("new_month_hours", #new_month_hours_min, #new_month_hours_max, #def_new_month_hours)
      settings\new_month_sound = ReadPreferenceIntegerCheck("new_month_sound", 0, 1, #def_new_month_sound)
      settings\new_month_sound_file = ReadPreferenceString("new_month_sound_file", #def_new_month_sound_file)
      ;
      settings\data_login_last = endecode(ReadPreferenceString("data_login_last", #def_data_login_last), 0)
      settings\data_money_last = ReadPreferenceFloat("data_money_last", #def_data_money_last)
      settings\data_money_last_state = ReadPreferenceIntegerCheck("data_money_last_state", 0, 1, #def_data_money_last_state)
      settings\data_month_last = ReadPreferenceInteger("data_month_last", #def_data_month_last)
      settings\data_minus_last = ReadPreferenceInteger("data_minus_last", #def_data_minus_last)
    PreferenceGroup("skin")
      settings\skin = ReadPreferenceString("skin", #def_skin)
      settings\glass_type = ReadPreferenceIntegerCheck("glass_type", #glass_type_min, #glass_type_max, #def_glass_type)
      settings\text_r = ReadPreferenceIntegerCheck("text_r", #text_rgb_min, #text_rgb_max, #def_text_r)
      settings\text_g = ReadPreferenceIntegerCheck("text_g", #text_rgb_min, #text_rgb_max, #def_text_g)
      settings\text_b = ReadPreferenceIntegerCheck("text_b", #text_rgb_min, #text_rgb_max, #def_text_b)
      settings\text_red_minus = ReadPreferenceIntegerCheck("text_red_minus", 0, 1, #def_text_red_minus)
      settings\trans_main = ReadPreferenceIntegerCheck("trans_main", #trans_main_min, #trans_main_max, #def_trans_main)
      settings\trans_text = ReadPreferenceIntegerCheck("trans_text", #trans_text_min, #trans_text_max, #def_trans_text)
      settings\trans_glass = ReadPreferenceIntegerCheck("trans_glass", #trans_glass_min, #trans_glass_max, #def_trans_glass)
      settings\trans_shadow = ReadPreferenceIntegerCheck("trans_shadow", #trans_shadow_min, #trans_shadow_max, #def_trans_shadow)
      settings\tray_size = ReadPreferenceIntegerCheck("tray_size", #tray_size_min, #tray_size_max, #def_tray_size)
    PreferenceGroup("run")
      settings\first = ReadPreferenceIntegerCheck("first", 0, 1, #def_first)
      settings\check_new = ReadPreferenceIntegerCheck("check_new", 0, 1, #def_check_new)
    ClosePreferences()
  Else
    create_settings_file()
  EndIf
EndProcedure
 
Procedure.i create_settings_file()
  If CreatePreferences(settings\settings_file)
    PreferenceGroup("window")
      WritePreferenceInteger("x", #def_x)
      WritePreferenceInteger("y", #def_y)
      WritePreferenceInteger("mini", #def_mini)
      WritePreferenceInteger("top", #def_top)
    PreferenceGroup("user")
      WritePreferenceString("login", #def_login)
      WritePreferenceString("password", #def_password)
      WritePreferenceInteger("isp", #def_isp)
      WritePreferenceInteger("method", #def_method)
    PreferenceGroup("update")
      WritePreferenceInteger("interval", #def_interval) ;Интервал автообновления в минутах
      WritePreferenceInteger("timeout", #def_timeout) ;Тайм-аут любого обновления
      WritePreferenceInteger("auto_update", #def_auto_update) ;Включено ли автообновление 1/0
      WritePreferenceInteger("update_on_start", #def_update_on_start) ;Включено ли обновление по запуску программы 1/0
      WritePreferenceInteger("show_question_mark", #def_show_question_mark) ;Включено ли отображение "?" знака при обновлении
      WritePreferenceInteger("ignore_errors", #def_ignore_errors) ;Включено ли игнорирования ошибок от автообновления
    PreferenceGroup("notices")
      WritePreferenceInteger("money_plus", #def_money_plus) ;Включен ли нотайс добавления денег
      ;WritePreferenceInteger("money_plus_ignore", #def_money_plus_ignore) ;Включено ли игнорирование добавления денег
      ;WritePreferenceInteger("money_plus_ignore_max", #def_money_plus_ignore_max) ;Максимальная сумма для игнорирования
      WritePreferenceInteger("money_plus_sound", #def_money_plus_sound) ;Включено ли проигрывания звука
      WritePreferenceString("money_plus_sound_file", #def_money_plus_sound_file) ;Звуковой файл
      WritePreferenceInteger("money_minus", #def_money_minus) ;Включен ли нотайс уменьшения денег
      WritePreferenceInteger("money_minus_min", #def_money_minus_min) ;Минимальная сумма для нотайса
      WritePreferenceInteger("money_minus_hours", #def_money_minus_hours) ;Кол-во часов на одно уведомление
      WritePreferenceInteger("money_minus_sound", #def_money_minus_sound) ;Включено ли проигрывания звука
      WritePreferenceString("money_minus_sound_file", #def_money_minus_sound_file) ;Звуковой файл
      WritePreferenceInteger("new_month", #def_new_month) ;Включен ли нотайс нового месяца
      WritePreferenceInteger("new_month_days", #def_new_month_days) ;Кол-во дней до начала нового месяца
      WritePreferenceInteger("new_month_hours", #def_new_month_hours) ;Кол-во часов на одно уведомление
      WritePreferenceInteger("new_month_sound", #def_new_month_sound) ;Включено ли проигрывание звука
      WritePreferenceString("new_month_sound_file", #def_new_month_sound_file) ;Звуковой файл
      WritePreferenceString("data_login_last", #def_data_login_last) ;Логин последнего обновления
      WritePreferenceFloat("data_money_last", #def_data_money_last) ;Кол-во денег последнего обновления
      WritePreferenceInteger("data_money_last_state", #def_data_money_last_state)
      WritePreferenceInteger("data_month_last", #def_data_month_last)
      WritePreferenceInteger("data_minus_last", #def_data_minus_last)
      ;WritePreferenceInteger("notices_utc_minutes", #def_notices_utc_minutes) ;Кол-во минут в часовом поясе
      ;WritePreferenceInteger("notices_utc_from_sys", #def_notices_utc_from_sys) ;Брать минуты часового пояса из настроек ОС
      PreferenceGroup("skin")
      WritePreferenceString("skin", #def_skin) ;Имя стандартного скина
      WritePreferenceInteger("glass_type", #def_glass_type) ;Тип блеска
      WritePreferenceInteger("text_r", #def_text_r) ;RGB текста баланса
      WritePreferenceInteger("text_g", #def_text_g) ;RGB текста баланса
      WritePreferenceInteger("text_b", #def_text_b) ;RGB текста баланса
      WritePreferenceInteger("text_red_minus", #def_text_red_minus) ;Включена ли покраска текста суммы в красный цвет при минусовом балансе 1/0
      WritePreferenceInteger("trans_main", #def_trans_main) ;Прозрачность окна
      WritePreferenceInteger("trans_text", #def_trans_text) ;Прозрачность текста
      WritePreferenceInteger("trans_glass", #def_trans_glass) ;Прозрачность блеска
      WritePreferenceInteger("trans_shadow", #def_trans_shadow) ;Прозрачность тени
      WritePreferenceInteger("tray_size", #def_tray_size) ;Размер трея
    PreferenceGroup("run")
      WritePreferenceInteger("first", #def_first) ;Первый ли запуск программы 1/0
      WritePreferenceInteger("check_new", #def_check_new) ;Проверять наличие новых версий
    ClosePreferences()
    MessageRequester(#title + #title_error, "Файл конфигурации программы (" + Chr(34) + settings\settings_file + Chr(34) + ") не найден и был создан автоматически, пожалуйста, перезапустите программу.", #MB_ICONERROR)
  Else
    MessageRequester(#title + #title_error, "Файл конфигурации программы (" + Chr(34) + settings\settings_file + Chr(34) + ") не найден и не был создан автоматически." + Chr(13) + "Проверьте возможность записи в директорию с программой или удалите существующий файл настроек." + Chr(13) + "Возможно, существует директория с таким же именем.", #MB_ICONERROR)
  EndIf
  End
EndProcedure
 


Но это муторно, приходилось иметь куча констант с лимитами для каждого параметра:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
;settings min/max values
#mini_min = 0
#mini_max = 1
#top_min = 0
#top_max = 1
#interval_min = 3
#interval_max = 180
#timeout_min = 5
#timeout_max = 90
#money_plus_ignore_max_min = 0
#money_plus_ignore_max_max = 50
#money_minus_min_min = 0
#money_minus_min_max = 500
#money_minus_hours_min = 1
#money_minus_hours_max = 24
#new_month_days_min = 1
#new_month_days_max = 7
#new_month_hours_min = 1
#new_month_hours_max = 24
#glass_type_min = 0
#glass_type_max = 3
#text_rgb_min = 0
#text_rgb_max = 255
#trans_main_min = 50
#trans_main_max = 255
#trans_text_min = 50
#trans_text_max = 255
#trans_glass_min = 0
#trans_glass_max = 60
#trans_shadow_min = 0
#trans_shadow_max = 255
#tray_size_min = 150
#tray_size_max = 5000


И не запутаться во всём этом.
+ такой же список для дефолтных параметров.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Создать ini (?)
СообщениеДобавлено: Ср июн 20, 2018 2:50 pm 
Не в сети
док

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 199
Благодарил (а): 20 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
qpAHToMAS
А зачем плодить константы? Не проще ли в актуально зоне указать например
"если размер шрифта меньше 8 и размер шрифта больше 16, то размер шрифта равен 9"
Зачем на эти дела создавать константы мин и макс?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Создать ini (?)
СообщениеДобавлено: Ср июн 20, 2018 2:52 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11255
Благодарил (а): 4 раз.
Поблагодарили: 429 раз.
qpAHToMAS писал(а):
Огромной проблемой является то, что всякие ReadPreferenceInteger() не позволяют устанавливать лимиты.
qpAHToMAS писал(а):
Но это муторно, приходилось иметь куча констант с лимитами для каждого параметра
Если бы функция ReadPreferenceInteger() позволяла устанавливать лимиты, не было бы так муторно?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Создать ini (?)
СообщениеДобавлено: Ср июн 20, 2018 6:53 pm 
Не в сети
док

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 165
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
qpAHToMAS а что если вместо набора лимитов #mini_min = 0, #mini_max = 1... и того что выше, использовать масив в котором и значение нужное считаное с ИНИ или по умолчанию когда файл ненайден и лимит для этого значения.
Ну чтото вроде этого извращения
Код:
1
2
3
4
5
6
7
8
9
10
11
Dim n(200,1)
#Limit=1
 
n(200,0)= ReadPreferenceInteger("timeout", 21);сюда ставим значение координаті прочитаное из ИНИ
n(200,#Limit)= ReadPreferenceInteger("timeout_Lim", 123);а сюда читаем лимит
 
;или с значениями переменных
n(timeout,0)= ReadPreferenceInteger("timeout", 21);сюда ставим значение координаті прочитаное из ИНИ
n(timeout,#Limit)= ReadPreferenceInteger("timeout_Lim", 123);а сюда читаем лимит
 
;в комбобоксе делаем проверку на лимит думаю розберешся


_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Создать ini (?)
СообщениеДобавлено: Чт июн 21, 2018 4:41 am 
Не в сети
док

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 199
Благодарил (а): 20 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Кстати, а что мешает обёртку для функции сделать с указанием лимитов?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Создать ini (?)
СообщениеДобавлено: Чт июн 21, 2018 7:26 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 669
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
balex1978 писал(а):
Ты это о чем и что это за феншуй - 23ж67 :shock:

если в ини окажется непойми что, откуда оно там возьмётся не вахно, то все кто читает число на этом споткнутся, и не получается проверить наличие мусора в пришедшем параметре, только строка позволяет вычислить эту фигню
понимаю, это редкость, но привык проверять всё, до чего додумался, то есть думать за криворуких пользователей
я тебе так скажу, если ты получишь нечто подобное и оно молча уйдёт в прогу, то в лучшем случае ни чего не произойдёт, в худшем винду повесишь, последствия понятны?
balex1978 писал(а):
If s=""+c, зачем тут кавычки, непойму.

посмотри две строки выше, и всё поймёшь, читаем строку, перегоняем её в число и сравниваем эти два строковых значения, вот тут то и вылезет та феншуйная фигня
это всего лишь проверка, что пришло, число или мусор
qpAHToMAS писал(а):
Я не про лимит переменной. А про лимит того или иного числа в самой программе.
Например, у тебя в опциях есть ComboBox, у которого 3-и положения (0-2), ты читаешь ReadPreferenceInteger для него и тут же его ставишь как State ComboBox'а, но если там будет число отличное от 0-2, то получится ерунда.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Создать ini (?)
СообщениеДобавлено: Чт июн 21, 2018 9:35 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11255
Благодарил (а): 4 раз.
Поблагодарили: 429 раз.
AZJIO писал(а):
Кстати, а что мешает обёртку для функции сделать с указанием лимитов?
Так и поступают. Процедура ReadPreferenceIntegerCheck проверяет допустимость значений. viewtopic.php?p=89467#p89467

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB