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

📄 u_globalproc.pas

📁 一个简单的学籍管理软件
💻 PAS
📖 第 1 页 / 共 3 页
字号:

            aColumn.CanEdit := False;
            aColumn.Alignment := taCenter;
            with CQuery do
            try
              ParamByName('p_tablename').AsString := UpperCase(TableName);
              ParamByName('p_fieldname').AsString := UpperCase(aField.FieldName);
              Prepare;
              Open;
              while not Eof do
              begin
                aColumn.PickList.AddObject(FieldByName('FieldValue').AsString,
                  Pointer(FieldByName('FieldCode').AsInteger));
                Next;
              end;
            finally
              Close;
            end;
          end;
        end;
        Next;
      end;
    finally
      Close;
    end;
  end;
begin
  OldDS := MGrid.DataSource;
  MGrid.DataSource := nil;
  try
    aDataSet := OldDS.DataSet;
    aDataSet.DisableControls;
    //  字典表
    DQuery := TQuery.Create(Application);
    CQuery := TQuery.Create(Application);
    //  字段
    DQuery.DatabaseName := SysDBase;
    CQuery.DatabaseName := SysDBase;

    //  字段字典
    DQuery.SQL.Text := 'SELECT * FROM dict2 WHERE TableName = ''' +
      UpperCase(TableName) + ''' AND IsFixed = :p_IsFixed' +
      ' ORDER BY FieldNo';
    CQuery.SQL.Text := 'SELECT * FROM dict3 WHERE TableName = :p_tablename ' +
      'AND FieldName = :p_fieldname';

    //  固定列
    with DQuery do
    begin
      ParamByName('p_IsFixed').AsBoolean := True;
      Prepare;
      Open;
    end;

    MGrid.Columns.Clear;
    MGrid.LimitedCol := FillGridColumns;

    //  普通列
    with DQuery do
    begin
      ParamByName('p_IsFixed').AsBoolean := False;
      Prepare;
      Open;
    end;

    FillGridColumns;
  finally
    DQuery.Close;
    CQuery.Close;
    DQuery.Free;
    CQuery.Free;

    MGrid.DataSource := OldDS;
    while aDataSet.ControlsDisabled do
      aDataset.EnableControls;
  end;
end;

procedure RefreshDataSetField(aGrid:THDBGrid;
  GetEvent: TFieldGetTextEvent; SetEvent: TFieldSetTextEvent);
var
  i: integer;
  aField: TField;
begin
  for i := 0 to aGrid.Columns.Count - 1 do
  begin
    if aGrid.Columns[i].PickList.Count > 1 then
    begin
      aField := aGrid.DataSource.DataSet.FindField(
        aGrid.Columns[i].FieldName);
      if Assigned(aField) then
      begin
        aField.OnGetText := GetEvent;
        aField.OnSetText := SetEvent;
      end;
    end;
  end;
end;

//  设置 Grid 的栏目
procedure ReSetGridColumns(MGrid: THDBGrid; TableName: string;
  GetEvent: TFieldGetTextEvent; SetEvent: TFieldSetTextEvent);
var
  aColumn: THColumn;
  aField: TField;
  aDataSet: TDataSet;
  //OldDS: TDataSource;
  DQuery, CQuery: TQuery;
  tmS: string;
  InType: integer;

  function FillGridColumns(MoveToFirst: Boolean): integer;
  begin
    Result := 0;

    with DQuery do
    try
      while not Eof do
      begin
        aColumn := MGrid.FindFirstColumn(FieldbyName('FieldName').AsString);
        if Assigned(aColumn) then
        begin
          aField := aColumn.Field;
          if MoveToFirst then
            aColumn.Index := Result;
          Inc(Result);
          with aColumn do
            Title.Caption := Trim(FieldbyName('DisplayLabel').AsString);
          tmS := FieldbyName('FieldType').AsString;
          if tmS = 'D' then
            (aField as TDateField).DisplayFormat := 'yyyy-mm-dd'
          else if tmS = 'T' then
            (aField as TDateField).DisplayFormat := 't'
          else if (tmS = 'N') then
            (aField as TNumericField).DisplayFormat := '#,##0.00'
          else if (tmS = 'S') or (tmS = 'I') then
            aField.Tag := 0;
          //  对照字段
          InType := FieldbyName('InputType').AsInteger;
          if InType = 2 then
          begin
            aField.OnGetText := GetEvent;
            aField.OnSetText := SetEvent;

            aColumn.CanEdit := False;
            aColumn.Alignment := taCenter;
            with CQuery do
            try
              ParamByName('p_tablename').AsString := UpperCase(TableName);
              ParamByName('p_fieldname').AsString := UpperCase(aField.FieldName);
              Prepare;
              Open;
              while not Eof do
              begin
                aColumn.PickList.AddObject(FieldByName('FieldValue').AsString,
                  Pointer(FieldByName('FieldCode').AsInteger));
                Next;
              end;
            finally
              Close;
            end;
          end;
        end;
        Next;
      end;
    finally
      Close;
    end;
  end;
begin
  {OldDS := MGrid.DataSource;
  MGrid.DataSource := nil;
  aDataSet := OldDS.DataSet;}
  aDataSet := MGrid.DataSource.DataSet;
  aDataSet.DisableControls;
  try
    //  字典表
    DQuery := TQuery.Create(Application);
    CQuery := TQuery.Create(Application);
    //  字段
    DQuery.DatabaseName := SysDBase;
    CQuery.DatabaseName := SysDBase;

    //  字段字典
    DQuery.SQL.Text := 'SELECT * FROM dict2 WHERE TableName = ''' +
      UpperCase(TableName) + ''' AND IsFixed = :p_IsFixed' +
      ' ORDER BY FieldNo';
    CQuery.SQL.Text := 'SELECT * FROM dict3 WHERE TableName = :p_tablename ' +
      'AND FieldName = :p_fieldname';

    //  固定列
    with DQuery do
    begin
      ParamByName('p_IsFixed').AsBoolean := True;
      Prepare;
      Open;
    end;

    MGrid.LimitedCol := FillGridColumns(True);

    //  普通列
    with DQuery do
    begin
      ParamByName('p_IsFixed').AsBoolean := False;
      Prepare;
      Open;
    end;

    FillGridColumns(False);
  finally
    DQuery.Close;
    CQuery.Close;
    DQuery.Free;
    CQuery.Free;

    //MGrid.DataSource := OldDS;
    while aDataSet.ControlsDisabled do
      aDataset.EnableControls;
  end;
end;

function GridDblClick(Sender: TObject): boolean;
var
  aColumn: THColumn;
  aGrid: THDBGrid;
  aDataSet: TDataSet;
  tmI: integer;
begin
  Result := False;
  aGrid := Sender as THDBGrid;
  aDataSet := aGrid.DataSource.DataSet;
  if aDataSet.IsEmpty then
    Exit;
  aColumn := aGrid.Columns[aGrid.Col - aGrid.IndicatorOffset];
  if aColumn.PickList.Count > 0 then
  begin
    if not (aDataSet.State in [dsEdit, dsInsert]) then
      aDataSet.Edit;
    tmI := aDataSet.FieldByName(aColumn.FieldName).AsInteger;
    tmI := aColumn.PickList.IndexOfObject(Pointer(tmI));
    Inc(tmI);
    if tmI >= aColumn.Picklist.Count then
      tmI := 0;
    aDataSet.FieldByName(aColumn.FieldName).AsInteger :=
      Integer(aColumn.PickList.Objects[tmI]);
    Result := True;
  end;
end;

//  Grid 键盘输入
function GridKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState): Boolean;
begin
  Result := False;
  if (Key = VK_SPACE) and (Shift = []) then
  begin
    if GridDblClick(Sender) then
    begin
      Key := 0;
      Result := True;
    end;
  end;
end;

procedure DataSetSetText(aGrid: THDBGrid; aField: TField; const Text: string);
var
  aList: TStrings;
  i: integer;
begin
  aList := nil;
  for i := 0 to aGrid.Columns.Count - 1 do
  begin
    if aGrid.Columns[i].FieldName = aField.FieldName then
    begin
      aList := aGrid.Columns[i].PickList;
      Break;
    end;
  end;
  if Assigned(aList) then
  begin
    for i := 0 to aList.Count - 1 do
      if aField.DataType in [ftSmallint, ftInteger, ftWord, ftBoolean] then
      begin
        if Text = aList.Strings[i] then
        begin
          aField.AsInteger := Integer(aList.Objects[i]);
          break;
        end;
      end
      else if aField.DataType = ftString then
      begin
        if Text = aList.Strings[i] then
        begin
          aField.AsString := IntFormatStr(Integer(aList.Objects[i]), aField.Size);
          break;
        end;
      end;

  end;
end;

procedure DataSetGetText(aGrid: THDBGrid; aField: TField; var Text: string; DisplayText: Boolean);
var
  aList: TStrings;
  i: integer;
begin
  aList := nil;
  for i := 0 to aGrid.Columns.Count - 1 do
  begin
    if aGrid.Columns[i].FieldName = aField.FieldName then
    begin
      aList := aGrid.Columns[i].PickList;
      Break;
    end;
  end;
  if Assigned(aList) then
  begin
    for i := 0 to aList.Count - 1 do
    begin
      if aField.DataType in [ftSmallint, ftInteger, ftWord, ftBoolean] then
      begin
        if aField.AsInteger = Integer(aList.Objects[i]) then
        begin
          Text := aList.Strings[i];
          break;
        end;
      end
      else if aField.DataType = ftString then
      begin
        if Trim(aField.AsString) = '' then
          Continue;
        if aField.AsInteger = Integer(aList.Objects[i]) then
        begin
          Text := aList.Strings[i];
          break;
        end;
      end;
    end;
  end;
end;

procedure SetUserPower(UserCode: string);
  procedure SetMenusPower(aMenu: TMenuItem; aQuery: TQuery);
  var
    i: integer;
    tmS: string;
  begin
    tmS := aMenu.Name;
    if aQuery.Locate('s_cddm', tmS, []) then
    begin
      if aQuery.FieldByName('b_zdqx').AsString = '1' then
        aMenu.Enabled := True
      else
        aMenu.Enabled := False;
    end;
    for i := 0 to aMenu.Count - 1 do
      SetMenusPower(aMenu.Items[i], aQuery);
  end;
var
  aQuery: TQuery;
  i: integer;
begin
  aQuery := TQuery.Create(Application);
  with aQuery do
  try
    DatabaseName := SysDBase;
    SQL.Text := 'SELECT s_cddm, b_zdqx FROM czryqx WHERE s_rydm = ''' + S_UserCode + '''';
    Open;
    for i := 0 to MainMenu.Items.Count - 1 do
      SetMenusPower(MainMenu.Items[i], aQuery);
  finally
    Close;
    Free;
  end;
end;

procedure GetCurExamCode;
var
  i: integer;
begin
  with TIniFile.Create(S_SysPath + '\' + StudentIniFile) do
  try
    for i := 1 to SI_GradeCount do
      I_CurExamCode[i] := ReadInteger('当前考试', GradeNames[i - 1] + '年级', 0);
  finally
    Free;
  end;
  with TQuery.Create(Application) do
  begin
    DataBaseName := DataDBase;
    SQL.Text := 'SELECT * FROM kssz WHERE s_xqhao=''' + S_CurTermCode + '''';
    Open;
    for i := 1 to SI_GradeCount do
      if Locate('i_kshao', I_CurExamCode[i], []) then
        S_CurExamName[i] := FieldByName('s_kssming').AsString;
  end;
end;

end.

⌨️ 快捷键说明

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