unit MainUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ComCtrls, ToolWin, ImgList, ExtCtrls;

type
  TTestEditorForm = class(TForm)
    ImageList1: TImageList;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    SaveAsMenu: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    N13: TMenuItem;
    N14: TMenuItem;
    N15: TMenuItem;
    ControlBar1: TControlBar;
    ToolBar1: TToolBar;
    NewButton: TToolButton;
    OpenButton: TToolButton;
    SaveButton: TToolButton;
    PrintButton: TToolButton;
    ToolButton9: TToolButton;
    OptionsButton: TToolButton;
    ToolButton10: TToolButton;
    HelpButton: TToolButton;
    AboutButton: TToolButton;
    ToolButton11: TToolButton;
    ExitButton: TToolButton;
    StatusBar: TStatusBar;
    SaveDialog1: TSaveDialog;
    OpenDialog1: TOpenDialog;
    procedure AboutButtonClick(Sender: TObject);
    procedure ExitButtonClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure NewButtonClick(Sender: TObject);
    procedure SaveButtonClick(Sender: TObject);
    procedure SaveAsMenuClick(Sender: TObject);
    procedure OpenButtonClick(Sender: TObject);
  private
    { Private declarations }
    procedure ShowHint(Sender: TObject);
    procedure SaveTest1;
  public
    { Public declarations }
  end;

var
  TestEditorForm: TTestEditorForm;

implementation

uses AboutUnit, NewTestWizardUnit, QuestionResultUnit;

{$R *.dfm}

procedure TTestEditorForm.AboutButtonClick(Sender: TObject);
begin
 AboutForm.ShowModal;
end;

procedure TTestEditorForm.ExitButtonClick(Sender: TObject);
begin
 Close;
end;

procedure TTestEditorForm.ShowHint(Sender: TObject);
begin
 StatusBar.Panels.Items[0].Text := Application.Hint;
end;

procedure TTestEditorForm.FormShow(Sender: TObject);
begin
 Application.OnHint := ShowHint;
end;

procedure TTestEditorForm.NewButtonClick(Sender: TObject);
begin
 NewTestForm.ShowModal;
 if NewTestForm.ModalResult<>mrOK then exit;

 if NewTestForm.TestTypeBox.ItemIndex=0 then
  begin
   QuestionResultForm:=TQuestionResultForm.Create(Owner);
   QuestionResultForm.ProjectName:=NewTestForm.TestNameEdit.Text;
   QuestionResultForm.Caption:=QuestionResultForm.Caption+' : '+QuestionResultForm.ProjectName;
  end;
end;

procedure TTestEditorForm.SaveButtonClick(Sender: TObject);
begin
 //(нет активных окон), то выход
 if ActiveMDIChild=nil then exit;
 //Если окно имеет имя QuestionResultForm, то это
 //вопрос-варианты ответов и вызываем для сохранения
 //процедуру SaveTest1.
 if ActiveMDIChild.Name='QuestionResultForm' then
  SaveTest1;
end;

procedure TTestEditorForm.SaveTest1;
var
 fs:TFileStream;
 i:Integer;
 Str:String[5];
begin
 //Если у активного окна в свойстве FileName пусто,
 //то нет имени файла и нужно вызвать обработчик события
 //меню "Сохранить как...", чтобы появилось окно ввода
 //имени файла
 if TQuestionResultForm(ActiveMDIChild).FileName='' then
  begin
   SaveAsMenuClick(nil);
   exit;
  end;

 //Создаю новый файл. Если он уже существовал, то его
 //содержимое будет уничтожено
 fs:=TFileStream.Create(TQuestionResultForm(ActiveMDIChild).FileName, fmCreate);

 //Сохраняю в начале файла текст "Тест", чтобы по нему потом
 //определить к чему относиться данный файл.
 Str:='Тест';
 fs.Write(Str, SizeOf(Str));

 //Сохранить имя проекта
 fs.Write(TQuestionResultForm(ActiveMDIChild).ProjectName, sizeof(TQuestionResultForm(ActiveMDIChild).ProjectName));
 try
  //Сохранить количество вопросов
  fs.Write(TQuestionResultForm(ActiveMDIChild).QuestionList.Count, sizeof(TQuestionResultForm(ActiveMDIChild).QuestionList.Count));

  //Запускаю цикл, в котором сохраняються все вопросы.
  for i:=0 to TQuestionResultForm(ActiveMDIChild).QuestionList.Count-1 do
   fs.Write(PQuestion(TQuestionResultForm(ActiveMDIChild).QuestionList[i])^, sizeof(TQuestion));
 finally
  //Закрыть файл
  fs.Free;
 end;
end;

procedure TTestEditorForm.SaveAsMenuClick(Sender: TObject);
begin
 if SaveDialog1.Execute then
  begin
   TQuestionResultForm(ActiveMDIChild).FileName:=SaveDialog1.FileName;
   SaveButtonClick(nil);
  end; 
end;

procedure TTestEditorForm.OpenButtonClick(Sender: TObject);
var
 fs:TFileStream;
 i, Count:Integer;
 Str:String[5];
 NewQuest:PQuestion;
begin
 //Показать окно открытия файла
 if not OpenDialog1.Execute then exit;

 //Открыть файл для чтения
 fs:=TFileStream.Create(OpenDialog1.FileName, fmOpenRead);

 //Перейти в начало файла и прочитать заголовок
 fs.Seek(0,soFromBeginning);
 fs.read(Str, SizeOf(Str));

 //Если заголовок равен тексу "Тест", значит это "вопрос-
 //варианты ответов".
 if Str='Тест' then
  begin
   //Создать новое окно теста
   QuestionResultForm:=TQuestionResultForm.Create(Owner);

   //Сохранить имя открытого файла в объекте окна
   QuestionResultForm.FileName:=OpenDialog1.Filename;

   //Прочитать имя проекта
   fs.Read(QuestionResultForm.ProjectName, sizeof(QuestionResultForm.ProjectName));

   try
    //Прочитать количество вопросов
    fs.Read(Count, sizeof(Count));

    //Запустить цикл чтения вопросов
    for i:=0 to Count-1 do
     begin
      //Создаю новую структуру в памяти для вопроса
      NewQuest:=New(PQuestion);
      //Читаю структуру
      fs.Read(NewQuest^, sizeof(TQuestion));

      //Добавляю структуру в контейнер
      QuestionResultForm.QuestionList.Add(NewQuest);

      //Создаю новый элемент в дереве
      with QuestionResultForm.QuestionTreeView.Items.Add(nil, NewQuest.Name) do
       begin
        ImageIndex:=0;
        Data:=NewQuest;
       end;
     end;
   finally
    //Закрываю файл
    fs.Free;
   end;
  end;
end;

end.
