Как получить доступ к DataGridView из main.pas? - PullRequest
0 голосов
/ 14 июля 2011

У меня DataGridView на другой winform, и я пытаюсь получить доступ к DataGridView из main.pas, но не могу.

Я получаю следующую ошибку: «MonoPro.UnitForm» не содержит определения «dataGridView1» в выражении «fr.dataGridView1»

Вот код:

Form1.pas с UnitForm Winform с DataGridView

namespace MonoPro.Units;

interface

uses
  System.Drawing,
  System.Collections,
  System.Windows.Forms,
  System.ComponentModel;

type
  UnitForm = partial class
  {$REGION Windows Form Designer generated fields}
  private
    var components: System.ComponentModel.Container := nil;
    dataGridView1: System.Windows.Forms.DataGridView;
    Column3: System.Windows.Forms.DataGridViewTextBoxColumn;
    Column2: System.Windows.Forms.DataGridViewTextBoxColumn;
    Column1: System.Windows.Forms.DataGridViewTextBoxColumn;
    method InitializeComponent;
  {$ENDREGION}
  end;

implementation

{$REGION Windows Form Designer generated code}
method UnitForm.InitializeComponent;
begin
  self.dataGridView1 := new System.Windows.Forms.DataGridView();
  self.Column1 := new System.Windows.Forms.DataGridViewTextBoxColumn();
  self.Column2 := new System.Windows.Forms.DataGridViewTextBoxColumn();
  self.Column3 := new System.Windows.Forms.DataGridViewTextBoxColumn();
  (self.dataGridView1 as System.ComponentModel.ISupportInitialize).BeginInit();
  self.SuspendLayout();
  // 
  // dataGridView1
  // 
  self.dataGridView1.BackgroundColor := System.Drawing.SystemColors.ControlLightLight;
  self.dataGridView1.ColumnHeadersHeightSizeMode := System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
  self.dataGridView1.Columns.AddRange(array of System.Windows.Forms.DataGridViewColumn([self.Column1,
      self.Column2,
      self.Column3]));
  self.dataGridView1.Location := new System.Drawing.Point(12, 12);
  self.dataGridView1.Name := 'dataGridView1';
  self.dataGridView1.RowHeadersVisible := false;
  self.dataGridView1.Size := new System.Drawing.Size(795, 221);
  self.dataGridView1.TabIndex := 0;
  // 
  // Column1
  // 
  self.Column1.HeaderText := 'Column1';
  self.Column1.Name := 'Column1';
  // 
  // Column2
  // 
  self.Column2.HeaderText := 'Column2';
  self.Column2.Name := 'Column2';
  // 
  // Column3
  // 
  self.Column3.HeaderText := 'Column3';
  self.Column3.Name := 'Column3';
  // 
  // UnitForm
  // 
  self.ClientSize := new System.Drawing.Size(819, 245);
  self.Controls.Add(self.dataGridView1);
  self.Name := 'UnitForm';
  self.Text := 'Form1';
  (self.dataGridView1 as System.ComponentModel.ISupportInitialize).EndInit();
  self.ResumeLayout(false);
end;
{$ENDREGION}

end.

Вот Main.pas.Я пытаюсь получить доступ к dataGridView1 из Form1.pas (UnitForm).

namespace MonoPro;

interface

uses
  System.Drawing,
  System.Collections,
  System.Collections.Generic,
  System.Windows.Forms,
  System.ComponentModel,
  System.Threading,
  System.IO.Ports,
  MonoPro.*;

type
  /// <summary>
  /// Summary description for MainForm.
  /// </summary>
  MainForm = partial class(System.Windows.Forms.Form)
  private
    method SignalBtn_Click(sender: System.Object; e: System.EventArgs);
    method CommBtn_Click(sender: System.Object; e: System.EventArgs);
    method button1_Click(sender: System.Object; e: System.EventArgs);
    method button2_Click(sender: System.Object; e: System.EventArgs);
    method button4_Click(sender: System.Object; e: System.EventArgs);
    method button5_Click(sender: System.Object; e: System.EventArgs); 
    method ShutdownBtn_Click(sender: System.Object; e: System.EventArgs);
    method MySerialData(sender: System.Object; e:SerialDataReceivedEventArgs);
  protected
    method Dispose(disposing: Boolean); override;
  public
    RX:Array[0..5] of byte;
    TX:Array[0..6] of byte;
    serialPort1:System.IO.Ports.SerialPort;
    thr:Thread;
    stoploop:Boolean;
    mcommand:Byte;
    thechannel:Integer;
    fr : UnitForm;
    constructor;
    method FillTable;
    procedure mythread;
  end;

implementation

{$REGION Construction and Disposition}

constructor MainForm;
begin
  //
  // Required for Windows Form Designer support
  //
  InitializeComponent();

  mcommand:=$AA;
  thechannel:=$01;
  stoploop:=false;
  thr:=nil;
  fr := new UnitForm;
  //
  // TODO: Add any constructor code after InitializeComponent call

  //
end;

method MainForm.Dispose(disposing: Boolean);
begin
  if disposing then begin
    //if assigned(components) then
    //  components.Dispose();

    //
    // TODO: Add custom disposition code here
    //

    SerialPort1.Close;
    stoploop:=true;
    thr.Abort;
  end;
  inherited Dispose(disposing);
end;
{$ENDREGION}

method MainForm.FillTable;
begin
    fr.dataGridView1;    //Here is my problem. With this line of code I am trying to see if the dataGridView1 belongs to fr winform.  
end;

method MainForm.MySerialData(sender: Object; e: SerialDataReceivedEventArgs);
begin
    if not SerialPort1.IsOpen then Exit;   

    try
        SerialPort1.Read(RX,0,5);
        FillTable;
    except on ex: exception do 
    begin
        exit;
    end;
    end;
end;

procedure MainForm.mythread;
begin
    while true do
    begin
        TX[0]:=$FF;
        TX[1]:=$01;
        TX[2]:=$01;
        TX[3]:=thechannel;
        TX[4]:=mcommand;
        TX[5]:=(TX[2] xor TX[3] xor TX[4]);

        SerialPort1.Write(TX,0,6);
        while SerialPort1.BytesToWrite>0 do;
        Thread.Sleep(100);

        if (stoploop) then
            break;
    end;
end;

method MainForm.CommBtn_Click(sender: System.Object; e: System.EventArgs);
begin

{$IFDEF CLR}
    if SerialPort1 = nil then
        SerialPort1 := new System.Io.Ports.SerialPort();
    SerialPort1.Close;

    SerialPort1 := new System.Io.Ports.SerialPort();
    SerialPort1.BaudRate:=19200;
    SerialPort1.DataBits:=8;
    SerialPort1.DtrEnable:=true;
    SerialPort1.Parity:=System.IO.Ports.Parity.Even;
    SerialPort1.PortName:='COM1';//'/dev/ttyS0';
    SerialPort1.ReadBufferSize:=4096;
    SerialPort1.ReadTimeout:=1000;
    SerialPort1.RtsEnable:=true;
    SerialPort1.StopBits:=System.IO.Ports.StopBits.One;
    SerialPort1.WriteTimeout:=1000;
    SerialPort1.DataReceived += new SerialDataReceivedEventHandler(MySerialData);
    SerialPort1.Open;

    thr:= new Thread(@mythread);
    thr.Start;
{$ENDIF}
end;

method MainForm.button1_Click(sender: System.Object; e: System.EventArgs);
begin
    thechannel:=$04;
    mcommand:=$A1;
end;

method MainForm.button2_Click(sender: System.Object; e: System.EventArgs);
begin
  thechannel:=$04;
  mcommand:=$A2;
end;

method MainForm.button4_Click(sender: System.Object; e: System.EventArgs);
begin
  thechannel:=$04;
  mcommand:=$A4;
end;

method MainForm.button5_Click(sender: System.Object; e: System.EventArgs);
begin
  thechannel:=$04;
  mcommand:=$A8;
end;

Любая идея?

Спасибо

1 Ответ

1 голос
/ 18 июля 2011

В свойствах DataGridView вы можете установить его публичность.

...