47792 (588502), страница 9
Текст из файла (страница 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;















