007wan |
Отправлено: 18 Апреля, 2019 - 13:32:50
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Почему после сохранения в файле некоторые сохраненные настройки рондомно помечаются не 1 и 0, а как 9 и 8. Тесть 1 - активна = 9 и 0 - не активна = 8.CODE:Status_Combobox1 = sendmessage(CB_GETCURSEL, 0, 0, formatiw(Object_Combobox1));
Status_Checkbox1 = SendMessage(Object_Checkbox1, BM_GETSTATE, 0, 0);
Status_Checkbox2 = SendMessage(Object_Checkbox2, BM_GETSTATE, 0, 0);
Status_Checkbox3 = SendMessage(Object_Checkbox3, BM_GETSTATE, 0, 0);
Status_Checkbox4 = SendMessage(Object_Checkbox4, BM_GETSTATE, 0, 0);
Status_Checkbox5 = SendMessage(Object_Checkbox5, BM_GETSTATE, 0, 0);
Status_Checkbox6 = SendMessage(Object_Checkbox6, BM_GETSTATE, 0, 0);
Status_Checkbox7 = SendMessage(Object_Checkbox7, BM_GETSTATE, 0, 0);
Status_Checkbox8 = SendMessage(Object_Checkbox8, BM_GETSTATE, 0, 0);
SendMessage(Object_Edit1, WM_GETTEXT, sizearray(Text_Edit1), address(#Text_Edit1[0]));
WritePrivateProfileString ("Default", "Object_Combobox1", format(Status_Combobox1), PathSaveSettings);
WritePrivateProfileString ("Default", "Object_Checkbox1", format(Status_Checkbox1), PathSaveSettings);
WritePrivateProfileString ("Default", "Object_Checkbox2", format(Status_Checkbox2), PathSaveSettings);
WritePrivateProfileString ("Default", "Object_Checkbox3", format(Status_Checkbox3), PathSaveSettings);
WritePrivateProfileString ("Default", "Object_Checkbox4", format(Status_Checkbox4), PathSaveSettings);
WritePrivateProfileString ("Default", "Object_Checkbox5", format(Status_Checkbox5), PathSaveSettings);
WritePrivateProfileString ("Default", "Object_Checkbox6", format(Status_Checkbox6), PathSaveSettings);
WritePrivateProfileString ("Default", "Object_Checkbox7", format(Status_Checkbox7), PathSaveSettings);
WritePrivateProfileString ("Default", "Object_Checkbox8", format(Status_Checkbox8), PathSaveSettings);
WritePrivateProfileString ("Default", "Object_Edit1", format(#Text_Edit1[0]), PathSaveSettings);
(Добавление)
Тоесть если сохранил галочку как активной, то вместо 1 вписывает 9, а для 0 - 8
(Добавление)
если не найдется решения, то тогда придется в каждом сравнении писать вместо:
CODE:
if(format(Status_Checkbox7) == "1")
{
}
это: CODE:
if(format(Status_Checkbox7) == "1" || format(Status_Checkbox7) == "9")
{
}
|
|
|
Zireael |
Отправлено: 18 Апреля, 2019 - 14:19:15
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: то вместо 1 вписывает 9, а для 0 - 8
Цитата: BM_GETSTATE
Возвращаемое значение указывает текущее состояние кнопки. Это комбинация следующих значений.
Например, галка выбрана и имеет фокус, то возвращается 9 потому что BST_CHECKED (1) + BST_FOCUS (8), если не имеет фокуса, то вернёт 1, т. к. не будет флага что стоит фокус.
В кибор нет побитовых функций, так что проверять так:
CODE:if(Status_Checkbox7 == 1 || Status_Checkbox7 == 9) |
|
|
007wan |
Отправлено: 18 Апреля, 2019 - 14:26:29
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Не могу осмыслить алгоритм загрузки лога из файла в listbox. нужен формат какой-то, который позволит загружать всё из файла в список, даже дату, которая не является сегодняшней.
В файл сохраняется:
Цитата:
[Default]//название заголовка
//сам текст
Я не знаю каким способом лучше сохранять, что бы их быстрее загружать и правильно, если имеются таки переменные как: количество строк, текст для каждой строчки, заголовок(не обязательно.
Если можно, то как сделать это. И еще впрос: можно ли сохранить много текст на разных строчках в файле, если зоголовок всегда будет одинаковым?
(Добавление)
Пока имеется вот такой формат, а какой лучше?текст (Отобразить) Цитата: [18.04.19[1]]
Object_Listbox1=[14:16:11] - Бот запущен.
[18.04.19[2]]
Object_Listbox1=[14:16:12] - Бот остановлен пользовелем.
[18.04.19[3]]
Object_Listbox1=[14:16:13] - Бот запущен.
[18.04.19[4]]
Object_Listbox1=[14:16:13] - Бот остановлен пользовелем.
[18.04.19[5]]
Object_Listbox1=[14:16:13] - Бот запущен.
[18.04.19[6]]
Object_Listbox1=[14:16:13] - Бот остановлен пользовелем.
[18.04.19[7]]
Object_Listbox1=[14:16:14] - Бот запущен.
[18.04.19[8]]
Object_Listbox1=[14:16:14] - Бот остановлен пользовелем.
[18.04.19[9]]
Object_Listbox1=[14:16:14] - Бот запущен.
[18.04.19[10]]
Object_Listbox1=[14:16:14] - Бот остановлен пользовелем.
[18.04.19[11]]
Object_Listbox1=[14:16:14] - Бот запущен.
[18.04.19[12]]
Object_Listbox1=[14:16:14] - Бот остановлен пользовелем. (Отредактировано автором: 18 Апреля, 2019 - 14:28:48) |
|
|
007wan |
Отправлено: 18 Апреля, 2019 - 16:06:35
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Zireael , А как ты считаешь, если делать язык программы, то стоит переводить лог?)) Или это плохая шутка)
(Добавление)
А где ты берешь эту дичь?
Zireael пишет: regexreplace(-1, #s, s, "(\B[A-Z][a-z]*)", " $1");
Просто мне нужно, что бы в каждой строчке или во всем файле искало сегодняшную дату
(Добавление)
А если не найдено, то искать "dd.mm.yy"- где буквы, то они могут быть разные |
|
|
Zireael |
Отправлено: 19 Апреля, 2019 - 03:42:49
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: А где ты берешь эту дичь?
regexreplace(-1, #s, s, "(\B[A-Z][a-z]*)", " $1" );
Набрать в поиске: Регулярные выражения.
Цитата: нужно, что бы в каждой строчке или во всем файле искало сегодняшную дату
CODE:external(INT, "wsprintf", "wsprintfA", "User32.dll" );
string s="Найти сегодняшнюю дату 25.01.20, 19.04.19, 4.11.18"; // строка
messagebox(find_today_date(s));
// найти сегодняшнюю дату в строке
function find_today_date(string s)
{
char day[3], month[3];
string date, year;
int Year, Month, DayOfWeek, Day, Hour, Minute, Second, Milliseconds;
getlocaltime(Year, Month, DayOfWeek, Day, Hour, Minute, Second, Milliseconds);
wsprintf(address(#day[0]), "%02d", Day);
wsprintf(address(#month[0]), "%02d", Month);
regexsearch(1, #year, format(Year), "\d{2}", RIGHTTOLEFT);
if(regexsearch(1, #date, s, "\b"+format(#day[0])+"\."+format(#month[0])+"\."+year+"\b"))return date;
return "Дата не найдена";
}
Цитата: искать "dd.mm.yy"
CODE:string s="Найти дату 19.04.19 в тексте";
messagebox(find_date(s));
s="Некорректная дата 39.04.19 не будет найдена";
messagebox(find_date(s));
s="Найти дату 3.11.1990";
messagebox(find_date(s));
// найти дату в строке
function find_date(string s)
{
string date;
if(regexsearch(1, #date, s, "\b([012][0-9]|3[01]|[1-9])\.(0\d|1[0-2]|[1-9])\.(\d{4}|\d{2})\b"))return date;
return "Дата не найдена";
} |
|
|
007wan |
Отправлено: 19 Апреля, 2019 - 13:38:06
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Во. Спасибо.
(Добавление)
В общем я подумал и решил, что лучше так будет:
Лог в файле (Отобразить) Цитата:
[19.04.2019]
[16:59:37] - Бот запущен.
[16:59:38] - Бот остановлен пользователем.
[16:59:51] - Запуск невозможен. Причина: Браузер не найден.
[16:59:51] - Запуск невозможен. Причина: Браузер не найден.
[16:59:51] - Запуск невозможен. Причина: Браузер не найден.
[16:59:52] - Запуск невозможен. Причина: Браузер не найден.
[20.04.2019]
[16:59:52] - Запуск невозможен. Причина: Браузер не найден.
[21.04.2019]
[16:59:37] - Бот запущен.
Но не могу это реализовать, что бы была найдена определенная дата, которая сегодня, например, "[19.04.2019]" И к тому же искал вот из того что ниже это даты количество строк свободных и добавлял ниже новое для блока этой даты.
А все старое остается выше как сейчас в примере. на следующий день проверит какая сегодня дата и если в файле не найдена "[20.04.2019]", то добавить в самый конец и потом уже после создания блока даты, т.е строчки "[20.04.2019]" уже будет добавлятся лог как в список
(Добавление)
ТОт же принцип как у Цитата: WritePrivateProfileString ("Default", "Object_Edit1", format(#Text_Edit1[0]), PathSaveSettings);
Я могу вместо Default поставить свою дату и он будет загружать только из той даты, которая нужна, но тогда он не сможет загружать отдельные строчки и вписывать, т.е дополнять текст этой даты, а он только заменяет.
(Добавление)
Кажется я понял:
нужно создать цикл, который перебирает все строчки в файле и ищет дату, если такой даты нет, то тоздать ее
(Добавление)
CODE: как вернуть количество строк в файле, что бы заать его в цикле?
if(fopen(temp_fold+"*.txt", "r") != 0)
{
for ()
if(freadline(preiemnik)!=0)
{
}
} |
|
|
Zireael |
Отправлено: 19 Апреля, 2019 - 15:18:47
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: WritePrivateProfileString ("Default", "Object_Edit1", format(#Text_Edit1[0]), PathSaveSettings);
Я могу вместо Default поставить свою дату и он будет загружать только из той даты, которая нужна, но тогда он не сможет загружать отдельные строчки и вписывать, т.е дополнять текст этой даты, а он только заменяет.
Можно узнать сколько параметров в блоке Default, соответственно можно получить их содержимое. Дописывать тоже можно.
Цитата: как вернуть количество строк в файле
CODE:string preiemnik[999];
if(fopen("C:\list_file.txt", "r"))
{
for(int i=0; i<sizearray(preiemnik)-1 && freadline(preiemnik[i]); i++){} // прочитать файл в массив
messagebox("Строк в файле: "+format(i));
messagebox("Первая строка: "+preiemnik[0]);
// preiemnik[1] вторая строка и т.д.
fclose();
} |
|
|
007wan |
Отправлено: 19 Апреля, 2019 - 15:46:01
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
CODE:if(fopen(temp_fold+"*.txt", "r"))
{
for(int i=0; i<sizearray(preiemnik)-1 && freadline(preiemnik[i]); i++){}
messagebox("Строк в файле: "+format(i));
for(int ii=0; ii<format(i); ii++)
{
messagebox("строчки: "+preiemnik[format(ii)]);//не работает
}
fclose();
}
(Добавление)
Я все таки начал выдумывать сложный алгоритм, потому что из-за того, что даты меняются, я стал учитывать, что эту дату можно будет поменять на компьютере( или через биос итд) и тогда(возможно я безумен) из-за этого лог станет работать некоректно, потому что если сделать так как я задумывал, то он будет писать текст для реальной даты в прошлую или будущую ячейку в файле. и тогда получится, что, например текст для сегодняшнего дня будет располагаться где-то в середине, т.к программа не сможет вписывать текст в определеную строчку, а только в конец
(Добавление)
Так что помогите написать простой алгоритм:
суть его.
I)Момент, когда откроется программа и начнет загружать текст из файла в лог:
1)проверяет если сегодняшняя дата в файле
Если нашел, то получаем индекс где написана дата и начиная от индекса, где эта дата до того индекса, когда заканчивается весь файл вставляем в список(Listbox)
II)Момент, когда нужно записать в лог:
при записи в лог сохраняет в файл только что написанную строчку(новую), а старые не тронутые, т.е не надо сохранять лог целиком, а только одну строчку |
|
|
Zireael |
Отправлено: 20 Апреля, 2019 - 01:53:31
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Для примера:
Создать файл "C:\123.ini" с таким содержимым:
Цитата: [18.04.2019]
16:59:38 = Бот остановлен пользователем.
[19.04.2019]
16:59:37 = Бот запущен.
16:59:38 = Бот остановлен пользователем.
16:59:51 = Запуск невозможен. Причина: Браузер не найден.
16:59:52 = Запуск невозможен. Причина: Браузер не найден.
[20.04.2019]
16:59:52 = Запуск невозможен. Причина: Браузер не найден.
[21.04.2019]
16:59:37 = Бот запущен.
Запустить код, чтобы получить все ключи даты 19.04.2019 и их значение.
CODE:external (INT, "GetPrivateProfileString", "GetPrivateProfileStringA", "kernel32.dll");
int length;
char key_ini[99999], value[999];
string path="C:\123.ini"; // путь к ini
string date="19.04.2019";
int x=GetPrivateProfileString (date, 0, 0, address (#key_ini[0]), sizearray(key_ini), path); // получить все ключи
if(x)
{
length=0;
for(int i=0; i+length<=x; i++)
{
if(GetPrivateProfileString (date, format(#key_ini[length]), 0, address (#value[0]), sizearray(value), path)) // получить значение ключа
{
messagebox(format(#key_ini[length])+" "+format(#value[0]));
}
length=length+size(#key_ini[i])+i+1;
}
} |
|
|
|