⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 u_sjgl.~pas

📁 试卷管理系统
💻 ~PAS
字号:
unit U_sjgl;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, DB, DBTables, Grids, DBGrids, OleCtnrs;

type
  Tfrm_sjgl = class(TForm)
    GroupBox1: TGroupBox;
    TreeView1: TTreeView;
    DBGrid1: TDBGrid;
    tbl_sjk: TTable;
    DataSource1: TDataSource;
    tbl_khdx: TTable;
    tbl_gwzl: TTable;
    tbl_gwlb: TTable;
    tbl_zy: TTable;
    OleContainer1: TOleContainer;
    btn_delete: TButton;
    btn_ksj: TButton;
    btn_close: TButton;
    btn_daj: TButton;
    Query1: TQuery;
    OleContainer2: TOleContainer;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
    procedure btn_ksjClick(Sender: TObject);
    procedure btn_dajClick(Sender: TObject);
    procedure btn_deleteClick(Sender: TObject);
    procedure btn_closeClick(Sender: TObject);
  private
    { Private declarations }
    ptrlist:TList;
    sjdaj:integer;
    procedure WordQuit(Sender: TObject);
    procedure DocClose(Sender: TObject);
  public
    { Public declarations }
  end;

var
  frm_sjgl: Tfrm_sjgl;

implementation
uses P_RES,AutoImpl,Word2000;
type
PMyRec = ^TMyRec;
TMyRec = record
  flag:boolean;
  zyxh:integer;
  gwlbxh:integer;
  gwzlxh:integer;
  khdxxh:integer;

end;

var
  MyRecPtr: PMyRec;
  WordObject:TWordObject;
  wdoc1:OleVariant;
{$R *.dfm}

procedure Tfrm_sjgl.FormCreate(Sender: TObject);
var
  MyTreeNode1,MyTreeNode2,MyTreeNode3: TTreeNode;
begin
  tbl_sjk.Open;
  ptrlist:=TList.Create;
  tbl_zy.First;
  while not tbl_zy.Eof do
  begin
    New(MyRecPtr);
    ptrlist.Add(MyRecPtr);

    MyRecPtr^.flag:=false;
    MyRecPtr^.zyxh:=tbl_zy.FieldByName('zyxh').AsInteger;
    MyRecPtr^.gwlbxh:=0;
    MyRecPtr^.gwzlxh:=0;
    MyRecPtr^.khdxxh:=0;

    MyTreeNode1:=TreeView1.Items.AddObject(nil,tbl_zy.FieldByName('zymc').AsString,MyRecPtr);
    tbl_gwlb.Filter:='zyxh='+inttostr(tbl_zy.FieldByName('zyxh').AsInteger);
    tbl_gwlb.First;
    if tbl_gwlb.RecordCount<>0 then //区分岗位类别
    begin
      while not tbl_gwlb.Eof do //添加岗位类别
      begin
        New(MyRecPtr);
        ptrlist.Add(MyRecPtr);

        MyRecPtr^.flag:=false;
        MyRecPtr^.zyxh:=tbl_zy.FieldByName('zyxh').AsInteger;
        MyRecPtr^.gwlbxh:=tbl_gwlb.FieldByName('gwlbxh').AsInteger;
        MyRecPtr^.gwzlxh:=0;
        MyRecPtr^.khdxxh:=0;

        MyTreeNode2:=TreeView1.Items.AddChildObject(MyTreeNode1,tbl_gwlb.FieldByName('gwlbmc').AsString,MyRecPtr);
        tbl_gwzl.Filter:='check=true and zyxh='+inttostr(tbl_zy.FieldByName('zyxh').AsInteger)+' and gwlbxh='+inttostr(tbl_gwlb.FieldByName('gwlbxh').AsInteger);
        tbl_gwzl.First;
        while not tbl_gwzl.Eof do
        begin
          tbl_khdx.Filter:='zyxh='+inttostr(tbl_zy.FieldByName('zyxh').AsInteger)+' and gwlbxh='+inttostr(tbl_gwlb.FieldByName('gwlbxh').AsInteger)+' and gwzlxh='+inttostr(tbl_gwzl.FieldByName('gwzlxh').AsInteger);
          tbl_khdx.First;
          if tbl_gwzl.FieldByName('gwjblxxh').AsInteger=0 then //不区分级别,则直接添加岗位种类名称作为考核对象
          begin
            New(MyRecPtr);
            ptrlist.Add(MyRecPtr);

            MyRecPtr^.flag:=true;
            MyRecPtr^.zyxh:=tbl_zy.FieldByName('zyxh').AsInteger;
            MyRecPtr^.gwlbxh:=tbl_gwlb.FieldByName('gwlbxh').AsInteger;
            MyRecPtr^.gwzlxh:=tbl_gwzl.FieldByName('gwzlxh').AsInteger;
            MyRecPtr^.khdxxh:=1;

            TreeView1.Items.AddChildObject(MyTreeNode2,tbl_gwzl.FieldByName('gwzlmc').AsString,MyRecPtr);
          end
          else//区分级别,则分别添加岗位种类相应级别的考核对象
          begin
            New(MyRecPtr);
            ptrlist.Add(MyRecPtr);

            MyRecPtr^.flag:=false;
            MyRecPtr^.zyxh:=tbl_zy.FieldByName('zyxh').AsInteger;
            MyRecPtr^.gwlbxh:=tbl_gwlb.FieldByName('gwlbxh').AsInteger;
            MyRecPtr^.gwzlxh:=tbl_gwzl.FieldByName('gwzlxh').AsInteger;
            MyRecPtr^.khdxxh:=0;

            MyTreeNode3:=TreeView1.Items.AddChildObject(MyTreeNode2,tbl_gwzl.FieldByName('gwzlmc').AsString,MyRecPtr);
            while not tbl_khdx.Eof do
              begin
                New(MyRecPtr);
                ptrlist.Add(MyRecPtr);

                MyRecPtr^.flag:=true;
                MyRecPtr^.zyxh:=tbl_zy.FieldByName('zyxh').AsInteger;
                MyRecPtr^.gwlbxh:=tbl_gwlb.FieldByName('gwlbxh').AsInteger;
                MyRecPtr^.gwzlxh:=tbl_gwzl.FieldByName('gwzlxh').AsInteger;
                MyRecPtr^.khdxxh:=tbl_khdx.FieldByName('khdxxh').AsInteger;

                TreeView1.Items.AddChildObject(MyTreeNode3,tbl_khdx.FieldByName('khdxmc').AsString,MyRecPtr);
                tbl_khdx.Next;
              end;
            end;
          tbl_gwzl.Next;
        end;
        tbl_gwlb.Next;
      end;
    end
    else//不区分岗位类别
    begin
      tbl_gwzl.Filter:='check=true and zyxh='+inttostr(tbl_zy.FieldByName('zyxh').AsInteger);
      tbl_gwzl.First;
      while not tbl_gwzl.Eof do
      begin
        tbl_khdx.Filter:='zyxh='+inttostr(tbl_zy.FieldByName('zyxh').AsInteger)+' and gwzlxh='+inttostr(tbl_gwzl.FieldByName('gwzlxh').AsInteger);
        tbl_khdx.First;
        if tbl_gwzl.FieldByName('gwjblxxh').AsInteger=0 then //不区分级别,则直接添加岗位种类名称作为考核对象
          begin
            New(MyRecPtr);
            ptrlist.Add(MyRecPtr);

            MyRecPtr^.flag:=true;
            MyRecPtr^.zyxh:=tbl_zy.FieldByName('zyxh').AsInteger;
            MyRecPtr^.gwlbxh:=0;
            MyRecPtr^.gwzlxh:=tbl_gwzl.FieldByName('gwzlxh').AsInteger;
            MyRecPtr^.khdxxh:=1;

            TreeView1.Items.AddChildObject(MyTreeNode1,tbl_gwzl.FieldByName('gwzlmc').AsString,MyRecPtr);
          end
          else//区分级别,则分别添加岗位种类相应级别的考核对象
          begin
            New(MyRecPtr);
            ptrlist.Add(MyRecPtr);

            MyRecPtr^.flag:=false;
            MyRecPtr^.zyxh:=tbl_zy.FieldByName('zyxh').AsInteger;
            MyRecPtr^.gwlbxh:=0;
            MyRecPtr^.gwzlxh:=tbl_gwzl.FieldByName('gwzlxh').AsInteger;
            MyRecPtr^.khdxxh:=0;

            MyTreeNode2:=TreeView1.Items.AddChildObject(MyTreeNode1,tbl_gwzl.FieldByName('gwzlmc').AsString,MyRecPtr);
            while not tbl_khdx.Eof do
              begin
                New(MyRecPtr);
                ptrlist.Add(MyRecPtr);

                MyRecPtr^.flag:=true;
                MyRecPtr^.zyxh:=tbl_zy.FieldByName('zyxh').AsInteger;
                MyRecPtr^.gwlbxh:=0;
                MyRecPtr^.gwzlxh:=tbl_gwzl.FieldByName('gwzlxh').AsInteger;
                MyRecPtr^.khdxxh:=tbl_khdx.FieldByName('khdxxh').AsInteger;

                TreeView1.Items.AddChildObject(MyTreeNode2,tbl_khdx.FieldByName('khdxmc').AsString,MyRecPtr);
                tbl_khdx.Next;
              end;
            end;
        tbl_gwzl.Next;
      end;
    end;
    tbl_zy.Next;
  end;
