Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337

Запись состояний элементов VCL

06.05.2014, 13:11. Показов 2278. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Подскажите пожалуйста код, который позволяет записать в файл в обработчике события кнопки заданное состояние RadioButton, то есть записать не количество Items в файл, а именно текущий ItemIndex в файл
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.05.2014, 13:11
Ответы с готовыми решениями:

запись состояний порта lpc1343
Разбираюсь тут с lpc1343. Возникла необходимость считать состояния с определенных портов (по типу PINB или GPIOx_IDR на STM32) в...

Сортировка и умножение элементов матриц (VCL)
Давно на дельфи не писал, помогите, пожалуйста. Надо с визуальными компонентами.

машина состояний
Здравствуйте. Подскажите пожалуйста, что почитать про машины состояний,а то ничего дельного нагуглить не могу.

25
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
06.05.2014, 14:25
Pir12345, нужен номер компоненты RadioButton из массива Components?
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
06.05.2014, 14:28  [ТС]
Вообще мне нужно организовать логирование работы программы за определенный период.
Это логирование должно содержать состояние Радиогруппы (состояние выбранного ItemIndex) и записи из Edit
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
06.05.2014, 15:19
Сохранение и открытие значений полей в отдельный файл / C++ Builder
Это?
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
06.05.2014, 15:35  [ТС]
Да, но это не все. Поля сохранились, при следующем открытии воспроизвелись на форме- это хорошо.
Нужно еще иметь историю полей.Иными словами, чтобы файл ini в который записываются и затем считываются последние записанные значения не обновлялся при смене состояния компонентов формы.
То есть
9:00 первое состояние формы
11:00 второе состояние формы
и т. д.

Ну то есть хранить лог проделанных ранее изменений
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
06.05.2014, 15:41
Pir12345, дык у Вас есть концепт обращения к элементам формы. Записывайте любым удобным для Вас образом.
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
06.05.2014, 15:44  [ТС]
Я записал, например вот так:
C++
1
2
3
4
for (int i = 0; i < ListBox3->Count; i++) {
  Ini->WriteString("Logs",IntToStr(i),ListBox3->Items->Strings[i]);
 
    }
То есть вывел значения которые мне нужны в ListBox3, затем записал их в ini файл.
Проблема в том, что в ini файле сохраняются только текущие изменения, то есть нет истории работы с программой
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
06.05.2014, 15:52
Pir12345, так пишите не в ini файл.
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::FormCreate(TObject *Sender)
{
        Memo1->Lines->LoadFromFile("log.txt");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        for (int i = 0; i < ListBox3->Count; i++)
                Memo1->Lines->Add(ListBox3->Items->Strings[i]);
        Memo1->Lines->SaveToFile("log.txt");
}
1
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
06.05.2014, 16:15  [ТС]
В txt также получается, после закрытия программы, открытия заново и нажатию кнопки инф в файле log.txt обновляется, а предыдущей нет
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
06.05.2014, 16:18
Pir12345, если Вы сделали по той же логике, что я предложил, то прошлый лог должен сохраняться.
Обратите внимание функция чтения в мемо из лог файла в методе создания формы. А по нажатию на кнопку идёт добавление в конец мемо. И далее сохранение обновлённого мемо в лог файл.
0
1408 / 572 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
06.05.2014, 16:19
а такой вариант?
C++
1
Ini->WriteString("Logs"+"сюда дописывай индекс или дату изменения",IntToStr(i),ListBox3->Items->Strings[i]);
1
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
06.05.2014, 16:23  [ТС]
Если оставить то, что вы написали в FormCreate, то при компиляции выбивает в ошибку исключения- Невозможно открыть log.txt. Process stoped.
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
06.05.2014, 16:24
Pir12345, ну так создайте его и положите в папку с проектом. Или любое другое место куда Вам надо и соответсвенно полный путь к файлу.
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
07.05.2014, 12:03  [ТС]
Делал, также

Добавлено через 2 минуты
Сорри, не там написал код, да все работает. Попробую в таком стиле залогить все программу. О результатах напишу. Спасибо большое!

Добавлено через 19 часов 35 минут
Kulgar, а как в вашем примере добавить еще дату изменений(аналогично, как Dimon предложил)?
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
07.05.2014, 15:28
Цитата Сообщение от Pir12345 Посмотреть сообщение
добавить еще дату изменений
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::FormCreate(TObject *Sender)
{
        Memo1->Lines->LoadFromFile("log.txt");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        Memo1->Lines->Add(Now());
        for (int i = 0; i < ListBox3->Count; i++)
                Memo1->Lines->Add(ListBox3->Items->Strings[i]);
        Memo1->Lines->SaveToFile("log.txt");
}
1
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
19.11.2014, 10:40  [ТС]
Kulgar, в продолжении темы. Что то криво работает такой способ, да и я замудрил с ListBox3. Пробую его исключить.
Напомню, что требуется.
Есть некоторое количество vcl элементов на форме. Необходимо произвести логирование работы программы в txt файл.
Решил логировать по состоянию элементов vcl на форме.
Memo1 - вывод логов на форму
Button1- кнопка по нажатию которой выводятся логи в Memo1 и запись текущего состояния в txt файл

Интересует вопрос как корректно сделать логирование?

Делаю так.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   
if (Form1->RadioGroup1->ItemIndex==0)
{
Memo1->Lines->Add("текст");
Memo1->Lines->SaveToFile("logfile.txt");
}
 
