用户
 找回密码
 立即注册

33

主题

96

帖子

1811

积分

金牌会员

Rank: 6Rank: 6

积分
1811
发表于 2019-5-30 10:30:37
各位专家,

请教一个问题。 在蓝牙通信中, 我希望同一个蓝牙插件可以在多个forms中使用,因此,我创建了一个公共类,并在该类中添加了一个蓝牙插件:
public class myBL
{
   public static Smobiler.Plugins.Bluetooth blDevice;
   ...
}

但是在一个form中,当我试图使用上面的公用插件时,发现它无法被调用:

partial class frmBlueTooth : Smobiler.Core.Controls.MobileForm
{

         private void frmBlueTooth_Load(object sender, EventArgs e)
        {
            myBL.blDevice = new Smobiler.Plugins.Bluetooth();

            myBL.blDevice.Search(obj, args) => {         //这个没有执行,而且在设置断点查看时,发现myBL.blDevice 的属性不对。
                if (args.isError == true)
                    Toast(args.error);
                else
                {
                    Toast("success" + args.Name + "  " + args.MacAddress);
                }
            );
        }
}

但是如果是在该form中放入一个 蓝牙插件(如 bluetooth1),并将上面代码中的 myBL.blDevice 替换成 这个本地的插件,那么它可以
正确运行。

我想请问,我在公共类中放置蓝牙插件的做法在哪里出错了?或者我如何在别的form中访问上面form中的蓝牙插件?

谢谢
大杰米
分享至 : QQ空间
0 人收藏
使用道具 举报 回复
发表于 2019-5-30 23:49:45
本帖最后由 bigjimmy8257 于 2019-5-30 23:51 编辑

附注, 有一些新的操作汇报如下:

我将form1中的蓝牙插件做了public处理,之后可以在form2中访问到它了, 并且在form2中可以用它来发送数据, 对端也可以收到。

            byte[]  buffer = new byte[4] { 'T', 'E', 'S', 'T' };
            form1.bluetooth1.WriteData(buffer, (obj, args) => { });

但是,我试图在form2中为该form1中的蓝牙插件创建事件,用于接收对端发送的消息:

           form1.bluetooth1.DataReceived += new Smobiler.Plugins.BluetoothDataReceivedEventHandler(this.Bluetooth_DataReceived);

public void Bluetooth_DataReceived(object sender, Smobiler.Plugins.BluetoothDataReceivedEventArgs e)
{
        byte[] blBuffer = new byte[e.Data.Length];
        e.Data.CopyTo(blBuffer, 0);
}

但是该事件无法 被触发。 在Bluetooth_DataReceived中打断点可知,但对方发送数据后,该事件并未被触发。

请教一下,我这里的做法是否可行, 即在form2中为form1中的蓝牙控件添加事件。

谢谢
大杰米
使用道具 举报 回复 支持 反对
发表于 2019-5-31 19:48:03
附注2: 问题以下面的方式 得到了解决。

在form2中也拖入一个Bluetooth插件 (比如名字为bluetooth1),并以正常的方式为之创建DataReceived 事件
private void bluetooth1_DataReceived(object sender, Smobiler.Plugins.BluetoothDataReceivedEventArgs e)
{
        byte[] blBuffer = new byte[e.Data.Length];
        e.Data.CopyTo(blBuffer, 0);
}

在form2的load事件中,为form2中的bluetooth1 进行赋值,将form1中的Bluetooth控件赋值给它。
private void form2_Load(object sender, EventArgs e)
{
     this.bluetooth1 = form1.bluetooth1;
}

这样form2 中就可以使用本地的bluetooth1 来使用form1中的已经建立了蓝牙连接的bluetooth1控件了。

注意,如果在form2中的蓝牙插件是由代码创建,则不行,我没搞清楚是怎么回事,期待高人解答。
     Smobile.Plugins.bluetooth bluetooth1 = form1.bluetooth1;  

希望对大家有所帮助。

谢谢
大杰米
使用道具 举报 回复 支持 反对
发表于 2019-6-3 15:45:47
首先静态变量是所有客户端共享的,不建议使用。即会出现一台设备变量修改,其他设备都修改的情况。
其次smobiler中只会触发当前Form中添加的控件组件,即Form2中并不能触发Form1中的控件组件。
然后代码创建控件组件后需要添加到Form中,控件的添加this.Controls.Add(控件),组件的添加this.Components.Add(组件)。这样即可触发在当前Form中的控件组件了
使用道具 举报 回复 支持 反对
发表于 2019-6-3 18:17:05
非常感谢。
使用道具 举报 回复
发表于 2020-9-11 18:10:49
bigjimmy8257 发表于 2019-5-31 19:48
附注2: 问题以下面的方式 得到了解决。

在form2中也拖入一个Bluetooth插件 (比如名字为bluetooth1),并以 ...

请教以下,按您说的建立2个form,但总是不能再form2中见到form1的bluetooth,form1中的bluetooth1属性设置为public,求助,多谢
使用道具 举报 回复 支持 反对
发表于 2020-9-11 18:43:59
bigjimmy8257 发表于 2019-5-30 23:49
附注, 有一些新的操作汇报如下:

我将form1中的蓝牙插件做了public处理,之后可以在form2中访问到它了,  ...

public 处理 包括那些内容,是不是这里出问题了
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册