end;

procedure Tfrm_sjgl.FormClose(Sender: TObject; var Action: TCloseAction);
var
  i:integer;
begin
  if Assigned(WordObject) then begin
    WordObject.Free;
    WordObject := nil;
  end;

  tbl_zy.Close;
  tbl_gwlb.Close;
  tbl_gwzl.Close;
  tbl_khdx.Close;
  tbl_sjk.Close;
  for i:=0 to ptrlist.Count-1 do
  begin
    dispose(ptrlist.Items[i]);
  end;
  ptrlist.Free;
end;

procedure Tfrm_sjgl.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
  tbl_sjk.Filter:='zyxh=-999';

  if treeview1.Selected.HasChildren then exit;
  if treeview1.Selected.IsFirstNode then exit;

  tbl_sjk.Filter:='zyxh='+inttostr(PMyRec(TreeView1.Selected.Data)^.zyxh)
                   +' and gwlbxh='+inttostr(PMyRec(TreeView1.Selected.Data)^.gwlbxh)
                   +' and gwzlxh='+inttostr(PMyRec(TreeView1.Selected.Data)^.gwzlxh)
                   +' and khdxxh='+inttostr(PMyRec(TreeView1.Selected.Data)^.khdxxh);
end;

procedure Tfrm_sjgl.btn_ksjClick(Sender: TObject);
var
  blobstream:Tblobstream;
  v1,v2,v3:OleVariant;
begin
  if tbl_sjk.RecordCount=0 then exit;

  if not Assigned(WordObject) then
  begin
    WordObject := TWordObject.Create;
    with WordObject do begin
      OnSaveDocument:=DocClose;
      OnQuit := WordQuit;
    end;
  end;

  WordObject.Visible:=true;

  v1:=WdDoNotSaveChanges;
  v2:=Unassigned;
  v3:=Unassigned;
  if WordObject.Application.Documents.Count>0 then
  begin
    WordObject.Application.Documents.Close(v1,v2,v3);
  end;

  blobStream := TBlobStream.Create(TBlobField(tbl_sjk.FieldByName('sjnr')), bmRead);
  blobstream.position:=0;
  olecontainer1.DestroyObject;
  olecontainer1.loadfromstream(blobstream);
  BlobStream.Free;
  olecontainer1.SaveAsDocument(Pb_runpath+'\temp\考试卷.doc');

  try
    wdoc1:=WordObject.OpenDoc(Pb_runpath+'\temp\考试卷.doc');
  except
    if Assigned(WordObject) then
    begin
      WordObject.Free;
      WordObject := nil;
    end;
    exit;
  end;

  sjdaj:=1;

  WordObject.Application.ActiveWindow.ActivePane.View.type_ := 3;
  SetWindowPos(Handle,HWND_BOTTOM,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE);
  WordObject.Application.Activate;
end;

procedure Tfrm_sjgl.btn_dajClick(Sender: TObject);
var
  blobstream:Tblobstream;
  v1,v2,v3:OleVariant;
begin
  if tbl_sjk.RecordCount=0 then exit;

  if not Assigned(WordObject) then
  begin
    WordObject := TWordObject.Create;
    with WordObject do begin
      OnSaveDocument:=DocClose;
      OnQuit := WordQuit;
    end;
  end;

  WordObject.Visible:=true;

  v1:=WdDoNotSaveChanges;
  v2:=Unassigned;
  v3:=Unassigned;
  if WordObject.Application.Documents.Count>0 then
  begin
    WordObject.Application.Documents.Close(v1,v2,v3);
  end;

  blobStream := TBlobStream.Create(TBlobField(tbl_sjk.FieldByName('sjda')), bmRead);
  blobstream.position:=0;
  olecontainer1.DestroyObject;
  olecontainer1.loadfromstream(blobstream);
  BlobStream.Free;
  olecontainer1.SaveAsDocument(Pb_runpath+'\temp\答案卷.doc');
  try
    wdoc1:=WordObject.OpenDoc(Pb_runpath+'\temp\答案卷.doc');
  except
    if Assigned(WordObject) then
    begin
      WordObject.Free;
      WordObject := nil;
    end;
    exit;
  end;
  sjdaj:=2;
  WordObject.Application.ActiveWindow.ActivePane.View.type_ := 3;
  SetWindowPos(Handle,HWND_BOTTOM,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE);
  WordObject.Application.Activate;
end;

procedure Tfrm_sjgl.btn_deleteClick(Sender: TObject);
begin
  if tbl_sjk.RecordCount=0 then exit;

  if MessageBox(Handle,'确实要删除此试卷吗?','试卷管理',MB_YESNO+MB_ICONQUESTION)=IDYES  then
  begin
    tbl_sjk.Delete;
  end;
end;

procedure Tfrm_sjgl.btn_closeClick(Sender: TObject);
begin
  close;
end;

procedure Tfrm_sjgl.WordQuit(Sender: TObject);
begin
  WordObject.Free;
  WordObject := nil;
end;

procedure Tfrm_sjgl.DocClose(Sender: TObject);
var
  olestream:TStringstream;
begin
  wdoc1.Save;
  tbl_sjk.Edit;
  if sjdaj=1 then
  begin
    olecontainer1.CreateObjectFromFile(Pb_runpath+'\temp\考试卷.doc',true);
    olestream:=Tstringstream.Create('');
    olecontainer1.savetostream(olestream);
    olestream.position:=0;
    tbl_sjk.FieldByName('sjnr').AsString:=olestream.DataString;
  end
  else
  begin
    olecontainer1.CreateObjectFromFile(Pb_runpath+'\temp\答案卷.doc',true);
    olestream:=Tstringstream.Create('');
    olecontainer1.savetostream(olestream);
    olestream.position:=0;
    tbl_sjk.FieldByName('sjda').AsString:=olestream.DataString;
  end;
  tbl_sjk.Post;
  olestream.Free;

end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -