-2

我有德尔福代码的问题......我有代码:

主要形式

unit MainForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, CPort, Menus, ComObj, StdCtrls;

type
  TMainForm = class(TForm)
    MainMenu1: TMainMenu;
    Berkas1: TMenuItem;
    Alat1: TMenuItem;
    erminal1: TMenuItem;
    ComPort1: TComPort;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    procedure erminal1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ComPort1RxChar(Sender: TObject; Count: Integer);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

uses
  ChildForm;

{$R *.dfm}

procedure TMainForm.erminal1Click(Sender: TObject);
var
  ChildForm: TChildForm;
begin
  ChildForm := TChildForm.Create(Application);
  ChildForm.Show;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
  ComPort1.ShowSetupDialog;
end;

procedure TMainForm.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  ComPort: TComPort;
  data: string;
begin
  inherited;
  ComPort := TComPort.Create(Self);
  ComPort1.ReadStr(data, 5);
  ChildForm.Memo1.Text := ChildForm.Memo1.Text+''+data+'';
end;

end.

儿童表格:

unit ChildForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj;

type
  TChildForm = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  ChildForm: TChildForm;

implementation

uses
  MainForm;

{$R *.dfm}

procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TChildForm.Button1Click(Sender: TObject);
begin
  MainForm.ComPort1.Open;
end;

end.

我想以子形式显示从我的设备输入的数据到备忘录。我将 comport 组件放在主窗体中。但是当我运行程序时,它说:

项目 Data.exe 引发异常类 EAccessViolation,并带有消息“模块“Data.exe”中地址 00466051 的访问冲突。读取地址 000002F8'。进程停止。使用 Step 或 Run 继续。

我该如何解决这个问题?

4

1 回答 1

2

如评论中所述,您的代码存在许多问题。

为了更好地实现与 comport 组件的父/子表单交互,请执行以下操作:

创建一个TDataModule(例如:DataModule1),将 comport 组件放在那里。

现在您可以从主窗体和子窗体访问 comport 组件。

将私有方法添加到您的子表单:

procedure TChildForm.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  data: string;
begin
  DataModule1.ComPort1.ReadStr(data, 5);
  Self.Memo1.Text := Self.Memo1.Text+''+data+'';
end;

当您在子窗体中打开 comport 时,请将 comport OnRxChar 事件设置为您的 TChildForm.ComPort1RxChar 方法。

在 TChildForm.OnClose 事件中,将 comport OnRxChar 事件设置为 nil 并关闭 comport。

于 2013-01-31T16:54:54.493 回答