0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 16
1

Сохранить выбранный пункт меню при запуске

18.08.2014, 16:14. Показов 2508. Ответов 32
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Простая форма с кнопкой и меню (MainMenu)
Выбрали нужный пункт меню нужно его сохранить,пока не выберут другой пункт
При каждом запуске exe приходиться выбирать пункт заново

Цель
Сохранить последний выбранный пункт меню при каждом запуске без дополнительных файлов (CFG,INI и др.)

Как можно сделать ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.08.2014, 16:14
Ответы с готовыми решениями:

Выделить выбранный пункт меню
Всем привет! Есть код. <div id="navouter"> <div id="nav"> <ul class="lavalamp"...

Разработать скрипт, который выводит меню из шести пунктов, причем выбранный пункт меню подсвечивается определенным цветом.Рекомендуется использование
Разработать скрипт, который выводит меню из шести пунктов, причем выбранный пункт меню...

CSS.Окрасить выбранный пункт меню
Как сделать в CSS так, чтоб при выборе пункта меню его фон окрашивался и оставался таким пока не...

При нажатии на пункт меню скрыть его, и показать другой пункт меню
Прошу помощи, как можно допустим при нажатии на пункт меню, его скрыть, и показать другой пункт...

32
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
18.08.2014, 16:33 2
вероятность такой реализации крайне мала (хотя мои знания в этом вопросе крайне скудны).
Вопрос в том, что где будет хранится Ваше последний выбор? пока программа работает все нужные данные хранятся в выделенной памяти компьютера, которые при закрытии программы (скорее всего) удаляются. Даже если эти данные оставить в памяти, при повторном запуске нужно обращаться к ним именно по тому же адресу где они и лежат. А что делать после перезагрузки компьютера?
Мое мнение использовать файлы для хранения настроек очень не плохой вариант.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32857 / 21191 / 8151
Регистрация: 22.10.2011
Сообщений: 36,448
Записей в блоге: 8
18.08.2014, 17:00 3
Цитата Сообщение от Cefiadri Посмотреть сообщение
без дополнительных файлов (CFG,INI и др.)
Тогда только реестр, "в воздухе" ничего сохраняться не будет... Но INI-файл - гораздо более приемлемый вариант для пользователя, чем захламление реестра.
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 16
18.08.2014, 17:07  [ТС] 4
Цитата Сообщение от UI Посмотреть сообщение
Тогда только реестр, "в воздухе" ничего сохраняться не будет... Но INI-файл - гораздо более приемлемый вариант для пользователя, чем захламление реестра.
Тогда уж лучше вместо реестра в файле CFG

Добавлено через 1 минуту
Можете показать пример на CFG
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32857 / 21191 / 8151
Регистрация: 22.10.2011
Сообщений: 36,448
Записей в блоге: 8
18.08.2014, 17:08 5
Программисты - самый непонятный народ. Есть в наличии готовое средство для работы с INI - так нет, будут извращаться, чтобы сделать свой самопальный CFG. Удачи...
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 16
18.08.2014, 17:10  [ТС] 6
покажите хотя бы на INI файле

