-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コンポーネントをメインフォームに配置します。しかし、私がプログラムを実行すると、次のように表示されます。

Project Data.exeは、モジュール'Data.exe'のアドレス00466051でメッセージ'アクセス違反を伴う例外クラスEAccessViolationを発生させました。アドレス000002F8'の読み取り。プロセスが停止しました。ステップまたは実行を使用して続行します。

どうすれば問題を解決できますか?

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を開くときは、comportOnRxCharイベントをTChildForm.ComPort1RxCharメソッドに設定します。

TChildForm.OnCloseイベントで、comport OnRxCharイベントをnilに設定し、comportを閉じます。

于 2013-01-31T16:54:54.493 に答える