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

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

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

Добрый день!
Подскажите пожалуйста код, который позволяет записать в файл в обработчике события кнопки заданное состояние RadioButton, то есть записать не количество Items в файл, а именно текущий ItemIndex в файл
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2014, 13:11
Ответы с готовыми решениями:

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

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

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

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

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

Ну то есть хранить лог проделанных ранее изменений
0
510 / 195 / 26
Регистрация: 07.08.2013
Сообщений: 814
06.05.2014, 15:41 6
Pir12345, дык у Вас есть концепт обращения к элементам формы. Записывайте любым удобным для Вас образом.
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
06.05.2014, 15:44  [ТС] 7
Я записал, например вот так:
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
510 / 195 / 26
Регистрация: 07.08.2013
Сообщений: 814
06.05.2014, 15:52 8
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  [ТС] 9
В txt также получается, после закрытия программы, открытия заново и нажатию кнопки инф в файле log.txt обновляется, а предыдущей нет
0
510 / 195 / 26
Регистрация: 07.08.2013
Сообщений: 814
06.05.2014, 16:18 10
Pir12345, если Вы сделали по той же логике, что я предложил, то прошлый лог должен сохраняться.
Обратите внимание функция чтения в мемо из лог файла в методе создания формы. А по нажатию на кнопку идёт добавление в конец мемо. И далее сохранение обновлённого мемо в лог файл.
0
1404 / 567 / 127
Регистрация: 31.10.2011
Сообщений: 1,955
06.05.2014, 16:19 11
а такой вариант?
C++
1
Ini->WriteString("Logs"+"сюда дописывай индекс или дату изменения",IntToStr(i),ListBox3->Items->Strings[i]);
1
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
06.05.2014, 16:23  [ТС] 12
Если оставить то, что вы написали в FormCreate, то при компиляции выбивает в ошибку исключения- Невозможно открыть log.txt. Process stoped.
0
510 / 195 / 26
Регистрация: 07.08.2013
Сообщений: 814
06.05.2014, 16:24 13
Pir12345, ну так создайте его и положите в папку с проектом. Или любое другое место куда Вам надо и соответсвенно полный путь к файлу.
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
07.05.2014, 12:03  [ТС] 14
Делал, также

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

Добавлено через 19 часов 35 минут
Kulgar, а как в вашем примере добавить еще дату изменений(аналогично, как Dimon предложил)?
0
510 / 195 / 26
Регистрация: 07.08.2013
Сообщений: 814
07.05.2014, 15:28 15
Цитата Сообщение от 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  [ТС] 16
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
Почетный модератор
Эксперт С++
5845 / 2855 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
19.11.2014, 12:41 17
Pir12345, пошаговая инструкция:
1) Создайте унифицированную функцию логирования, принимающую, к примеру, указатель на компонент. Внутри нее реализуйте выдергивание нужных вам свойств того или иного компонента. Добавьте получение текущего времени и запись в файл.
2) В соответствующие методы тех компонентов, которые вы хотите отслеживать, вставьте вашу функцию.

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

Не будем усложнять, возьмем на форме RadioGroup1 (2 значения), Memo1 и Button1. Нужно записать состояния RadioGroup1 в текстовый файл, при этом после переоткрытия программы и повторном нажатии на Button1 предыдущие записи в файле сохраняться.
0
Почетный модератор
Эксперт С++
5845 / 2855 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
19.11.2014, 15:51 19
Цитата Сообщение от 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  [ТС] 20
SatanaXIII, у меня вопрос. А как сделать так, чтобы булева функция была как событие на Button1Click ?
То есть само нажатие Button1 записывать в файл не нужно, а нужно по нажатию Button1 записывать текущие состояния компонент на форме.
Или по другому, изменил Item на Radiogroup, а потом чтобы это записать в файл, нужно нажать Button1

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

Добавлено через 33 минуты
Нет так не идет, подписать все изменения под Button1Click
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2014, 11:28

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru