47792 (588502), страница 9

Файл №588502 47792 (Обучающе-контроллирующая система для подготовки студентов) 9 страница47792 (588502) страница 92016-07-29СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 9)

If MainTree.Items[MainTree.SelectedItem].Level = 2 then

begin

docIndex:= MainTree.AddChildObject(MainTree.SelectedItem,NodeName,

pointer(DBQuest.Fields[1].AsInteger));

MainTree.Items[MainTree.SelectedItem].Expand;

end

else {if... = 3}

docIndex:= MainTree.AddObject(MainTree.SelectedItem,NodeName,

pointer(DBQuest.Fields[1].AsInteger));

MainTree.Selecteditem:= docIndex; {установление фокуса на new вопрос}

end;

procedure TTreeForm.MainTreeClick(Sender: TObject);

Var

cur_id: longint;

NewAnswer: TAnswer;

del_count,i: integer;

begin

if MainTree.Items[MainTree.SelectedItem].Level = 1 then

begin

EditForm.QuestLabel.Hide;

EditForm.DBEditTema.Hide;

EditForm.MemoQuest.Hide;

EditForm.MemoScroll.Enabled:= False;

EditForm.AddAnswerBut.Enabled:= False;

EditForm.DelAnswerBut.Enabled:= False;

Exit;

end;

cur_id:= Longint(MainTree.Items[MainTree.SelectedItem].Data);

EditForm.QuestLabel.Show;

if MainTree.Items[MainTree.SelectedItem].Level = 3 then

begin

With TreeForm.DBQuest do begin {установка фильтра на БД вопросов }

SetKey;

Fields[1].AsInteger:= cur_id;

GotoKey;

end;

EditForm.DBEditTema.Hide;

EditForm.QuestLabel.Caption:= 'Текст вопроса';

EditForm.MemoQuest.Show;

EditForm.MemoScroll.Enabled:= True;

EditForm.AddAnswerBut.Enabled:= True;

EditForm.DelAnswerBut.Enabled:= True;

i:= 0; {индекс ДЛЯ ОБЪЕКТА TMemo в списке}

EditForm.DBAnswer.First; {чтобы не было глюков при повторном щелчке на вопросе}

while NOT EditForm.DBAnswer.Eof do

begin

If (i+1) > EditForm.MemoScroll.ComponentCount then

NewAnswer:= TAnswer.Create(EditForm.MemoScroll,100); {добавление new варианта ответа в список}

TMemo(EditForm.MemoScroll.Components[i]).Text:=

EditForm.DBAnswer.Fields[2].AsString; {Otvet_name}

TCheckBox(EditForm.MemoScroll.Components[i+1]).Checked:=

EditForm.DBAnswer.Fields[3].AsBoolean; {Otvet_name}

inc(i,2); // <--- увеличение индекса ДЛЯ ОБЪЕКТА TMemo в списке

EditForm.DBAnswer.Next;

end;

While i< EditForm.MemoScroll.ComponentCount do {удаление из списка лишних вариантов ответа}

TAnswer.DeleteAnswer(EditForm.MemoScroll,EditForm.MemoScroll.ComponentCount - 2);

If EditForm.MemoScroll.ComponentCount > 0 then TMemo(EditForm.MemoScroll.Components[0]).SetFocus; {Set focus on first answer.}

end

else {if level = 2, т.е. выбрана тема}

begin

With TreeForm.DBTema do begin {установка фильтра на БД тем }

SetKey;

Fields[0].AsInteger:= cur_id;

GotoKey;

end;

EditForm.AddAnswerBut.Enabled:= False;

EditForm.DelAnswerBut.Enabled:= False;

EditForm.MemoScroll.Enabled:= False;

EditForm.MemoQuest.Hide;

EditForm.QuestLabel.Caption:= 'Название темы';

EditForm.DBEditTema.Show;

end;

end;

procedure TTreeForm.DeleteButClick(Sender: TObject);

begin

If Maintree.SelectedItem = 1 then Exit;

If MainTree.Items[MainTree.SelectedItem].Level = 3 then

begin

If Application.MessageBox('Удалить вопрос ?','Удаление вопроса',

mb_YesNo+mb_IconQuestion+MB_DEFBUTTON2) = IdYes then

begin

ClearQuestion; // логическое удаление вопроса из БД

MainTree.Delete(MainTree.SelectedItem); {удаление текущего узла дерева}

end;

end

else

If Application.MessageBox('Удалить раздел ?','Удаление раздела',

mb_YesNo+mb_IconQuestion+MB_DEFBUTTON2) = IdYes then

begin

DBQuest.IndexName:= 'tema_ind';

DBQuest.SetKey;

DBQuest.Fields[0].AsInteger:= DBTema.Fields[0].AsInteger; // Fields[0] - Tema_Id

While DBQuest.GotoKey do ClearQuestion; // логическое удаление всех вопросов, принадлежащих теме

DBQuest.IndexName:= '';

DBTema.Delete; { Удаление выбранной темы }

{ DBTema.Edit; DBTema.Fields[1].Clear; DBTema.Post; // logical delete }

MainTree.Delete(MainTree.SelectedItem); {удаление текущего узла дерева}

end;

end;

procedure TTreeForm.FullExpButClick(Sender: TObject);

begin

MainTree.FullExpand;

end;

procedure TTreeForm.FullColButClick(Sender: TObject);

begin

MainTree.FullCollapse;

end;

procedure TTreeForm.ExitButClick(Sender: TObject);

begin

TreeForm.Close;

end;

procedure TTreeForm.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Action:= caFree;

EditForm.DBAnswer.Active:= False;

DBQuest.Active:= False;

DBTema.Active:= False;

end;

procedure TTreeForm.AddTemaButClick(Sender: TObject);

var

index: Longint;

FoundEmpty: boolean;

begin

WinEditTema.ShowModal;

If WinEditTema.ModalResult = mrOk then begin

FoundEmpty:= False;

DBTema.First;

While (not DBTema.EOF) and (not FoundEmpty) do {поиск записи в DBTEMA с пустым полем Tema_name}

begin

If DBTema.Fields[1].IsNull Then FoundEmpty:= True

else DBTema.Next;

end;

If FoundEmpty then DBTema.Edit

else DBTema.Append; {добавление новой темы в БД, если не найдено пустой}

DBTema['Tema_name']:= WinEditTema.TemaEdit.Text;

DBTema.Post;

AppendQuestion(DBTema.Fields[0].AsInteger); {добавление нового вопроса в БД }

index:= MainTree.AddChildObject(1,

DBTema.Fields[1].AsString,

pointer(DBTema.Fields[0].AsInteger)); {добавление new темы}

MainTree.AddChildObject(index,'1',

pointer(DBQuest.Fields[1].AsInteger)); {добавление пустого вопроса в тему}

If not MainTree.Items[1].Expanded then

MainTree.Items[1].Expand; {раскрытие корневого узла}

MainTree.Items[index].Expand; {раскрытие узла темы}

MainTree.Selecteditem:= index; {установление фокуса на new тему}

end;

end;

procedure TTreeForm.FormShow(Sender: TObject);

Var

cur_node,i: Longint;

node_name: string;

begin

if CreateMainForm then

begin

ProcessForm.Show;

DBTema.Active:= True; {Открытие БД тем и вопросов}

DBQuest.Active:= True;

ProcessForm.ProgressBar.Max:= DBTema.RecordCount + DBQuest.RecordCount;

While not DBTema.EOF do begin {загрузка дерева из БД}

ProcessForm.ProgressBar.StepIt;

If not DBTema.Fields[1].IsNull then

begin

cur_node:= MainTree.AddChildObject(1,

DBTema.Fields[1].AsString,

pointer(DBTema.FieldByName('Tema_id').AsInteger)); {добавление темы в дерево}

i:= 1;

While not DBQuest.EOF do begin

ProcessForm.ProgressBar.StepIt;

Str(i,node_name);

MainTree.AddChildObject(cur_node,node_name,

pointer(DBQuest.Fields[1].AsInteger));{добавление вопроса в тек.тему}

DBQuest.Next; inc(i);

end;

end;

DBTema.Next;

end; {while}

DBQuest.IndexName:= ''; {отключение связи между DBTema и DBQuest}

DBQuest.MasterFields:= '';

ProcessForm.Close;

CreateMainForm:= False;

end;

EditForm.Show;

end;

procedure TTreeForm.FormResize(Sender: TObject);

begin

if TreeForm.Height >= 300 then

MainTree.Height:= TreeForm.ClientHeight - Maintree.Top - x1

else

TreeForm.Height:= 300;

IF TreeForm.Width >= 263 then

MainTree.Width:= TreeForm.ClientWidth - MainTree.Left - x2

else

TreeForm.Width:= 263;

end;

procedure TTreeForm.FormCreate(Sender: TObject);

begin

CreateMainForm:= True;

x1:= ClientHeight - MainTree.Top - MainTree.Height;

x2:= ClientWidth - MainTree.Left - Maintree.Width;

TreeForm.Height:= GetSystemMetrics(SM_CYMAXIMIZED) - 10;

end;

procedure TTreeForm.AppendQuestion(temaId: longint);

{ Добавляет в таблицу DBQuest новый вопрос.

temaId - содержит значение темы, которой принадлежит вопрос

}

begin

DBQuest.IndexName:= 'tema_ind'; {подключение вторичного индекса}

DBQuest.SetKey; {поиск записи с 0-ым значением DBQuest.Tema_id}

DBQuest.Fields[0].AsInteger:= 0;

If DBQuest.GotoKey then {если найдена запись, то редактируем ее поля}

begin

DBQuest.IndexName:= ''; {отключение вторичного индекса}

DBQuest.Edit;

end

else {если не найдена такая запись, то добавляем новую}

begin

DBQuest.IndexName:= ''; {отключение вторичного индекса}

DBQuest.Append;

end;

DBQuest['Tema_id']:= TemaId;

DBQuest.Post;

end;

procedure TTreeForm.ClearQuestion;

{осуществляет логическое удаление текущего вопроса из БД}

begin

{обнуление параметра Quest_id во всех связанных записях БД answer.db}

EditForm.DBAnswer.First;

While not EditForm.DBAnswer.Eof do EditForm.ClearAnswer;

{обнуление tema_id текущего вопроса}

DBQuest.Edit;

DBQuest.Fields[0].AsInteger:= 0; // DBQUEST.Tema_id

DBQuest.Fields[2].AsString:= ''; // DBQUEST.QUest_name

DBQuest.Post;

end;

end.

Текст модуля DB_Unit

unit db_unit;

interface

uses

SysUtils, Windows, Messages, Classes, Graphics, Controls,

StdCtrls, Forms, Mask, Buttons,

DBTables, DB, DBCtrls;

type

TEditForm = class(TForm)

MemoQuest: TDBMemo;

QuestName: TLabel;

QuestLabel: TLabel;

DBEditTema: TDBEdit;

MemoScroll: TScrollBox;

AddAnswerBut: TSpeedButton;

DelAnswerBut: TSpeedButton;

DBAnswer: TTable;

AnswerSource: TDataSource;

DBAnswerOtvet_id: TAutoIncField;

DBAnswerQuest_id: TIntegerField;

DBAnswerOtvet_name: TMemoField;

DBAnswerTrued: TBooleanField;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure DBEditTemaChange(Sender: TObject);

procedure AddAnswerButClick(Sender: TObject);

procedure DelAnswerButClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure AppendAnswer(QuestId: longint);

procedure ClearAnswer;

procedure FormResize(Sender: TObject);

procedure MemoScrollResize(Sender: TObject);

private

x1,x2: integer; {вспомогательные переменные}

public

end;

TAnswer = Class(TObject)

memo: TMemo;

check: TCheckBox;

constructor Create(AOwner:TComponent;Height_: Integer);

procedure Free;

procedure CheckClick(Sender: TObject);

procedure MemoChange(Sender: TObject);

class procedure DeleteAnswer(AOwner: TComponent;Number: integer);

private

nocreate: boolean; {TRUE - if don't run the CREATE-constructor}

end;

var

EditForm: TEditForm;

implementation

uses S2;

{$R *.DFM}

procedure TEditForm.AppendAnswer(QuestId: longint);

{ Добавляет в таблицу DBQuest новый вопрос.

temaId - содержит значение темы, которой принадлежит вопрос

}

Var

i: integer;

Isinsert: boolean;

NewAnswer: TAnswer;

begin

IsInsert:= false; {True if NOT APPEND new record into database}

DBAnswer.MasterFields:= '';

DBAnswer.SetKey; {поиск записи с 0-ым значением DBAnswer.Tema_id}

DBAnswer.Fields[1].AsInteger:= 0;

If DBAnswer.GotoKey then

begin

DBAnswer.Edit;

IsInsert:= True;

end

else DBAnswer.Append;{если не найдена запись, то добавляем новую}

DBAnswer.Fields[1].AsInteger:= QuestId;

DBAnswer.Post;

DBAnswer.MasterFields:= 'Quest_id';

NewAnswer:= TAnswer.Create(MemoScroll,100); {добавление new варианта ответа в список}

If IsInsert then

begin

DBAnswer.First; i:=0;

While i < MemoScroll.ComponentCount do

begin

DBAnswer.Edit;

DBAnswerOtvet_name.Assign(Tmemo(MemoScroll.Components[i]).Lines);

DBAnswer.Fields[3].AsBoolean:= TCheckBox(MemoScroll.Components[i+1]).Checked;

DBAnswer.Post;

DBAnswer.Next; inc(i,2);

end;

end; {endif}

end;

procedure TEditForm.ClearAnswer;

{логическое удаление из БД текущего варианта ответа для текущнго вопроса}

begin

DBAnswer.Edit;

DBAnswer['Quest_id']:= 0;

DBAnswer.Fields[2].Clear; { Otvet_name }

DBAnswer['Trued']:= False;

DBAnswer.Post;

end;

constructor TAnswer.Create(AOwner:TComponent;Height_: Integer);

begin

NoCreate:= False;

memo:= TMemo.Create(Aowner);

memo.Parent:= TWinControl(AOwner);

With memo do begin

If ComponentIndex = 0 then

begin

Left:= 0; Top:= 0;

end

else

begin

Left:= 0;

Top:= TMemo(AOwner.Components[ComponentIndex-2]).Top +

TMemo(AOwner.Components[ComponentIndex-2]).Height;

end;

Width:= TScrollBox(AOwner).Width - 60;

Height:= Height_;

If (ComponentIndex div 2 + 1)*Height > TScrollBox(AOwner).VertScrollBar.Range

then TScrollBox(AOwner).VertScrollBar.Range:= (ComponentIndex div 2 + 1)*Height;

OnChange:= MemoChange;

SetFocus;

end; {end Init Memo}

check:= TCheckBox.Create(AOwner);

check.Parent:= TWinControl(AOwner);

With check do begin

Left:= Memo.Left + Memo.Width + 15;

Top:= Memo.Top + Memo.Height div 2;

Height:= 17;

Характеристики

Тип файла
Документ
Размер
11,28 Mb
Учебное заведение
Неизвестно

Список файлов ВКР

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7021
Авторов
на СтудИзбе
260
Средний доход
с одного платного файла
Обучение Подробнее