Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

PQuestion(QuestionList[QuestionTreeView.Selected.Index]).Name



Здесь я использую контейнер QuestionList. В квадратных скобках у него я указываю индекс элемента из контейнера, который мне нужен. Здесь я указываю индекс выделенного в дереве элемента QuestionTreeView.Selected.Index.

По нажатию кнопки «Удалить» ты должен написать следующий код:

procedure TQuestionResultForm.DeleteButtonClick(Sender: TObject); var index, i:Integer; begin if QuestionTreeView.Selected=nil then exit;

// Подтверждение удаления if Application.MessageBox(PChar('Вы действительно хотите удалить - '+ QuestionTreeView.Selected.Text), 'Внимание!!!', MB_OKCANCEL+MB_ICONINFORMATION)<>idOk then Exit;


// Сохраняю индекс выделенного элемента
index:=QuestionTreeView.Selected.Index;

// Удаляю выделенный элемент из дерева QuestionTreeView.Items.Delete(QuestionTreeView.Selected);

// Удаляю из контейнера QuestionList.Delete(Index); end;

На компакт диске, в директории \Примеры\Глава 25\Test2\Редактор ты можешь увидет ь исходни к уж е написанног о примера.


25.4. Сохранение и загрузка теста.

воя программа уже умеет создавать тесты, пора бы её научить и сохранять их и тем более загружать потом созданные проекты для редактирования. Я вынес кнопки открытия и сохранения проекта из дочернего окна в основное. Если

честно, то сохранение легче сделать внутри дочернего окна, а открытие в главном. Но я не пошёл простым путём, потому что хочу тебе показать, как работать с дочерними окнами. Итак, по нажатию кнопки «Сохранить» проект пишем следующий код:

procedure TTestEditorForm.SaveButtonClick(Sender: TObject);

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

SaveTest1; end;

Свойство ActiveMDIChild всегда указывает на активное в данный момент дочернее окно. Прежде чем использовать это свойство, его желательно сравнивать со значением nil, потому что в данный момент может вообще не быть ни одного дочернего окна. В этом случае, при обращении к свойству может произойти критическая ошибка.

Процедура SaveTest1 должна выглядеть следующим образом:

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;

Здесь всё очень просто и с кодом можно разобраться по комментариям. Единственное, на что я хочу обратить внимание – наша структура PQuestion находится в динамической памяти, поэтому при сохранении нужно указывать знак разыменования ^. Если этого знака не указать, то в файл сохраниться адрес структуры, а не сама структура. В этом случае при чтении данных из файла мы прочитаем адрес, но по этому адресу ничего хорошего не будет, потому что после первой же перезагрузки программы память очиститься и сама структура уничтожиться. Поэтому, для сохранения данных по адресу, а не самого адресу нужно указывать знак ^.

Обработчик события для пункта меню «Сохранить как…» ещё проще:





Дата публикования: 2014-11-04; Прочитано: 466 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...