Добавлено через 39 секунд
пример сохранения
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32857 / 21191 / 8151
Регистрация: 22.10.2011
Сообщений: 36,448
Записей в блоге: 8
18.08.2014, 17:16 7
Откуда я знаю, что тебе нужно сохранять? Ты ни строки кода, ни скриншота не привел. Про работу с INI на форуме примеров - тысячи, поиск по ключевому слову TIniFile выведет тебя на них... А дальше уже сохраняй то, что нужно, какой-то признак, выставляемый при выборе пункта меню...
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 16
18.08.2014, 17:22  [ТС] 8
Цитата Сообщение от UI Посмотреть сообщение
Откуда я знаю, что тебе нужно сохранять? Ты ни строки кода, ни скриншота не привел. Про работу с INI на форуме примеров - тысячи, поиск по ключевому слову TIniFile выведет тебя на них... А дальше уже сохраняй то, что нужно, какой-то признак, выставляемый при выборе пункта меню...
Простая форма с MainMenu и кнопкой
В меню выбран пункт он передан кнопке а кнопка запускае

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
#include <vcl.h>
#pragma hdrstop
#include "TEST.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
int TEST;
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
void __fastcall TForm1::N1Click(TObject *Sender)
{
  ((TMenuItem *)Sender)->Checked = true;
   TEST = ((TMenuItem *)Sender)->Tag;
   Button1->Caption = ((TMenuItem *)Sender)->Caption;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  switch(TEST)
   {
     case 1: ShellExecute(NULL,"open","programm.exe",NULL,SW_SHOWNORMAL); break;
   }
}
0
Модератор
9317 / 6099 / 2387
Регистрация: 21.01.2014
Сообщений: 26,055
Записей в блоге: 3
19.08.2014, 08:23 9
Cefiadri, в приведенном тобой коде вызов функции ShellExecute приведет к ошибке, т.к. пропущен один параметр. Правильный вызов такой
C++
1
ShellExecute(NULL, "open", "programm.exe", NULL, NULL, SW_SHOWNORMAL);
Добавлено через 1 час 26 минут
По существу вопроса: идея следующая...
1. При старте программа проверяет в своем каталоге наличие файла pMenu.cfg
2. Если файла нет (первый запуск программы или он был удален пользователем), то не выделен ни один пункт меню и запускающая кнопка заблокирована
3. Если файл есть - из него считывется информация, выделяется соответствующий пункт меню, разблокируется запускающая кнопка, готовая запустить указанную программу.
4. При выходе в файл pMenu.cfg записывается информация о том, какой пункт меню был выделен на момент закрытия программы.
Пример программы
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
62
63
64
65
66
67
68
69
70
71
72
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "IniFiles.hpp"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
int Mnu;
String fCfg;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::nExitClick(TObject *Sender)
{
  Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::nCalcClick(TObject *Sender)
{
  ((TMenuItem *)Sender)->Checked = true;
   Mnu = ((TMenuItem *)Sender)->Tag;
   Button1->Caption = ((TMenuItem *)Sender)->Caption;
   Button1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  switch(Mnu)
    {
      case 1 : ShellExecute(NULL, L"open", L"calc.exe", NULL, NULL, SW_SHOWNORMAL); break;
      case 2 : ShellExecute(NULL, L"open", L"cmd.exe", NULL, NULL, SW_SHOWNORMAL); break;
      case 3 : ShellExecute(NULL, L"open", L"mspaint.exe", NULL, NULL, SW_SHOWNORMAL); break;
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  fCfg = ExtractFilePath(Application->ExeName) + "pMenu.cfg";
  if(FileExists(fCfg))
   {
     TIniFile *Ini = new TIniFile(fCfg);
     int mTag = Ini->ReadInteger("MENU","CheckPoint",0);
     for(int i = 0; i < Form1->ComponentCount; i++)
      {
        if(Components[i]->ClassNameIs("TMenuItem"))
         if(((TMenuItem *)Components[i])->Tag == mTag)
          {
            ((TMenuItem *)Components[i])->Checked = true;
            Button1->Caption = ((TMenuItem *)Components[i])->Caption;
            Mnu = mTag;
            Button1->Enabled = true;
          }
      }
     delete Ini;
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  TIniFile *Ini = new TIniFile(fCfg);
  Ini->WriteString("MENU","CheckPoint",IntToStr(Mnu));
  delete Ini;
  CanClose = true;
}
//---------------------------------------------------------------------------
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 16
19.08.2014, 10:39  [ТС] 10
Цитата Сообщение от D1973 Посмотреть сообщение
Cefiadri, в приведенном тобой коде вызов функции ShellExecute приведет к ошибке, т.к. пропущен один параметр. Правильный вызов такой
Код C++
1
ShellExecute(NULL, "open", "programm.exe", NULL, NULL, SW_SHOWNORMAL);
Добавлено через 1 час 26 минут
По существу вопроса: идея следующая...
1. При старте программа проверяет в своем каталоге наличие файла pMenu.cfg
2. Если файла нет (первый запуск программы или он был удален пользователем), то не выделен ни один пункт меню и запускающая кнопка заблокирована
3. Если файл есть - из него считывется информация, выделяется соответствующий пункт меню, разблокируется запускающая кнопка, готовая запустить указанную программу.
4. При выходе в файл pMenu.cfg записывается информация о том, какой пункт меню был выделен на момент закрытия программы.
создал новый проект добавил ваш код,тьма ошибок
не получилось ничего
Как мне ваш код к проекту добавить ?
Вложения
Тип файла: rar code.rar (4.04 Мб, 2 просмотров)
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 16
19.08.2014, 10:59  [ТС] 11
0
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
19.08.2014, 11:07 12
то есть это Вас не смутило?

.h
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
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.Menus.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    TMainMenu *MainMenu1;
    TMenuItem *Menu1;
    TMenuItem *nCalc;
    TMenuItem *N2;
    TMenuItem *nExit;
    void __fastcall nExitClick(TObject *Sender);
    void __fastcall nCalcClick(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
.cpp
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
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  switch(Mnu)
    {
      case 1 : ShellExecute(NULL, L"open", L"calc.exe", NULL, NULL, SW_SHOWNORMAL); break;
      case 2 : ShellExecute(NULL, L"open", L"cmd.exe", NULL, NULL, SW_SHOWNORMAL); break;
      case 3 : ShellExecute(NULL, L"open", L"mspaint.exe", NULL, NULL, SW_SHOWNORMAL); break;
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  fCfg = ExtractFilePath(Application->ExeName) + "pMenu.cfg";
  if(FileExists(fCfg))
   {
     TIniFile *Ini = new TIniFile(fCfg);
     int mTag = Ini->ReadInteger("MENU","CheckPoint",0);
     for(int i = 0; i < Form1->ComponentCount; i++)
      {
        if(Components[i]->ClassNameIs("TMenuItem"))
         if(((TMenuItem *)Components[i])->Tag == mTag)
          {
            ((TMenuItem *)Components[i])->Checked = true;
            Button1->Caption = ((TMenuItem *)Components[i])->Caption;
            Mnu = mTag;
            Button1->Enabled = true;
          }
      }
     delete Ini;
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  TIniFile *Ini = new TIniFile(fCfg);
  Ini->WriteString("MENU","CheckPoint",IntToStr(Mnu));
  delete Ini;
  CanClose = true;
}
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 16
19.08.2014, 11:23  [ТС] 13
Ошибки

Checking project dependencies...
Compiling Project1.cbproj (Debug, Win32)
bcc32 command line for "Unit1.cpp"
c:\program files (x86)\embarcadero\studio\14.0\bin\bcc32.exe -D_DEBUG -DUSEPACKAGES -n.\Win32\Debug -I"c:\program files
(x86)\embarcadero\studio\14.0\include\windows\vcl";"C:\Program Files (x86)\Embarcadero\Studio\14.0\include\boost_1_39\boost\tr1\tr1";"C:\Program
Files (x86)\Embarcadero\Studio\14.0\include\boost_1_39";"c:\program files (x86)\embarcadero\studio\14.0\include";"c:\program files
(x86)\embarcadero\studio\14.0\include\dinkumware";"c:\program files (x86)\embarcadero\studio\14.0\include\windows\crtl";"c:\program files
(x86)\embarcadero\studio\14.0\include\windows\sdk";"c:\program files (x86)\embarcadero\studio\14.0\include\windows\rtl";"c:\program files
(x86)\embarcadero\studio\14.0\include\windows\vcl";"C:\Program Files (x86)\Raize\CS5\Lib\RS-XE6\Win32" -y -Q -k -r- -c -tR -tM -tU -tW -C8
-o.\Win32\Debug\Unit1.obj -w-par -Od -v -vi- -H=.\Win32\Debug\Project1.pch -H Unit1.cpp
[bcc32 Error] Unit1.cpp(34): E2316 '_fastcall TForm1::Button1Click(TObject *)' is not a member of 'TForm1'
[bcc32 Error] Unit1.cpp(44): E2316 '_fastcall TForm1::FormCreate(TObject *)' is not a member of 'TForm1'
[bcc32 Error] Unit1.cpp(66): E2316 '_fastcall TForm1::FormCloseQuery(TObject *,bool &)' is not a member of 'TForm1'
Failed
Elapsed time: 00:00:00.0

Добавлено через 3 минуты
Как исправить ?

Добавлено через 13 секунд
Не понял
0
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
19.08.2014, 11:24 14
а видимо зря, ведь .h файл должен выглядеть как минимум так

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
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.Menus.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    TMainMenu *MainMenu1;
    TMenuItem *Menu1;
    TMenuItem *nCalc;
    TMenuItem *N2;
    TMenuItem *nExit;
void __fastcall Button1Click(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
    void __fastcall nExitClick(TObject *Sender);
    void __fastcall nCalcClick(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 16
19.08.2014, 11:30  [ТС] 15
exe файл не запускает тег выставлен
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 16
19.08.2014, 11:32  [ТС] 16
исходник исправленный
Вложения
Тип файла: rar code1.rar (4.44 Мб, 5 просмотров)
0
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
19.08.2014, 11:34 17
то есть ошибки ушли, но не выполняется запуск некого *.exe файла в Вашем приложении?
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 16
19.08.2014, 11:36  [ТС] 18
да так

Добавлено через 1 минуту
При нажатии на кнопку ничего происходит (нет запуска exe)
0
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
19.08.2014, 11:37 19
в этом блоке исправьте код вот так и скажите результат
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Mnu=1;
  switch(Mnu)
    {
      case 1 : ShellExecute(NULL, L"open", L"calc.exe", NULL, NULL, SW_SHOWNORMAL); break;
      case 2 : ShellExecute(NULL, L"open", L"cmd.exe", NULL, NULL, SW_SHOWNORMAL); break;
      case 3 : ShellExecute(NULL, L"open", L"mspaint.exe", NULL, NULL, SW_SHOWNORMAL); break;
    }
}
Либо просто надо было посмотреть в Ваш INI файл что он сохранил при закрытии приложения.
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 16
19.08.2014, 11:42  [ТС] 20
INI файла вообще нету,При нажатии на кнопку ничего происходит (нет запуска exe)

Тоже самое !
0
19.08.2014, 11:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2014, 11:42
Помогаю со студенческими работами здесь

Как сделать, чтобы Окрашивался выбранный пункт меню, в который перешёл
Есть готовое меню. Как сделать, чтобы при переходе по Выбранному пункту меню, он был окрашен....

Как сделать, чтобы при запуске проги с параметрами, вызывался пункт меню соответствующий введенному параметру?
Добрый день. есть простая консольная прога с меню. хочу, чтобы при запуске проги с параметрами...

Сохранить выбранный путь при перезапуске программы
В общем смысл таков, есть textBox и button. Кнопка работает как &quot;обзор&quot;, по нажатию открывается...

Ошибка при запуске AsyncTask при нажатии на пункт ActionBar
Здравствуйте, почему при нажатии на пункт Action Bar'а вылетает ошибка? @Override public...


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

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

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