窗体Controls的OfType<>方法的使用

本文介绍了一种在Visual Studio中批量清空窗体上所有TextBox控件的方法,适用于VS2008及以上的版本,同时也提供了VS2005中实现相同功能的替代方案。
  如果当前窗体中有大量TextBox对象,需要将所有对象的输入内容清空而又不想在代码中逐个设置Text属性,可以考虑使用OfType<>方法,用法:

           IEnumerable<TextBox> textBoxes = this.Controls.OfType<TextBox>(); //所有同类型控件
            foreach (TextBox textBox in textBoxes)//执行相同操作
                textBox.Text = "";

显然,对于任类的对象均可考虑此方法,不单单适用于TextBox类
以上方法在VS 2008中可用

VS2005里没封装那个方法,可以通过以下方法实现相同功能:
foreach (Control textBox in this.Controls)
            {
                if (textBox.GetType().Name == "TextBox")//或者textBox.GetType().FullName == "System.Windows.Forms.TextBox"
                    textBox.Text = "";
            }
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Drawing; using System.Collections; using System.IO; using System.Drawing.Imaging; using System.IO.Compression; using System.Diagnostics; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using Newtonsoft.Json; namespace Util { #region EnumStringAttribute [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)] public class EnumStringAttribute : System.Attribute { public EnumStringAttribute(string str) { this.enumStr = str; } public string GetEnumString() { return this.enumStr; } private string enumStr; } #endregion public class Util { /// <summary> /// 得到可执行程序所在的目录,最后具有分隔符“\\”。 /// </summary> /// <returns></returns> public static string GetApplicationPath() { return AppDomain.CurrentDomain.BaseDirectory; } /// <summary> /// 填充并显示窗体Panel中 /// </summary> /// <param name="panel"></param> /// <param name="frm"></param> public static void fillShowFrmToPanel(Panel panel, Form frm) { if (panel.Controls.Contains(frm)) { return; } panel.Controls.Clear(); frm.TopLevel = false; panel.Controls.Add(frm); frm.FormBorderStyle = FormBorderStyle.None; frm.Dock = DockStyle.Fill; frm.Show(); } /// <summary> /// 将文件名中的非法字符替换为'_',得到有效的文件名 /// </summary> /// <param name="filename"></param> /// <returns></returns> public static string GetValidFileName(string filename) { string newname = filename; newname = newname.Replace('/', '_'); newname = newname.Replace('\\', '_'); newname = newname.Replace(':', '_'); newname = newname.Replace('*', '_'); newname = newname.Replace('?', '_'); newname = newname.Replace('"', '_'); newname = newname.Replace('<', '_'); newname = newname.Replace('>', '_'); newname = newname.Replace('|', '_'); newname = newname.Replace((char)0xA, ' '); return newname; } /// <summary> /// 将字符串转化为整数 /// </summary> /// <param name="val"></param> /// <param name="defVal"></param> /// <returns></returns> public static int ToInt(string val, int defVal) { if (string.IsNullOrEmpty(val)) return defVal; try { if (val.StartsWith("0x") || val.StartsWith("0X")) { return int.Parse(val.Substring(2, val.Length - 2), System.Globalization.NumberStyles.HexNumber); } else { return int.Parse(val); } } catch (Exception e) { Console.WriteLine("数据转换格式错误:val: {0} {1}", val, e.Message); return defVal; } } /// <summary> /// 将字符串转换为长整数。 /// </summary> /// <param name="val"></param> /// <param name="defVal"></param> /// <returns></returns> public static long ToLong(string val, long defVal) { if (string.IsNullOrEmpty(val)) return defVal; try { if (val.StartsWith("0x") || val.StartsWith("0X")) { return long.Parse(val.Substring(2, val.Length - 2), System.Globalization.NumberStyles.HexNumber); } else { return long.Parse(val); } } catch (Exception e) { Console.WriteLine("数据转换格式错误:val: {0} {1}", val, e.Message); return defVal; } } /// <summary> /// 将二进制转化为16进制字符串。 /// </summary> /// <param name="buf"></param> /// <returns></returns> public static string BinaryToString(byte[] buf, int maxLen) { if (buf == null) return ""; int count = Math.Min(buf.Length, maxLen); bool bOmit = count < buf.Length; StringBuilder sb = new StringBuilder(count * 2 + 30); for (int i = 0; i < count; ++i) { sb.Append(buf[i].ToString("X2")); } if (bOmit) sb.Append(string.Format(" ... Total {0} Bytes", buf.Length)); return sb.ToString(); } /// <summary> /// 将二进制转化为16进制字符串。 /// </summary> /// <param name="buf"></param> /// <param name="cntPerRow">每行显示几个字节</param> /// <returns></returns> public static string BinaryToStringFormat(byte[] buf, int cntPerRow) { if (buf == null) return ""; StringBuilder sb = new StringBuilder(buf.Length * 2); int cnt = 0; int cntall = 0; foreach (byte b in buf) { cnt++; cntall++; if (cnt == 1) { sb.Append((cntall - 1).ToString("d4")).Append(" : "); } sb.Append(b.ToString("X2")).Append(" "); if (cnt >= cntPerRow) { sb.AppendLine(); cnt = 0; } } return sb.ToString(); } /// <summary> /// 将字符串转化为二进制数据数组 /// </summary> /// <param name="str"></param> /// <returns></returns> public static byte[] BinaryFromString(string str) { if (string.IsNullOrEmpty(str)) return new byte[0]; str = str.Trim(); int len = str.Length / 2; byte[] buf = new byte[len + (str.Length % 2)]; for (int i = 0; i < len; ++i) { buf[i] = byte.Parse(str.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber); } if ((str.Length % 2) > 0) { // 最后一个字符 buf[buf.Length - 1] = byte.Parse(str.Substring(str.Length - 1, 1), System.Globalization.NumberStyles.HexNumber); } return buf; } /// <summary> /// byte数组格式化为十六进制的字符串 /// </summary> /// <param name="buffer"></param> /// <param name="len">长度</param> /// <param name="spliter">分割符</param> /// <returns></returns> public static string BufferFormat(byte[] buffer, int len, char spliter) { StringBuilder sb = new StringBuilder(""); if (buffer == null) return sb.ToString(); for (int i = 0; i < len; ++i) { sb.Append(buffer[i].ToString("X2")).Append(spliter); } return sb.ToString(); } public static uint ColorToInt(Color color) { return (uint)(((uint)color.B << 16) | (ushort)(((ushort)color.G << 8) | color.R)); } public static Color IntToColor(int color) { int r = 0xFF & color; int g = 0xFF00 & color; g >>= 8; int b = 0xFF0000 & color; b >>= 16; return Color.FromArgb(r, g, b); } #region DllImport 把窗体导出为图片使用 [DllImport("user32.dll")] public static extern IntPtr GetWindowRect(IntPtr hWnd, ref Rectangle rect); [DllImport("gdi32.dll")] public static extern IntPtr CreateCompatibleDC(IntPtr hdc); [DllImport("gdi32.dll")] public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight); [DllImport("gdi32.dll")] public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj); [DllImport("gdi32.dll")] public static extern int DeleteDC(IntPtr hdc); [DllImport("gdi32.dll")] public static extern bool BitBlt( IntPtr hdcDest, // 目的 DC的句柄 int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, // 源DC的句柄 int nXSrc, int nYSrc, System.Int32 dwRop // 光栅的处置数值 ); [DllImport("user32.dll")] public static extern bool PrintWindow(IntPtr hwnd, IntPtr hdcBlt, UInt32 nFlags); [DllImport("user32.dll")] public static extern IntPtr GetWindowDC(IntPtr hwnd); #endregion /// <summary> /// 根据窗口句柄,把窗口显示导出图片(.bmp) /// </summary> /// <param name="hWnd"></param> /// <returns></returns> public static Bitmap GetWindowCapture(IntPtr hWnd) { IntPtr hscrdc = GetWindowDC(hWnd); Rectangle windowRect = new Rectangle(); GetWindowRect(hWnd, ref windowRect); int width = windowRect.Right - windowRect.Left; int height = windowRect.Bottom - windowRect.Top; IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, width, height); IntPtr hmemdc = CreateCompatibleDC(hscrdc); SelectObject(hmemdc, hbitmap); PrintWindow(hWnd, hmemdc, 0); Bitmap bmp = Bitmap.FromHbitmap(hbitmap); DeleteDC(hscrdc);//删除用过的对象 DeleteDC(hmemdc);//删除用过的对象 return bmp; } public static string BufferFormatSimple(byte[] buffer) { return Util.BufferFormat(buffer, buffer.Length, ' '); } static Dictionary<string, List<string>> typeHash = new Dictionary<string, List<string>>(); /// <summary> /// 得到与枚举类型值相关联的字符串 /// </summary> /// <param name="type"></param> /// <returns></returns> public static List<string> GetEnumString(Type type) { if (typeHash.ContainsKey(type.ToString())) { return typeHash[type.ToString()]; } else { List<string> list = new List<string>(); System.Reflection.MemberInfo[] mis = type.GetMembers(); foreach (System.Reflection.MemberInfo mi in mis) { Attribute[] attrs = System.Attribute.GetCustomAttributes(mi); foreach (Attribute at in attrs) { if (at is EnumStringAttribute) { list.Add(((EnumStringAttribute)at).GetEnumString()); } } } typeHash[type.ToString()] = list; return list; } } static Hashtable enumValueHash = new Hashtable(); /// <summary> /// 由枚举类型及枚举显示字符串得到枚举数值。 /// 如 由 SexType "男" 得到 (int)SexType.Male /// </summary> /// <param name="enumType"></param> /// <param name="enumDisStr"></param> /// <returns></returns> public static int GetEnumValue(Type enumType, string enumDisStr) { string key = enumType.ToString() + enumDisStr; if (enumValueHash.Contains(key)) { return (int)enumValueHash[key]; } else { int ret = -1; System.Reflection.MemberInfo[] mis = enumType.GetMembers(); foreach (System.Reflection.MemberInfo mi in mis) { Attribute[] attrs = System.Attribute.GetCustomAttributes(mi); foreach (Attribute at in attrs) { if (at is EnumStringAttribute) { EnumStringAttribute esr = (EnumStringAttribute)at; if (esr.GetEnumString() == enumDisStr) { ret = (int)System.Enum.Parse(enumType, mi.Name); break; } } } if (ret != -1) break; } enumValueHash[key] = ret; return ret; } } static Hashtable enumStringHash = new Hashtable(); /// <summary> /// 有枚举类型及枚举值得到显示字符串。 /// 如 由 SexType (int)SexType.Male 得到 "男" /// </summary> /// <param name="enumType"></param> /// <param name="enumVal"></param> /// <returns></returns> public static string GetEnumDisString(Type enumType, int enumVal) { string key = enumType.ToString() + enumVal.ToString(); if (enumStringHash.Contains(key)) { return (string)enumStringHash[key]; } else { string ret = ""; System.Reflection.MemberInfo[] mis = enumType.GetMembers(); foreach (System.Reflection.MemberInfo mi in mis) { Attribute[] attrs = System.Attribute.GetCustomAttributes(mi); foreach (Attribute at in attrs) { if (at is EnumStringAttribute) { EnumStringAttribute esr = (EnumStringAttribute)at; //object obj = System.Enum.Parse(enumType, mi.Name); if ((int)System.Enum.Parse(enumType, mi.Name) == enumVal) { ret = esr.GetEnumString(); break; } } } if (ret != "") break; } enumStringHash[key] = ret; return ret; } } private static ImageCodecInfo GetEncoderInfo(string mimeType) { // Get image codecs for all image formats ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); // Find the correct image codec for (int i = 0; i < codecs.Length; i++) if (codecs[i].MimeType == mimeType) return codecs[i]; return null; } public static byte[] ConvertToJpgBuff(Image bmp, long quality) { // Encoder parameter for image quality EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality); // JPEG image codec ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg"); EncoderParameters encoderParams = new EncoderParameters(1); encoderParams.Param[0] = qualityParam; MemoryStream msJpg = new MemoryStream(); bmp.Save(msJpg, jpegCodec, encoderParams); bmp.Dispose(); return msJpg.ToArray(); } /// <summary> /// Convert Image to Byte[] /// </summary> /// <param name="image"></param> /// <returns></returns> public static byte[] ImageToBytes(Image image) { ImageFormat format = image.RawFormat; using (MemoryStream ms = new MemoryStream()) { if (format.Equals(ImageFormat.Jpeg)) { image.Save(ms, ImageFormat.Jpeg); } else if (format.Equals(ImageFormat.Png)) { image.Save(ms, ImageFormat.Png); } else if (format.Equals(ImageFormat.Bmp)) { image.Save(ms, ImageFormat.Bmp); } else if (format.Equals(ImageFormat.Gif)) { image.Save(ms, ImageFormat.Gif); } else if (format.Equals(ImageFormat.Icon)) { image.Save(ms, ImageFormat.Icon); } else image.Save(ms, ImageFormat.Jpeg); byte[] buffer = new byte[ms.Length]; //Image.Save()会改变MemoryStream的Position,需要重新Seek到Begin ms.Seek(0, SeekOrigin.Begin); ms.Read(buffer, 0, buffer.Length); return buffer; } } /// <summary> /// Convert Byte[] to Image /// </summary> /// <param name="buffer"></param> /// <returns></returns> public static Image BytesToImage(byte[] buffer) { MemoryStream ms = new MemoryStream(buffer); Image image = System.Drawing.Image.FromStream(ms); return image; } /// <summary> /// Convert Byte[] to a picture and Store it in file /// </summary> /// <param name="fileName"></param> /// <param name="buffer"></param> /// <returns></returns> public static string CreateImageFromBytes(string fileName, byte[] buffer) { string file = fileName; Image image = BytesToImage(buffer); ImageFormat format = image.RawFormat; if (format.Equals(ImageFormat.Jpeg)) { file += ".jpeg"; } else if (format.Equals(ImageFormat.Png)) { file += ".png"; } else if (format.Equals(ImageFormat.Bmp)) { file += ".bmp"; } else if (format.Equals(ImageFormat.Gif)) { file += ".gif"; } else if (format.Equals(ImageFormat.Icon)) { file += ".icon"; } System.IO.FileInfo info = new System.IO.FileInfo(file); System.IO.Directory.CreateDirectory(info.Directory.FullName); File.WriteAllBytes(file, buffer); return file; } public static System.DateTime ConvertIntDateTime(long d) { System.DateTime time = System.DateTime.MinValue; System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); time = startTime.AddMilliseconds(d); return time; } public static long ConvertDateTimeInt(System.DateTime time) { //double intResult = 0; System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0)); long t = (time.Ticks - startTime.Ticks) / 10000; //除10000调整为13位 return t; } /// <summary> /// 压缩缓冲区 /// </summary> /// <param name="inBuff">输入待压缩缓冲区</param> /// <param name="outBuff">输出压缩后缓冲区</param> /// <returns></returns> public static Boolean CompressBuffer(byte[] inBuff, ref byte[] outBuff) { Boolean bLess = false; using (MemoryStream destination = new MemoryStream()) { using (GZipStream output = new GZipStream(destination, CompressionMode.Compress)) { output.Write(inBuff, 0, inBuff.Length); } destination.Flush(); outBuff = destination.ToArray(); bLess = (outBuff.Length < inBuff.Length); if (!bLess) outBuff = inBuff; } return bLess; } /// <summary> /// 解压缩缓冲区 /// </summary> /// <param name="inBuff">待解压缓冲区</param> /// <param name="outBuff">解压后缓冲区</param> /// <returns></returns> public static Boolean DecompressBuffer(byte[] inBuff, ref byte[] outBuff) { Stream source = new MemoryStream(inBuff); using (MemoryStream destination = new MemoryStream()) { using (GZipStream input = new GZipStream(source, CompressionMode.Decompress, true)) { byte[] bytes = new byte[4096]; int n; while ((n = input.Read(bytes, 0, bytes.Length)) != 0) { destination.Write(bytes, 0, n); } } destination.Flush(); destination.Position = 0; outBuff = destination.ToArray(); } return true; } /// <summary> /// 从指定目录获取指定扩展名的文件 /// </summary> /// <param name="path"></param> /// <param name="extNameArr"></param> /// <returns></returns> public static List<FileInfo> GetDirFiles(string path, params string[] extNameArr) { List<FileInfo> lst = new List<FileInfo>(); try { string[] dir = Directory.GetDirectories(path); //文件夹列表 DirectoryInfo fdir = new DirectoryInfo(path); FileInfo[] file = fdir.GetFiles(); if (file.Length != 0 || dir.Length != 0) //当前目录文件或文件夹不为空 { foreach (FileInfo f in file) //显示当前目录所有文件 { foreach(string extName in extNameArr) { if (extName.ToLower().IndexOf(f.Extension.ToLower()) >= 0) { lst.Add(f); break; } } } foreach (string d in dir) { GetDirFiles(d, extNameArr);//递归 } } } catch (Exception ex) { Console.WriteLine(ex.Message); } return lst; } public static int DBM2Int(string dbm) { if (string.IsNullOrEmpty(dbm) || dbm.Length != 3) { Debug.Assert(false, "节点DBM不能为空,且长度必须为3," + dbm); } int id = 0; char[] arr = dbm.ToCharArray(); for (int i = 0; i < arr.Length; i++) { id <<= 8; id |= (byte)arr[i]; } return id; } public static string Int2DBM(int id) { char[] arr = new char[3]; for (int i = 2; i >= 0; i--) { arr[i] = (char)(id & 0xFF); id >>= 8; } return new string(arr); } #region 将类和结构序列化和反序列化的方法 /// <summary> /// 序列化(把类和结构序列化) /// </summary> /// <param name="msg">结构信息</param> /// <returns></returns> //public static byte[] Serialize(object obj) //{ // try // { // string json = JsonConvert.SerializeObject(obj); // byte[] buffer = Encoding.UTF8.GetBytes(json); // return buffer; // } // catch (Exception e) // { // Console.WriteLine(e.Message); // //OutPutLog.WriteLog(LogLevel.Error, "Util.Serialize()错误 " + e.Message, LogObjType.Util.ToString()); // } // return null; //} public static byte[] Serialize(object obj) { try { IFormatter inFormatter = new BinaryFormatter(); MemoryStream stm = new MemoryStream(); inFormatter.Serialize(stm, obj); byte[] buffer = stm.ToArray(); stm.Close(); stm.Dispose(); return buffer; } catch (Exception e) { Console.WriteLine(e.Message); //OutPutLog.WriteLog(LogLevel.Error, "Util.Serialize()错误 " + e.Message, LogObjType.Util.ToString()); } return null; } /// <summary> /// 反序列化(类和结构的反序列化) /// </summary> /// <param name="buffer">串行数据</param> /// <returns></returns> //public static object Deserialize(byte[] buffer) //{ // try // { // string json = Encoding.UTF8.GetString(buffer); // return JsonConvert.DeserializeObject(json) ?? null; // } // catch (Exception e) // { // Console.WriteLine(e.Message); // //OutPutLog.WriteLog(LogLevel.Error, "Util.Deserialize() " + e.Message, LogObjType.Util.ToString()); // } // return null; //} public static object Deserialize(byte[] buffer) { try { MemoryStream stream = new MemoryStream(buffer); BinaryFormatter outFormatter = new BinaryFormatter(); object obj = outFormatter.Deserialize(stream); stream.Close(); stream.Dispose(); return obj; } catch (Exception e) { Console.WriteLine(e.Message); //OutPutLog.WriteLog(LogLevel.Error, "Util.Deserialize() " + e.Message, LogObjType.Util.ToString()); } return null; } #endregion } } 转换.net8.0
08-20
目标:把JAVA源码改用delphi实现。 我有一台医疗设备,是双通道的,每个通道有两个硬件按钮(select 和 start),共工作流程共七步: 1、设备通电,设备LCD显示:“主机未连线激活”。 2、电脑连接USB数据线至设备,启动自带的JAVA软件,开始初始化,当主机LCD显示:“主机成功连线”时,初始化完成。 3、设备开始用内置的传感器自检当时的环境温度,直到设备自动加温到为37度止。 4、设备加温完毕,按设备上“select”硬件按钮选择测试项目。此部分功能由设备内置的ARM单片机完成LCD显示。 5、项目选择完毕后,按设备上的"start"硬件按钮开始检测, 6、开始监测后,JAVA软件就会不断地向电脑的JAVA软件发送数据。数据包括:设备序列号、检测类型、通道号、每个通道检测的坐标数据等等。 7、JAVA软件会接收并解析这些数据。 ===== 我的终极目标是用delphi编程得到这些解析后的数据,用JSON文件格式导出。 我使用delphi ver12.3 编程,软件已经安装了一个最新版本的HID控件, 控件来自:https://github.com/project-jedi/jvcl。 控件版本: HidControllerClassVersion = '1.0.35'; 已知信息: 1、JAVA软件与设备通过USB HID方式通讯 2、VENDOR_ID = $FFFF; PRODUCT_ID = $0001; 3、设备完好;JAVA软件能良好运行,正常与设备通讯;数据线连接没有任何问题。 4、报告长度:Report Size=33,肯定也有 Report ID 5、设备初始化是有一个序列动作的,好像还有一个类似心跳的东东来维持连线状态。 6、调用HID控件,需要引用的单元是:JvHidControllerClass ====== 我有全部的JAVA源码,使用 DIR/S 命令列出JAVA源码文件目录结构如下: 驱动器 D 中的卷是 2T_Disk1 卷的序列号是 BC7A-D97F D:\main 的目录 2025/09/13 21:03 <DIR> . 2025/09/13 21:03 <DIR> .. 2025/09/13 21:02 <DIR> java 2025/09/13 21:03 0 mainFiles.txt 1 个文件 0 字节 D:\main\java 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2025/09/13 21:02 <DIR> com 2025/09/13 21:02 <DIR> META-INF 2025/09/13 21:02 <DIR> my 0 个文件 0 字节 D:\main\java\com 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2025/09/13 21:02 <DIR> sienco 2025/09/13 21:02 <DIR> smallplanet 2025/09/13 21:02 <DIR> viscell 0 个文件 0 字节 D:\main\java\com\sienco 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2025/09/13 21:02 <DIR> sonoclot 0 个文件 0 字节 D:\main\java\com\sienco\sonoclot 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2025/09/13 21:02 <DIR> instrument 2025/09/13 21:02 <DIR> signature 2025/09/13 21:02 <DIR> sigwindow 2025/09/13 21:02 <DIR> wrapper 0 个文件 0 字节 D:\main\java\com\sienco\sonoclot\instrument 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/12/14 16:15 40,247 SonoclotInstrument.java 1 个文件 40,247 字节 D:\main\java\com\sienco\sonoclot\signature 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/12/14 16:19 13,667 SimpleSignature.java 1 个文件 13,667 字节 D:\main\java\com\sienco\sonoclot\sigwindow 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/12/14 16:15 12,730 SignatureDisplay.java 2021/09/14 15:33 34,216 SigWindowSignaturePanel.java 2 个文件 46,946 字节 D:\main\java\com\sienco\sonoclot\wrapper 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/12/14 16:17 25,032 WrapperManager.java 1 个文件 25,032 字节 D:\main\java\com\smallplanet 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2025/09/13 21:02 <DIR> util 0 个文件 0 字节 D:\main\java\com\smallplanet\util 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/12/14 16:14 3,390 SPSXYPoint.java 1 个文件 3,390 字节 D:\main\java\com\viscell 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2025/09/13 21:02 <DIR> busyFlag 2025/09/13 21:02 <DIR> usb 0 个文件 0 字节 D:\main\java\com\viscell\busyFlag 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/10/12 11:04 6,539 BusyFlag.java 2021/10/12 11:04 17,028 BusyFlagThread.java 2021/10/12 11:04 8,147 CallMethodLaterManager.java 2021/10/12 11:04 1,117 SyncObject.java 4 个文件 32,831 字节 D:\main\java\com\viscell\usb 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/10/12 18:10 2,291 HidCommand.java 2021/10/12 11:04 1,442 HidConnection.java 2021/10/12 11:04 1,974 HidController.java 2021/10/12 11:04 296 HidControllerCreator.java 2021/10/12 12:21 6,874 HidManager.java 2021/10/12 11:04 630 HidReference.java 2021/10/12 18:10 2,292 HidReport.java 2021/10/12 15:28 12,135 SigViewerHidCommandManager.java 2021/10/12 18:09 1,896 SigViewerHidUtilities.java 2025/09/09 18:51 258 usb.txt 2021/10/12 11:04 743 USBException.java 2021/10/21 17:13 9,421 USBManager.java 2021/10/12 11:04 469 USBReport.java 13 个文件 40,721 字节 D:\main\java\META-INF 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/09/14 18:04 108 MANIFEST.MF 1 个文件 108 字节 D:\main\java\my 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2025/09/13 21:02 <DIR> bean 2025/09/13 21:02 <DIR> ui 2025/09/13 21:02 <DIR> utils 0 个文件 0 字节 D:\main\java\my\bean 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/12/09 23:49 3,639 ConfigInfo.java 2021/12/09 23:15 231 IPropInfo.java 2021/12/09 23:15 41,341 JProperties.java 2021/12/14 16:14 274 TLVType.java 4 个文件 45,485 字节 D:\main\java\my\ui 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/12/09 22:48 1,925 BaseFrame.java 2021/12/09 23:23 2,317 ComponentsFrame.java 2021/12/09 22:48 210 IFrame.java 2021/12/09 23:02 2,020 RootFrame.java 2021/12/09 23:39 3,138 SysPropFrame.java 5 个文件 9,610 字节 D:\main\java\my\utils 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/12/01 23:27 1,912 ByteUtil.java 2021/10/12 11:46 1,230 DataLog.java 2025/09/13 21:02 <DIR> fifo 2025/09/13 21:02 <DIR> file 2021/10/12 11:23 947 FixedExecutorService.java 2021/12/09 22:48 2,105 HostUtils.java 2021/12/01 12:02 98 ISocketRecDataProcess.java 2025/09/13 21:02 <DIR> log 2021/12/09 23:23 1,868 PropUtils.java 2021/10/12 11:26 984 QueueExecutorService.java 2021/12/10 16:02 14,646 SocketClient.java 2021/12/10 16:05 1,194 SocketClientLog.java 2025/09/13 21:02 <DIR> threadpool 2025/09/13 21:02 <DIR> tlv 2021/10/21 15:45 1,278 UsbManagerLog.java 10 个文件 26,262 字节 D:\main\java\my\utils\fifo 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/11/30 23:42 722 FIFO.java 2021/11/30 23:43 1,472 FIFOImpl.java 2 个文件 2,194 字节 D:\main\java\my\utils\file 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/12/10 15:47 16,938 FileUtils.java 1 个文件 16,938 字节 D:\main\java\my\utils\log 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/10/12 11:23 2,459 FileThreadLogger.java 2021/10/12 11:23 205 ThreadLogger.java 2 个文件 2,664 字节 D:\main\java\my\utils\threadpool 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/11/30 23:11 110 PoolTask.java 2021/11/30 23:11 1,201 PoolUtils.java 2 个文件 1,311 字节 D:\main\java\my\utils\tlv 的目录 2025/09/13 21:02 <DIR> . 2025/09/13 21:02 <DIR> .. 2021/12/01 22:47 114 ITLVSocketRecDataProcess.java 2021/11/30 16:01 3,315 TLVByteBuffer.java 2021/12/01 23:32 9,827 TLVDecoder.java 2021/12/01 23:47 4,586 TLVDecodeResult.java 2021/11/30 16:59 7,959 TLVEncoder.java 2021/12/01 17:07 2,227 TLVEncodeResult.java 2021/11/30 18:02 2,724 TLVObject.java 2021/12/14 12:13 4,587 TLVSocketClient.java 2021/11/30 18:03 4,116 TLVUtils.java 9 个文件 39,455 字节 所列文件总数: 60 个文件 346,861 字节 71 个目录 246,202,134,528 可用字节 ------ 因本人不懂JAVA,不会分析,请你帮忙先分析一下JAVA软件是如何初始化的设备的,其步骤流程是什么?是怎样通过USB HID与设备通讯收发数据的,如何保持初始化状态的,如何通知设备已经做好收发数据准备,如何通知设备可以启用select和start按钮的。 总之,就是JAVA软件的工作流程。这了完成这些分析,你需要我上传那些JAVA源码文件,请告诉我你要的文件名。 另外:delphi的功能要求:有个初始化按钮和memo显示获得的数据,为了调试方便请增加大量的调试信息,可用OutputDebugString输出,方便使用DebugView.exe观察到并能把观察结果反馈给你。把所有与设备通讯的代码写入一个独立的单元中。
最新发布
09-27
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值