if (Form1->RadioGroup1->ItemIndex==1)
{
Memo1->Lines->Add("текст1");
Memo1->Lines->SaveToFile("logfile.txt");
}
   }
...
и т.д. с остальными состояниями элементов.

Запись в файл производится, но при повторном нажатии на Button1 новое сотояние элементов происходит с дозаписью предыдущего, а если закрыть форму и заново открыть, нажать на Button1, в файле txt проиходит перезапись на новое состояние, а не дозапись текущего
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
19.11.2014, 12:41
Pir12345, пошаговая инструкция:
1) Создайте унифицированную функцию логирования, принимающую, к примеру, указатель на компонент. Внутри нее реализуйте выдергивание нужных вам свойств того или иного компонента. Добавьте получение текущего времени и запись в файл.
2) В соответствующие методы тех компонентов, которые вы хотите отслеживать, вставьте вашу функцию.

В итоге у вас получится лог приблизительно следующего вида:
Code
1
2
3
12:45 | Нажата кнопка Button7
12:50 | В поле ввода Edit35 был изменен текст
13:13 | Окно программы закрыто
P.S. Может пригодится: Автоматическое изменение имени файла при записи лога. (Инкремент имени)
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
19.11.2014, 12:51  [ТС]
SatanaXIII, здравствуйте!
Давайте попроще?ну с примером...

Не будем усложнять, возьмем на форме RadioGroup1 (2 значения), Memo1 и Button1. Нужно записать состояния RadioGroup1 в текстовый файл, при этом после переоткрытия программы и повторном нажатии на Button1 предыдущие записи в файле сохраняться.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
19.11.2014, 15:51
Цитата Сообщение от Pir12345 Посмотреть сообщение
Давайте попроще?
Неееее.


C++
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
//---------------------------------------------------------------------------
bool SaveControlState( TObject *ctrl )
{
const String FileName = "D:\\111\\memosave.txt";
 
TStringList *sl = new TStringList();
if( FileExists( FileName ) )
  sl->LoadFromFile( FileName );
 
sl->Add( " Tame = " + Now().FormatString( "hh:mm:ssss" ) );
sl->Add( " Name controls : " + ( static_cast<TWinControl*> (ctrl) )->Name );
 
do
{
if( ctrl->ClassNameIs( "TRadioGroup" ) )
  {
  sl->Add( " Value = " + IntToStr(
                                 ( static_cast<TRadioGroup*> (ctrl) )->ItemIndex )
                                 );
  break;
  }
else if( ctrl->ClassNameIs( "TButton" ) )
  {
  sl->Add( " Value = press" );
  break;
  }
else if( ctrl->ClassNameIs( "TMemo" ) )
  {
  sl->Add( " Text = \"" + ( static_cast<TMemo*> (ctrl) )->Text + "\"");
  break;
  }
else
  {
  delete sl;
  return false;
  }
}while( false ); // Для тех, кто не любит goto
 
sl->SaveToFile( FileName );
 
delete sl;
 
return true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SaveControlState( Sender );
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::RadioGroup1Click(TObject *Sender)
{
SaveControlState( Sender );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1Change(TObject *Sender)
{
SaveControlState( Sender );
}
//---------------------------------------------------------------------------
Добавлено через 1 минуту
Типа лог:
Tame = 15:51:51
Name controls : RadioGroup1
Value = 0
Tame = 15:51:51
Name controls : RadioGroup1
Value = 1
Tame = 15:51:51
Name controls : RadioGroup1
Value = 0
Tame = 15:51:54
Name controls : Memo1
Text = "Memo12
"
Tame = 15:51:55
Name controls : Memo1
Text = "Memo123
"
Tame = 15:51:55
Name controls : Memo1
Text = "Memo1234
"
Tame = 15:51:55
Name controls : Memo1
Text = "Memo12342
"
Tame = 15:51:57
Name controls : Button1
Value = press
Tame = 15:51:59
Name controls : Button1
Value = press
1
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
21.11.2014, 11:28  [ТС]
SatanaXIII, у меня вопрос. А как сделать так, чтобы булева функция была как событие на Button1Click ?
То есть само нажатие Button1 записывать в файл не нужно, а нужно по нажатию Button1 записывать текущие состояния компонент на форме.
Или по другому, изменил Item на Radiogroup, а потом чтобы это записать в файл, нужно нажать Button1

Добавлено через 41 минуту
SatanaXIII, по ходу разобрался. Для этого случая нужно просто убрать функцию, и прописать код в обработчик Button1click. Спасибо, сейчас буду пробовать!

Добавлено через 33 минуты
Нет так не идет, подписать все изменения под Button1Click
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.11.2014, 11:28
Помогаю со студенческими работами здесь

Поиск в пространстве состояний
Здравствуйте. Не могли бы Вы помочь решить задачу, которую мне подсунул коллега. Произвести поиск в пространстве состояний. Дан...

Диаграммы действий и состояний
Я новичок.Кто может объяснить по скайпу, пожалуйста, отпишитесь. Смотрел кучу литературы но так и не понял как связать между собой агенты и...

Поиск в пространстве состояний
Поиск пространств и состояний (в глубину, в ширину,евристический поиск) Поиск в пространстве состояний (в глубину, в ширину,...

Машина состояний. АТiny2313.
Здраствуйте. Столкнулся с такой проблемой: формировал последовательность импульсов в порт, так вот если основной цикл пуст, то всё работает...

Массив состояний заказа
Добрейшего вечера! Соль задания была в чем - создать массив состояний заказа, создать enum-ы под состояния заказа и нужно ввести в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru