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

📄 mainform.pas

📁 《Delphi COM深入编程》原书光盘
💻 PAS
字号:
unit MainForm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, ComObj, ActiveX, Menus, ExtCtrls, OleServer, PartSrv_TLB, StdCtrls;

type
  TfrmMain = class(TForm)
    pnlClient: TPanel;
    StringGrid1: TStringGrid;
    pnlBottom: TPanel;
    PartServer1: TPartServer;
    ecServer: TEdit;
    btnConnect: TButton;
    Label1: TLabel;
    MainMenu1: TMainMenu;
    File1: TMenuItem;
    Edit1: TMenuItem;
    Exit1: TMenuItem;
    UsrPart1: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure UsePart1Click(Sender: TObject);
    procedure PartServer1Add(Sender: TObject; varFields,
      varValues: OleVariant);
    procedure PartServer1Delete(Sender: TObject;
      var PartNumber: OleVariant);
    procedure PartServer1Modify(Sender: TObject;
      var PartNumber: OleVariant; varFields, varValues: OleVariant);
    procedure btnConnectClick(Sender: TObject);
  private
    { Private declarations }
    FFields: OleVariant;
    procedure LoadPartGrid;
    procedure LoadRow(Row: Integer; varFields, varValues: OleVariant);
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.DFM}

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  FFields := VarArrayCreate([0, 3], varInteger);
  FFields[0] := fnPartNumber;
  FFields[1] := fnDescription;
  FFields[2] := fnUnitPrice;
  FFields[3] := fnOnHand;
end;

procedure TfrmMain.btnConnectClick(Sender: TObject);
begin
  // If no server was entered, we'll use the local machine
  if ecServer.Text <> '' then
    PartServer1.RemoteMachineName := ecServer.Text;

  PartServer1.Connect;

  // Load all parts from the database server
  LoadPartGrid;

  // Enable the edit menu
  Edit1.Enabled := True;
end;

procedure TfrmMain.LoadRow(Row: Integer; varFields, varValues: OleVariant);
var
  ValueIndex: Integer;
  ColIndex: Integer;
begin
  for ValueIndex := VarArrayLowBound(varValues, 1) to VarArrayHighBound(varValues, 1) do
    for ColIndex := VarArrayLowBound(FFields, 1) to VarArrayHighBound(FFields, 1) do
      if FFields[ColIndex] = varFields[ValueIndex] then
        StringGrid1.Cells[ColIndex, Row] := varValues[ValueIndex];
end;

procedure TfrmMain.LoadPartGrid;
var
  varValues: OleVariant;
  Index: Integer;
  FieldNumber: Integer;
  Row: Integer;
begin
  varValues := PartServer1.GetAll(FFields);

  StringGrid1.RowCount := VarArrayHighBound(varValues, 1) -
    VarArrayLowBound(varValues, 1) + 2;

  StringGrid1.ColCount := VarArrayHighBound(FFields, 1) -
    VarArrayLowBound(FFields, 1) + 1;

  for Index := VarArrayLowBound(FFields, 1) to VarArrayHighBound(FFields, 1) do begin
    FieldNumber := FFields[Index];
    case FieldNumber of
      fnPartNumber: StringGrid1.Cells[Index, 0] := 'Part #';
      fnDescription: StringGrid1.Cells[Index, 0] := 'Description';
      fnUnitPrice: StringGrid1.Cells[Index, 0] := 'Unit Price';
      fnOnHand: StringGrid1.Cells[Index, 0] := 'On Hand';
      fnReorder: StringGrid1.Cells[Index, 0] := 'Reorder';
    end;
  end;

  Row := 1;
  for Index := VarArrayLowBound(varValues, 1) to VarArrayHighBound(varValues, 1) do begin
    LoadRow(Row, FFields, varValues[Index]);
    Inc(Row);
  end;
end;

procedure TfrmMain.Exit1Click(Sender: TObject);
begin
  Close;
end;

procedure TfrmMain.UsePart1Click(Sender: TObject);
var
  Value: string;
  PartNumber: string;
begin
  if InputQuery('Use Part', 'How many would you like to relieve from stock?',
    Value) then begin
    PartNumber := StringGrid1.Cells[0, StringGrid1.Row];
    PartServer1.UsePart(PartNumber, StrToInt(Value));
  end;
end;

procedure TfrmMain.PartServer1Add(Sender: TObject; varFields,
  varValues: OleVariant);
begin
  // A new part was added - reload the whole grid
  LoadPartGrid;
end;

procedure TfrmMain.PartServer1Delete(Sender: TObject;
  var PartNumber: OleVariant);
begin
  // A part was deleted - reload the whole grid
  LoadPartGrid;
end;

procedure TfrmMain.PartServer1Modify(Sender: TObject;
  var PartNumber: OleVariant; varFields, varValues: OleVariant);
var
  Index: Integer;
  Found: Boolean;
begin
  Found := False;
  Index := 1;

  // If we can find the original part, just reload the row
  while (not Found) and (Index < StringGrid1.RowCount) do begin
    if StringGrid1.Cells[0, Index] = PartNumber then begin
      LoadRow(Index, varFields, varValues);
      Found := True;
    end else
      Inc(Index);
  end;

  // Couldn't find the part, so reload the whole grid
  if not Found then
    LoadPartGrid;
end;

end.

⌨️ 快捷键说明

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