热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

『参考』.netCF组件编程(2)——为组件添加事件

在前一篇文章中,大家和我一起已经为组件添加了其必要属性,那么,在有了属性之后,我们就接着为组件添加事件响应的功能吧ÿ

 

在前一篇文章中,大家和我一起已经为组件添加了其必要属性,那么,在有了属性之后,我们就接着为组件添加事件响应的功能吧,毕竟每个组件都应该有个简单的事件,要不组件就成属性容器了,呵呵。

好的,还是接上文『参考』.net CF组件编程(1)——基础之后,我们在TcpHelper.cs组件类中,添加一个基本的Tcp连接代码如下:

 

基础TCP方法

///
/// 链接远程主机,用于测试网络的连通性
///

private void Connect()
{
try
{
IPEndPoint iep
= new IPEndPoint(IPAddress.Parse(this.HostName), this.Port);
client
= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(iep);
ConnectHandler(
"连接成功!");//使用定义好的私有方法,向事件的订阅者发送“连接成功”消息
}
catch (Exception e)
{
DisconnectHandler(e.Message);
//使用定义好的私有方法,向事件的订阅者发送异常消息
}
finally
{
DisconnectHandler(
"断开连接!");//使用定义好的私有方法,向事件的订阅者发送“断开连接”消息
client.Close();

}
}

 

相信使用过Tcp编程的朋友们是非常熟悉这段代码的,当然,可能会对ConnectHandler以及DisconnectHandler函数陌生,他俩是我们即将定义的一个消息处理函数,用于向事件的订阅者传递事件信息的(这里的信息有点像Catch捕获异常时,那个Exception e中的e.Message),下面我们来真的为组件添加事件吧:

 

组件事件

///
/// 线程委托,用于返回连接状态等信息
///

/// 传出的参数,在实际调用中类似于事件的Args参数
public delegate void ConnectStatuDelegate(string msg);
///
/// 返回连接状态事件,ConnectedStatu就是在属性设计器中能看到的事件了
///

public event ConnectStatuDelegate ConnectedStatu;

 

定义好事件后,可以参照前一篇文章中,提及的为组件添加属性描述的方法,为事件同样添加好描述。如图:

方法类似于属性,大家应该自己去看吧,因为实在简单,在此就不赘述了。好了,下面,组件有事件了,接下来,我们要告诉这个事件,应该如何响应,接下来,为事件添加响应代码:

 

事件响应代码

///
/// 消息事件的委托方法,如果用户订阅了事件,那么其实是由此委托进行消息参数的传递的
///

///
private void MessageHandler(string msg)
{
ConnectStatuDelegate messageEvent
= ConnectedStatu;
if (messageEvent != null)
{
messageEvent(msg);
}
}
///
/// 私有方法,向事件发送消息
///

/// 欲发送的消息
private void ConnectHandler(string msg)
{
MessageHandler(msg);
}
///
/// 私有方法,向事件发送消息
///

/// 欲发送的消息
private void DisconnectHandler(string msg)
{
MessageHandler(msg);
}

这里,我们看到了ConnectHandler以及DisconnectHandler函数,是不是明了很多呢?其实就是调用同一个委托方法,供TCP基础函数来针对不同的状态返回给事件订阅者不同的消息。而MessageHandler方法是一个经典的事件处理的描述。

到此为止,我们的组件已经拥有了方法、属性,而我们的组件代码也就到此结束,在下一篇的文章,我们将学会如何使用此组件,以及如何处理组件的默认属性。

TcpHelper组件的全部代码如下:

 

TcpHelper全部代码

using System;

using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Threading;
using System.Net;
using System.Net.Sockets;

namespace TCPComponent
{

public class TCPHelper : Component
{

private Boolean isclient;
private Socket client;
private String host;
private Int32 port;


#region 主机地址
///
/// 远程主机地址
///

public string HostName
{
get
{
return host;
}
set
{
if (value == null || value.Trim().Length == 0)
{
throw new ArgumentException("Invalid Host name.");
}
host
= value;
}
}
#endregion

#region 端口号
///
/// 通讯使用的端口号
///

public int Port
{
get
{
return port;
}
set
{
if (value == 0 || value > 65535)
{
throw new ArgumentException("Invalid port Number.");
}
port
= value;
}
}
#endregion

#region 是否为客户端
///
/// 指示是否为客户端
///

public bool IsClient
{
get
{
return isclient;
}
set
{
isclient
= value;
}
}
#endregion

#region 方法体
///
/// 链接远程主机,用于测试网络的连通性
///

private void Connect()
{
try
{
IPEndPoint iep
= new IPEndPoint(IPAddress.Parse(this.HostName), this.Port);
client
= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(iep);
ConnectHandler(
"连接成功!");//使用定义好的私有方法,向事件的订阅者发送“连接成功”消息
}
catch (Exception e)
{
DisconnectHandler(e.Message);
//使用定义好的私有方法,向事件的订阅者发送异常消息
}
finally
{
DisconnectHandler(
"断开连接!");//使用定义好的私有方法,向事件的订阅者发送“断开连接”消息
client.Close();

}
}
#endregion

#region
///
/// 线程委托,用于返回连接状态等信息
///

/// 传出的参数,在实际调用中类似于事件的Args参数
public delegate void ConnectStatuDelegate(string msg);
///
/// 返回连接状态事件,ConnectedStatu就是在属性设计器中能看到的事件了
///

public event ConnectStatuDelegate ConnectedStatu;
///
/// 消息事件的委托方法,如果用户订阅了事件,那么其实是由此委托进行消息参数的传递的
///

///
private void MessageHandler(string msg)
{
ConnectStatuDelegate messageEvent
= ConnectedStatu;
if (messageEvent != null)
{
messageEvent(msg);
}
}
///
/// 私有方法,向事件发送消息
///

/// 欲发送的消息
private void ConnectHandler(string msg)
{
MessageHandler(msg);
}
///
/// 私有方法,向事件发送消息
///

/// 欲发送的消息
private void DisconnectHandler(string msg)
{
MessageHandler(msg);
}
#endregion


///
/// 多线程版本的连接远程主机,实际中,我们是调用此方法,所以其修饰为Public
///

public void ConnectAsync()
{
new Thread(new ThreadStart(Connect)).Start();
}


}
}

参考文档:

http://www.cnblogs.com/mapserver/category/65343.html 感谢Mapserver朋友

http://www.cnblogs.com/OSCAR_NJU/archive/2008/04/02/1134231.html 感谢死刑犯朋友(汗)



推荐阅读
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
author-avatar
兰州老头_337
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有