Re[4]: Помогите найти ошибку!
От: artgonch  
Дата: 09.11.03 12:41
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Ты бы хоть код привёл.

Привожу:
1. Заголовок.
//---------------------------------------------------------------------------

#ifndef AccountManagmentFrmH
#define AccountManagmentFrmH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <CheckLst.hpp>
#include "types.h"
#include <vector>
//---------------------------------------------------------------------------
class TfrmAccountManagment : public TForm
{
__published:    // IDE-managed Components
        TGroupBox *rgpUserList;
        TLabel *Label1;
        TComboBox *cbxUserList;
        TButton *btnAddUser;
        TButton *btnRemoveUser;
        TButton *btnEditUser;
        TRadioGroup *rgpUserType;
        TLabel *Label2;
        TCheckListBox *clbUserRights;
        TButton *btnOk;
        TButton *btnCancel;
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
        void __fastcall rgpUserTypeClick(TObject *Sender);
        void __fastcall clbUserRightsClickCheck(TObject *Sender);
        void __fastcall cbxUserListChange(TObject *Sender);
        void __fastcall btnRemoveUserClick(TObject *Sender);
        void __fastcall btnAddUserClick(TObject *Sender);
        void __fastcall btnEditUserClick(TObject *Sender);
private:
public:        // User declarations
        __fastcall TfrmAccountManagment(TComponent* Owner);
private:
        //TUSER_ACCAUNT_RECORD * Accounts;
        std::vector<TUSER_ACCAUNT_RECORD> Accounts;
        void __fastcall SetUserRightsControlsValues(int UserIndex);
        bool init;
};
//---------------------------------------------------------------------------
extern PACKAGE TfrmAccountManagment *frmAccountManagment;
//---------------------------------------------------------------------------
#endif

2. CPP-файл.
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "AccountManagmentFrm.h"
#include <IniFiles.hpp>
#include "NameNPassWrdFrm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmAccountManagment *frmAccountManagment;

static const String USER_LIST_PATH(".\\users.ini");

extern TUSER_ACCAUNT_RECORD MainUserAccount;

