Prusak |
Отправлено: 31 Мая, 2014 - 18:49:07
|
Наблюдатель
Покинул форум
Сообщений всего: 32
Дата рег-ции: Март 2014
Репутация: 0
|
Владимир было бы не плохо научить кибор работать с ini, что-то типо
INI(секция, ключ, значение_ключа, флаг_чтение_запись).
собераюсь в скрипт ввести графическую оболочку,и тут встал вопрос как хранить данные введенные с контролов.попытался реализовать средствами кибора получилось такое
PHP:string put_p;
char b=' ';
string inp;
//проверяем записаны данные или нет
if (fopen ("c:\config.txt", "r")!=0)
{
l1:if (fread(put_p)!=0)
{
if (formatsn (put_p)==01){fread(put_p);put=put_p;}
goto l1;
}
fclose();
}
//записываем
inp=input ();
if (fopen ("c:\config.txt", "a")!=0)
{
fwrite("01");fwrite(b);fwrite(inp);
fwrite(ENDL);
fclose();
}
где "01" чтото типо ключа, но каждое обращение к fread приводит к чтению.ключ с одним значением выше упомянутый скрипт читает,а вот если потребуется записать сразу два значения, например клавиша бафа на себя через альт.
if (formatsn (put_p)==01){fread(put_p);put=put_p;} вот тут станет проблема. |
|
|
AaronSelenger |
Отправлено: 23 Января, 2017 - 21:13:40
|
Прохожий
Покинул форум
Сообщений всего: 21
Дата рег-ции: Дек. 2016
Репутация: 0
|
Kibor пишет: Работать с файлом настроек надо таким образом
Цитата: int i1=0, i2=1, i3=2;
i1=formatsn(getcontrol(EDIT_0));
i2=formatsn(getcontrol(EDIT_1));
i3=formatsn(getcontrol(EDIT_2));
if (fopen ("C:\Настройка.txt", "w" !=0)//открываем файл
{//если открылся
fwrite(i1); fwrite(" " ;
fwrite(i2); fwrite(" " ;
fwrite(i3); fwrite(" " ;
fclose();//закрываем файл
}
INITDIALOG
{
if (fopen ("C:\Настройка.txt", "r" !=0)//открываем файл для чтения "r"
{//если открылся
fread(i1);
fread(i2);
fread(i3);
fclose();//закрываем файл
sendcontrol(EDIT_0, format(i1));
sendcontrol(EDIT_1, format(i2));
sendcontrol(EDIT_2, format(i3));
}
}
CREATE_INTERFACE
{
DIALOG "Название окна" 237 180 //РазмерX РазмерY
BUTTONSCRIPT "Запустить" 125 121 100 25 //ПозицияX ПозицияY РазмерX РазмерY
//Добавление контролов управления ......
STATIC_0 "текст 1" 10 10 90 18 //ПозицияX ПозицияY РазмерX РазмерY
EDIT_0 "0" 105 8 120 18 //ПозицияX ПозицияY РазмерX РазмерY
STATIC_1 "текст 2" 10 30 90 18 //ПозицияX ПозицияY РазмерX РазмерY
EDIT_1 "1" 105 28 120 18 //ПозицияX ПозицияY РазмерX РазмерY
STATIC_2 "текст 3" 10 50 90 18 //ПозицияX ПозицияY РазмерX РазмерY
EDIT_2 "2" 105 48 120 18 //ПозицияX ПозицияY РазмерX РазмерY
}
А почему не учитывается то, что кибор например могут синхронизировать с другими программами. Ini было бы уместно в таком случаи. |
|
|
idcco |
Отправлено: 26 Марта, 2017 - 14:53:16
|
Участник
Покинул форум
Сообщений всего: 67
Дата рег-ции: Март 2017
Репутация: 5
|
Nightshade2 пишет: ini удобен и поддерживается кучей других програм.
Вообще согласен с автором. Тоже сталкнулся с данной проблемой. Это реализовано во многих программах (редакторы ide, конвертеры всякие, даже гребаный кликерманн имеет оператор iniread и iniwrite), и действительно очень удобно обращаться к одним и тем же настройкам из разных продуктов, жаль нет такой возможности в Киборе и приходится изобретать велосипед... Гугл помог вот информацией с библиотекой kernel32.ini в которой есть такие штуки как GetPrivateProfileString и WritePrivateProfileString. Но воспользоваться ими у меня так и не получилось. Пробовал так:
PHP:string str;
external (INT, "readini", "GetPrivateProfileStringA", "kernel32.dll");
readini ("Section", "Key", "", str, 255, "config.ini");
Значение str получается пустым. Не подскажете, где я ошибся? |
|
|
Kibor |
Отправлено: 26 Марта, 2017 - 17:04:36
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
idcco ,
CODE:char stroka[255];
external (INT, "readini", "GetPrivateProfileStringA", "kernel32.dll");
readini ("Section", "Key", 0, address(#stroka[0]), 255, "C:\config.ini");
messagebox (format(#stroka[0])); |
|
|
idcco |
Отправлено: 27 Марта, 2017 - 13:31:27
|
Участник
Покинул форум
Сообщений всего: 67
Дата рег-ции: Март 2017
Репутация: 5
|
В общем сложности... Все прекрасно работает если не пихать в функцию. Щас поясню...
Есть файл config.ini на диске C:\ (С:\config.ini) со следующим листингом:
Если использовать такой код:
CODE:char str[255];
external (INT, "GetPrivateProfileString", "GetPrivateProfileStringA", "kernel32.dll");
GetPrivateProfileString ("Default", "Name", 0, address (#str[0]), 255, "C:\config.ini");
string name = format (#str[0]);
messagebox (name);
то в переменной name получается верное значение - "Bot". Оно и выводится сообщением messagebox.
Но если запихнуть все это в функцию и вызвать ее:
CODE:function iniread (string ini_key, string ini_section, string ini_filename)
{
char str[255];
if (ini_section == "") ini_section = "Default";
if (ini_filename == "") ini_filename = "C:\config.ini";
external (INT, "GetPrivateProfileString", "GetPrivateProfileStringA", "kernel32.dll");
GetPrivateProfileString (ini_section, ini_key, 0, address (#str[0]), 255, ini_filename);
return (format (#str[0]));
}
string name = iniread ("Name");
messagebox (name);
то в результате name имеет пустое знеачение. Где я ошибся?
(Добавление)
Блин я как всегда!
Надо выводить return'ом переменную. Отбой паники! Простите, был напуган =D
Вот верный код:
CODE:function iniread (string ini_key, string ini_section, string ini_filename)
{
char str[255];
if (ini_section == "") ini_section = "Default";
if (ini_filename == "") ini_filename = "C:\config.ini";
external (INT, "GetPrivateProfileString", "GetPrivateProfileStringA", "kernel32.dll");
GetPrivateProfileString (ini_section, ini_key, 0, address (#str[0]), 255, ini_filename);
string str_return = format (#str[0]);
return str_return;
}
string name = iniread ("Name");
messagebox (name); |
|
|
|