//---------------------------------------------------------------------------
__fastcall TfrmAccountManagment::TfrmAccountManagment(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

#pragma argsused
void __fastcall TfrmAccountManagment::FormCreate(TObject *Sender)
{
     init = true;
     TIniFile * ini;
     try
     {
          // Çàãðóçèòü ñïèñîê ïîëüçîâàòåëåé
          ini = new TIniFile(USER_LIST_PATH);
          ini->ReadSections(cbxUserList->Items);
          //Accounts = new TUSER_ACCAUNT_RECORD[ cbxUserList->Items->Count ];

          // Äëÿ êàæäîãî ïîëüçîâàòåëÿ ïðî÷åñòü ñïèñîê åãî ïàðàìåòðîâ
          for (int i = 0; i < cbxUserList->Items->Count; i++)
          {
               //
               TUSER_ACCAUNT_RECORD acnt;
               String & s = cbxUserList->Items->Strings[ i ];
               acnt.UserName = s;
               acnt.PassWrd  = ini->ReadString(s, "PassWrd", "");
               ((int)acnt.UserType) = ini->ReadInteger(s, "UserType", 1);
               bool DfltRights = acnt.UserType == utADMIN;
               acnt.CanClear = ini->ReadBool(s, "CanClear", DfltRights);
               acnt.CanImport = ini->ReadBool(s, "CanImport", DfltRights);
               acnt.CanExport = ini->ReadBool(s, "CanExport", DfltRights);
               acnt.CanViewRating = ini->ReadBool(s, "CanViewRating", true);
               acnt.CanBuildText = ini->ReadBool(s, "CanBuildText", true);
               acnt.CanBuildFullText = ini->ReadBool(s, "CanBuildFullText", DfltRights);
               Accounts.push_back(acnt);
          } /* for (int i = 0; i < cbxUserList->Items->Count; i++) */

          for (int i = 0; i < cbxUserList->Items->Count; i++)
               if (MainUserAccount.UserName.AnsiCompare(cbxUserList->Items->Strings[ i ]) == 0)
               {
                    cbxUserList->ItemIndex = i;
                    cbxUserListChange(cbxUserList);
                    rgpUserType->ItemIndex = 0;
                    break;
               }
     }
     __finally
     {
          delete ini;
          init = false;
     }
}
//---------------------------------------------------------------------------

#pragma argsused
void __fastcall TfrmAccountManagment::FormClose(TObject *Sender,
      TCloseAction &Action)
{
     if (ModalResult == mrCancel)
     {
          Action = caHide;
          return;
     }
     // Ñîõðàíåíèå íàñòðîåê äëÿ âñå ïîëüçîâàòåëåé
     TIniFile * ini;
     try
     {
          ini = new TIniFile(USER_LIST_PATH);
          for (int i = 0; i < cbxUserList->Items->Count; i++)
          {
               String & s = cbxUserList->Items->Strings[ i ];
               ini->WriteString(s, "PassWrd", Accounts[ i ].PassWrd);
               ini->WriteInteger(s, "UserType", Accounts[ i ].UserType);
               // Çàïèñü ðàçðåøåíèé ïîëüçîâàòåëÿ
               ini->WriteBool(s, "CanClear", Accounts[ i ].CanClear);
               ini->WriteBool(s, "CanExport", Accounts[ i ].CanExport);
               ini->WriteBool(s, "CanImport", Accounts[ i ].CanImport);
               ini->WriteBool(s, "CanViewRating", Accounts[ i ].CanViewRating);
               ini->WriteBool(s, "CanBuildText", Accounts[ i ].CanBuildText);
               ini->WriteBool(s, "CanBuildFullText", Accounts[ i ].CanBuildFullText);
          }
     }
     __finally
     {
          delete ini;
     }
     Action = caFree;
}
//---------------------------------------------------------------------------

#pragma argsused
void __fastcall TfrmAccountManagment::rgpUserTypeClick(TObject *Sender)
{
     // Åñëè âûáðàí òèï àäìèíèñòðàòîðà
     if (cbxUserList->ItemIndex == -1 || init)
          return;

     if (rgpUserType->ItemIndex == 0)
     {
/*          if (MessageDlg("Äàòü ïîëüçîâàòåëþ ïðàââà àäìèíèñòðàòîðà?", mtConfirmation,
               TMsgDlgButtons() << mbYes << mbNo, 0) == mrYes)*/
          {
               Accounts[ cbxUserList->ItemIndex ].InitForAdmin();
               clbUserRights->Enabled = false;
          }
     }
     else
     {
/*          if (MessageDlg("Ïîíèçèòü àäìèíèñòðàòîðà äî ïîëüçîâàòåëÿ?", mtConfirmation,
               TMsgDlgButtons() << mbYes << mbNo, 0) == mrYes)*/
          {
               Accounts[ cbxUserList->ItemIndex ].InitForUser();
               clbUserRights->Enabled = MainUserAccount.UserName.AnsiCompare(cbxUserList->Items->Strings[ cbxUserList->ItemIndex ]) == 0;
          }
     }
     //SetUserRightsControlsValues(cbxUserList->ItemIndex);
}
//---------------------------------------------------------------------------

#pragma argsused
void __fastcall TfrmAccountManagment::clbUserRightsClickCheck(
      TObject *Sender)
{
     TUSER_ACCAUNT_RECORD & uar = Accounts[ cbxUserList->ItemIndex ];
     switch (clbUserRights->ItemIndex)
     {
          // Îïóñòîøåíèå ÁÄ
          case 0:
               uar.CanClear = clbUserRights->Checked[ clbUserRights->ItemIndex ];
          break;

          // Ýêìïîðò ÁÄ
          case 1:
               uar.CanExport = clbUserRights->Checked[ clbUserRights->ItemIndex ];
          break;

          // Èìïîðò ÁÄ
          case 2:
               uar.CanImport = clbUserRights->Checked[ clbUserRights->ItemIndex ];
          break;

          // Ïðîñìîòð ðåéòèíãîâ
          case 3:
               uar.CanViewRating = clbUserRights->Checked[ clbUserRights->ItemIndex ];
          break;

          // Ñîçäàíèå ïðîñòîãî òåêñòà
          case 4:
               uar.CanBuildText = clbUserRights->Checked[ clbUserRights->ItemIndex ];
          break;

          // Ñîçäàíèå ñëîæíîãî òåêñòà
          case 5:
               uar.CanBuildFullText = clbUserRights->Checked[ clbUserRights->ItemIndex ];
          break;

          default: break;
     }
}
//---------------------------------------------------------------------------

#pragma argsused
void __fastcall TfrmAccountManagment::cbxUserListChange(TObject *Sender)
{
     // Óñòàíîâêà ôëàæêîâ
     SetUserRightsControlsValues(cbxUserList->ItemIndex);
     // Óñòàíîâêà îàçðåøåíèé íà èçìåíåíèå ïðàâ ïîëüçîâàòåëåé
/*     if (Accounts[ cbxUserList->ItemIndex ].UserType != utADMIN)
     {
          rgpUserType->Enabled   = false;
          clbUserRights->Enabled = false;
          btnEditUser->Enabled   = false;
          btnAddUser->Enabled    = false;
          btnRemoveUser->Enabled = false;
     }
     else
     {
          rgpUserType->Enabled   = true;
          clbUserRights->Enabled = true;
          btnEditUser->Enabled   = true;
          btnAddUser->Enabled    = true;
          btnRemoveUser->Enabled = true;
     } */
}
//---------------------------------------------------------------------------


void __fastcall TfrmAccountManagment::SetUserRightsControlsValues(int UserIndex)
{
     clbUserRights->Checked[ 0 ] = Accounts[ UserIndex ].CanClear;
     clbUserRights->Checked[ 1 ] = Accounts[ UserIndex ].CanExport;
     clbUserRights->Checked[ 2 ] = Accounts[ UserIndex ].CanImport;
     clbUserRights->Checked[ 3 ] = Accounts[ UserIndex ].CanViewRating;
     clbUserRights->Checked[ 4 ] = Accounts[ UserIndex ].CanBuildText;
     clbUserRights->Checked[ 5 ] = Accounts[ UserIndex ].CanBuildFullText;
     if (Accounts[ UserIndex ].UserType == utADMIN)
     {
          rgpUserType->ItemIndex = 0;
     }
     else
     {
          rgpUserType->ItemIndex = 1;
     }
     clbUserRights->Enabled = rgpUserType->ItemIndex == 0;
/*     btnAddUser->Enabled = Accounts[ UserIndex ].UserType == utADMIN;
     btnRemoveUser->Enabled = Accounts[ UserIndex ].UserType == utADMIN;
     btnEditUser->Enabled = Accounts[ UserIndex ].UserType == utADMIN;*/
}
//---------------------------------------------------------------------------

#pragma argsused
void __fastcall TfrmAccountManagment::btnRemoveUserClick(TObject *Sender)
{
     if (MessageDlg("Âû óâåðåíû?", mtConfirmation,
          TMsgDlgButtons() << mbYes << mbNo, 0) == mrYes)
     {
/*          for (int i = cbxUserList->ItemIndex; i < cbxUserList->Items->Count - 1; i++)
               Accounts[ i ] = Accounts[ i + 1 ];*/
          cbxUserList->Items->Delete(cbxUserList->ItemIndex);
          Accounts.erase(&Accounts[ cbxUserList->ItemIndex ]);
     }
}
//---------------------------------------------------------------------------

#pragma argsused
void __fastcall TfrmAccountManagment::btnAddUserClick(TObject *Sender)
{
     String Name, Password;
     TfrmNameNPassWrd * dlg;
     try
     {
          dlg = new TfrmNameNPassWrd(Application);
          if (dlg->GetNameAndPassword(&Name, &Password))
          {
               /*TUSER_ACCAUNT_RECORD * tmp = new TUSER_ACCAUNT_RECORD[ cbxUserList->Items->Count + 1 ];
               memcpy(tmp, Accounts, sizeof(TUSER_ACCAUNT_RECORD) * cbxUserList->Items->Count);
               delete []Accounts;
               Accounts = tmp;*/
               TUSER_ACCAUNT_RECORD acnt;
               acnt.InitForUser();
               cbxUserList->Items->Add(Name);
               acnt.UserName = Name;
               acnt.PassWrd  = Password;
               acnt.UserType = utUSER;
               acnt.InitForUser();
               Accounts.push_back(acnt);
          }
     }
     __finally
     {
          delete dlg;
     }
}
//---------------------------------------------------------------------------

#pragma argsused
void __fastcall TfrmAccountManagment::btnEditUserClick(TObject *Sender)
{
     String Name, Password;
     TfrmNameNPassWrd * dlg;
     try
     {
          dlg = new TfrmNameNPassWrd(Application);
          // Ïîëó÷åíèå ñòàðîãî ïàðîëÿ
          if (dlg->GetNameAndPassword(&Name, &Password,
               false, true, false))
          {
               // Ïðîâåðêà ïàðîëÿ
               if (Password == Accounts[ cbxUserList->ItemIndex ].PassWrd)
               {
                    Password = NULL;
                    if (dlg->GetNameAndPassword(&Name, &Password,
                         false))
                    {
                         Accounts[ cbxUserList->ItemIndex ].PassWrd = Password;
                    }
               }
          }
     }
     __finally
     {
          delete dlg;
     }

}
//---------------------------------------------------------------------------


Используется BCB 6.0 Build 10.166
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.