精华内容
下载资源
问答
  • 这样是自动将新建sheet放在最前面的,可我想把它放在最后面。有办法么?注意是MFC,不是VB。 这个“VARIANT& After”要怎么写,才能生效?是写sheet名,还是写数字?要是能写数字,那就好了。 同理,那个void Move...
  • 窗体的最上层是“VB 6.0的菜单”和“便捷工具按钮”,菜单包含了所有的VB提供的功能的选项,而其中一些常用的功能或操作选项则被提取出来放在了“便捷工具按钮”,通过点击这些快捷按钮可以加快程序开发的速度,...
  • VB.Net常用语法

    2009-03-15 23:47:02
    您可以在函数调用,包括在API(当然VB.Net不再使用winAPI). 甚至一些至关紧要的过程也不例外:如new过程(此方法王国荣文章 有介绍) 如: class class1 Overloads Public Sub New() 。。。。。。 ...
  • 培养计划还要掌握Form的开发,本以为就是Report稍微变更了一下,或者VB关联上数据库,但是实际却不是那么回事,很是不习惯。今天陆陆续续看了一些资料,零零碎碎的记了一些笔记,还是心中没底。 1、将相关项目...

    培养计划中还要掌握Form的开发,本以为就是Report稍微变更了一下,或者VB关联上数据库,但是实际却不是那么回事,很是不习惯。今天陆陆续续看了一些资料,零零碎碎的记了一些笔记,还是心中没底。

    1、将相关项目组织成为功能单位。无物理表示方式,两种类型——数据块(与表或者视图相关)控制块。

    2、在数据块中新建Item,默认与数据库相关,可以在属性数据库设置中可以设定不相关,同时可以在一般属性中设定这个Item的类型,是文本还是按钮等。在物理属性中设定这个Item属于哪个Canvas。

    3、复制对象的时候会询问是拷贝还是创建子类。

    4、拷贝属性——可以将一个属性值拷贝复制到另一个属性。
    Properties -〉Copy Properties

    5、使用Shift+双击可以打开第二个对象的属性面板,从而可以进行两个对象的比较。以此类推,N个都行。

    6、可以在运行的时候设置对象的属性。以窗口对象为例,有Set_Window_Property('my_window',VISIBLE,PROPERTY_ON)在运行时设置窗口显示。同样有很多其他的一些内建过程、SET_BLOCK_PROPERTY、SET_CANVAS_PROPERTY、SET_FORM_PROPERTY、SET_ITEM_PROPERTY、SET_LOV_PROPERTY、SET_MENU_ITEM_PROPERTY、SET_PARAMETER_ATTR、SET_RADIO_BUTTON_PROPERTY、SET_RECORD_PROPERTY、SET_RELATION_PROPERTY、SET_VIEW_PROPERTY、SET_WINDOW_PROPERTY。其中,Set_Item_Property可以设置按钮、文本等任何类型的项目。

    7、四种类型模块
    有五种创建数据模块的方法,表、引用游标的过程、使用记录表的过程、事务触发器、FROM因子。可以通过Data Module Wizard修改这些设置。

    8、至于具体数据项的对应通过属性“数据库”和“高级数据库”来设置。

    1、基于过程的块
    在包头中说明的过程,在包体中一定要定义,定义必须连参数的名称也必须一至。
    在使用过程(procedure)建立数据块的时候,在包中分别建立查询、插入、更新、删除、锁定5个过程。用来操作数据。其中,查询的IN OUT的参数为REF CURSOR类型,而对表单记录的DML和加锁语句,IN OUT的参数为TABLE类型。

    例子:
    下面就是一个包中对记录进行查询和插入。
    包头:
    create or replace package test_emp_maint is
      -- Public type declarations
      TYPE emp_t IS RECORD(
           id test02.id%TYPE,
           name test02.name%TYPE,
           sex test02.sex%TYPE,
           age test02.age%TYPE,
           manager_id test02.manager_id%TYPE);

      --游标类型,用于查询参数    
      TYPE rc_emp IS REF CURSOR
           RETURN emp_t;
          
      --表类型,用于DML以及加锁
      TYPE t_emp IS TABLE OF
           emp_t
           INDEX BY BINARY_INTEGER;
          
      PROCEDURE slct(
               p_empqry IN OUT rc_emp);
              
      PROCEDURE ins(
               p_emprec IN OUT t_emp);           

    end test_emp_maint;   
    包体:
    create or replace package body test_emp_maint is
       
      -- SELECT DATA
      PROCEDURE slct(
               p_empqry IN OUT rc_emp)
      IS
      BEGIN
        OPEN p_empqry
        FOR
            SELECT * from test02;
      END;
     
      -- INSERT DATA
     PROCEDURE ins(
               p_emprec IN OUT t_emp)   
      IS
        --v_message VARCHAR(100);
      BEGIN
        --v_message := 'INSERT INTO TABLES TEST02 RECORDS';
        For v_ct IN 1 .. p_emprec.count
        LOOP
       
        INSERT INTO test02(
               id,
               name,
               sex,
               age,
               manager_id)
        VALUES (
           p_emprec( v_ct ).id,
           p_emprec( v_ct ).name,
           p_emprec( v_ct ).sex,
           p_emprec( v_ct ).age,
           p_emprec( v_ct ).manager_id                                  
        );              
        END LOOP;       

      END;

    END test_emp_maint;

    2、当在数据块中设定插入、更新的相关属性之后,FORM BUILDER会自动创建INSERT-PROCEDURE/UPDATE-PROCEDURE/DELETE-PROCEDURE等过程。
    NOTES:在填入参数类型的时候,一定要将参数类型写完整,将包的名字写上。例如上述插入参数的类型应该为test_emp_maint.t_emp,而不是t_emp。

    3、数据库服务器和表单:
    在何处放置代码:数据库服务器还是表单
    面向表单的代码放置在表单一侧,因为服务器不能解释类似于SET_BLOCK_PROPERTY这样的代码。数据库对象的代码则在表单和服务器上都可以存放。

    4、其它数据库代码源:
    1、数据库触发器
    2、基于视图的块
    3、基于过程的块

    5、程序库的三种级别:
    通用程序库(可分为对数据库操作和不对数据库操作)、应用程序专用的程序库(应用程序调用的数据程序包的代码)、表单专用程序库

    6、放置代码的通用准则:
    尽可能多的使用存储在数据库服务器中的代码实现对数据的访问和操作。Forms不应该使用PL/SQL代码打开游标或者执行缺省查询,以及DML机制外的查询。
    写的代码尽量通用。如果创建表单用的专用的实用程序是可重用的,则将其放置于程序库中。
    使用Package来使代码模块化。
    如有可能在Form的最高级编写触发器代码。(有三个等级Form->Block->Item)

    7、全局变量在session的生命周期内存在。
    赋值:GLOBAL.my_var := TO_CHAR(:order.total * .85);
    使用:calculate_discount(TO_NUMBER(:GLOBAL.my_var));
    Destory:Erase('GLOBAL.my_var');

    8、调用内置程序:
    Go_Item('customer.cust_id');
    Focus到customer块的cust_id项。

    9、使用函数:
    注意函数的返回类型。
    :control.item_A := Message_Text;
    Go_Item(Get_Block_Property('customer',LAST_ITEM));
    IF Show_LOV('customer_list') THEN  
    Message('Good Selection.');
    ELSE
    Message('No Customer was Selected.');
    END IF;

    10、传递参数给子程序:
    Resize_Window (window_name, width, height);
    Resize_Window('my_window',50,35);

    11、使用常量:
    Exit_Form(DO_COMMIT,NO_ROLLBACK);

    12、使用默认的参数值:
    Open_Form('order_entry');
    Open_Form('order_entry',ACTIVATE,NO_SESSION);

    13、通过名字引用Form Builder中的对象:
    Resize_Window('status_window',50,35);
    'block_name.item_name'
    'record_group_name.column_name'
    'blockname.columnname_itemname'

    14、引用Form Builder中项目的值:
    :ord.total := price * .85;

    15、通过内部ID引用Form Builder中的对象:
    DECLARE
    id_var WINDOW;
      BEGIN
      id_var := Find_Window('my_window');
    END;
    使用内部ID的理由:
    提高性能,易于维护

    16、系统变量:基于表单级,例如SYSTEM.BLOCK_STATUS

    17、调用用户命名的触发器:
    只能在内建触发器/菜单命令/用户命名的子程序调用。用户命名的触发器只能在特定位置存在,大多数情况是用户编写子程序,然后在触发器或者菜单命令中调用。

    18、触发器有如下类目:
    Block processing triggers
    Interface event triggers
    Master-Detail  triggers
    Message-handling triggers
    Navigational  triggers
    Query-time triggers
    Transactional triggers
    Validation triggers
    Other  triggers

    19、使用外部连接可以将表连接在自己身上。
    在某些情况下,使得字段信息成为统一记录的一部分,按照这种方式建立视图,可以大大减少网络流量。

    1. 子程序的作用范围
       1.1在表单模块中的用户定义的子程序只能从触发器或者同模块中的其他子程序调用。
       1.2在菜单模块中定义的子程序只能在菜单命令中调用。
       1.3在库模块中的子程序能够别任何触发器或者菜单命令调用,如果这个类图attached表单或者菜单模块。

    2. 定义参数
       数据类型,函数的参数为VARCHAR2, DATE, NUMBER, or BOOLEAN 或者Form Builder对象类型。过程的参数类型为有效的PL/SQL类型。
       参数模式:IN/OUT/IN OUT,注意参数是否可写。在使用OUT/IN OUT时,参数总是被赋值,即使在程序中没有显示赋值。
       使用参数的默认值,例如:PROCEDURE calculate_discount(multiplier IN NUMBER :=15);

    3. 关于类库
       类库支持动态载入,一个modul可以有多个类库,一个类库可以应用到多个modul。
       全局类库,打开的forms都可以共享。
       只能在原来建立类库的地方修改,不能在引用类库的地方编辑修改。在当前表单中建立类库并不能立刻应用,还是需要先保存,然后引入当前尽表单。两者在对象浏览器中的节点位置不同。

    4. 在库程序单元访问forms绑定变量
       库程序独立于菜单、forms绑定变量(the values of form items, system and global variables, and parameters ),所以不能直接引用。
       程序单元中不能引用如下对象:
       :block_name.item_name
       :GLOBAL.variable_name
       :SYSTEM.variable_name
       :PARAMETER.my_param
       而只能非直接引用:
       Name_In('block_name.item_name')
       Name_In('GLOBAL.variable_name')
       Name_In('SYSTEM.variable_name') 
       非直接设定值
       Copy('28876', 'block_name.item_name'); 
       Copy('standard', 'GLOBAL.variable_name'); 
       Copy('FALSE', 'System.Supress_Working'); 

    5. 数据库触发器
       可以在数据库对象中创建存储过程。
       可以在数据库对象中创建触发器。
       数据库触发器是与一张表关联PL/SQL块,在对表进行插入、更新、删除的时候激发。可以在对每行进行操作产生效果之前或者之后激发,所以组合起来共有12中可能。触发器通常运行在创建者的安全域中,而不是当前用户。例如:
    CREATE OR REPLACE TRIGGER update_on_weekends_check
      BEFORE UPDATE OF sal ON EMP
      FOR EACH ROW
    DECLARE
      my_count number(4);
    BEGIN
      SELECT COUNT(u_name) FROM WEEKEND_UPDATE_OK INTO my_count
        WHERE u_name = user_name;
      IF my_count=0 THEN
        RAISE_APPLICATION_ERROR(20508, 'Update not allowed');
      END IF;
    END;
    使用RAISE_APPLICATION_ERROR提示错误,错误代码参数在20000-20999 之间。
    删除记录,触发一下事件序列。
    5.1 Form Builder locks the record to be deleted.
    5.2 Operator presses [Commit].
    5.3 Form Builder fires the PRE-COMMIT trigger.
    5.4 Form Builder fires the PRE-DELETE trigger.
    5.5 Form Builder issues a DELETE statement to delete the row.
    5.6 The database fires the BEFORE DELETE trigger.
    5.7 The database fires the BEFORE DELETE FOR EACH ROW trigger.
    5.8 The database deletes the record.
    5.9 The database fires the AFTER DELETE FOR EACH ROW trigger.
    5.10 The Database AFTER DELETE trigger fires.
    5.11 Form Builder fires the POST-DELETE trigger.
    5.12 Form Builder fires the POST-COMMIT trigger.

    6. 关于记录组
       类似于数据库的表的Form builder的内部结构。有三种类型:
       Query record group 在设计或者运行时创建或者修改。关联一个Select语句。
       Non-query record group 运行时,不关联Select语句。
       Static record group 设计时输入。
       有三种值来源:
       Select语句(Query record group)
       内部子程序填充的数据(query groups and non-query groups)
       设计时输入的数据 (static record groups)
       记录组有如下的内置函数:
    Creating and deleting groups:
    CREATE_GROUP (function)
    CREATE_GROUP_FROM_QUERY (function)
    DELETE_GROUP (procedure)
    Modifying a group's structure:
    ADD_GROUP_COLUMN (function)
    ADD_GROUP_ROW (procedure)
    DELETE_GROUP_ROW (procedure)
    Populating groups:
    POPULATE_GROUP (function)
    POPULATE_GROUP_WITH_QUERY (function)
    SET_GROUP_CHAR_CELL (procedure)
    SET_GROUP_DATE_CELL (procedure)
    SET_GROUP_NUMBER_CELL (procedure)
    Getting cell values:
    GET_GROUP_CHAR_CELL (function)
    GET_GROUP_DATE_CELL (function)
    GET_GROUP_NUMBER_CELL (function)
    Processing rows:
    GET_GROUP_ROW_COUNT (function)
    GET_GROUP_SELECTION_COUNT (function)
    GET_GROUP_SELECTION (function)
    RESET_GROUP_SELECTION (procedure)
    SET_GROUP_SELECTION (procedure)
    UNSET_GROUP_SELECTION (procedure)
    Object ID functions:
    FIND_GROUP (function)
    FIND_COLUMN (function)


    一个使用组记录的例子:
    FUNCTION Is_Value_In_List( the_value     VARCHAR2,
                   the_rg_name   VARCHAR2,
                   the_rg_column VARCHAR2)
    RETURN NUMBER IS
      the_Rowcount   NUMBER;
      rg_id          RecordGroup;
      gc_id          GroupColumn;
      col_val        VARCHAR2(80);
      Exit_Function  Exception;
    BEGIN

      rg_id := Find_Group( the_rg_name );
     
      IF Id_Null(rg_id) THEN
        Message('Record Group '||the_rg_name||' does not exist.');
        RAISE Exit_Function;
      END IF;

      gc_id := Find_Column( the_rg_name||'.'||the_rg_column );
     
      IF Id_Null(gc_id) THEN
        Message('Column '||the_rg_column||' does not exist.');
        RAISE Exit_Function;
      END IF;

      the_Rowcount := Get_Group_Row_Count( rg_id );
     
      FOR j IN 1..the_Rowcount LOOP
        col_val := GET_GROUP_CHAR_CELL( gc_id, j );

        IF UPPER(col_val) = UPPER(the_value) THEN
          RETURN j;
        END IF;
      END LOOP;

      RAISE Exit_Function;
    EXCEPTION
      WHEN Exit_Function THEN
        RETURN 0;
    END;


    7. LOVs
       每个LOV都与特定的记录组关联。LOV是允许操作者察看、滚动和选择存储在记录组中的数据值的界面。   
       有LOV的地方一定要有记录组。
       运行时可以对记录组进行的操作,可以进行:
       modify its structure by adding columns and rows
       populate the group
       modify the query associated with a query group
       add and delete rows
       set and get column values
       mark and unmark rows as "selected"
       创建好query record,通过POPULATE_GROUP填充数据或者如果与LOV关联,LOV显示时也会填充数据。
       创建LOV值列表,基于记录组。可以在LOV属性面板中修改Select状态,移除显示隐藏列,创建列标题,指定LOV返回的ITEM。
       可以通过Select语句指定LOV返回的ITEM。例如:
       SELECT id, name, contact, phone INTO :cust.id, :cust.name :cust.contact, :cust.phone FROM   CUSTOMER; 
       可以设定LOV的属性,是否自动显示,是否验证。如果验证,输入正确值,LOV不显示。
       可以在设计时将ITEM的LOV设置,也可以通过程序来设置,例如:
       Set_Item_Property('emp.empno',LOV_NAME,'lov2');
       IF Get_Item_Property('emp.empno',LIST) = 'lov1' THEN      
       Set_Item_Property('emp.empno',LIST,'lov2');
       END IF;

       也可以通过程序显示LOV。
       LIST_VALUES:如果当前ITEM为文本类型,并且已经有一个LOV关联这个ITEM。
       通常在When-New-Item-Instance或者Key-LISTVAL中使用。
       SHOW_LOV:并不要求ITEM为文本类型。返回BOOLEAN值。例如:dummy := Show_LOV('my_lov',15,10);

       在运行时设置LOV的属性:
       GET_LOV_PROPERTY
       SET_LOV_PROPERTY

    8. Form参数提供一种为Form初始化定义和设定输入参数值
       参数类型为CHAR, NUMBER, DATE。可以在执行内建CALL_FORM, NEW_FORM, OPEN_FORM,  RUN_PRODUCT 方法时调用。参数通过Parameter Lists来传递,有两种类型Text Parameters和Data Parameters。后者通常为记录组传递给RUN_PRODUCT内置子程序。

     

    9. 定义编辑器
       默认、系统、用户三种编辑器。
       默认就是普通的TEXT项目。
       系统编辑器,使用系统的编辑器,通过设置系统的环境变量FORMS60_EDITOR =C:\WINNT\NOTEPAD.EXE
       用户定义的编辑器:在默认编辑器基础上进行一些属性设置。
       通过菜单“编辑-〉编辑”察看。
       或者通过命令:
       Go_Item('cust.comments');
       Edit_TextItem; 或者
       SHOW_EDITOR(editor_name, message_in, x, y, message_out, result);

    10.菜单
       三种菜单,form menus,menu toolbars,popup menus。
       使用默认的菜单,这是Form Builder中内置的组件。在具体的菜单项的属性中,可以指定这个菜单是否出现在工具栏中。主要通过修改menudef.mmb菜单模块。对于一个form而言,在其属性“Menu Module”中设定菜单模块文件的名称就可以。

    11.使用弹出菜单
      可以在很多控件上弹出菜单——canvas,以及除了check/radio/iconic/OLE之外的控件上都可以弹出。只需要在控件属性中设定建立好的弹出菜单,然后当在控件上点击右键的时候,便可以弹出菜单。实现这种机制。

    12.定义对象视觉属性
       定义好视觉属性,在对象的属性中选择设定,可以统一风格。

    13.排列对象
       对于画布上的对象可以通过Arrary(排列)下的命令来控制大小,对齐,成组,排序等功能。

    1. 对象组
       将数据块加入对象组,数据中的项、触发器、关系等不在对象组中显示。
       只有顶级对象才能包含在对象组中。所以不能将items, item-level triggers, block-level triggers, relations不能包含在对象组中。
       一个组中的对象必须在同一个模块中定义。
       对象组不能包含其他对象组。
       组中的对象别删除时,组也被删除。
       删除组时,同时删除其中的对象。
       对象组中并不拷贝对象,而只是保留指向对象的指针(子类化的组除外)。
    2. 对象库
       将对象拖入对象库,则创建了一个新版本的对象。
       将这个对象设置为SmartClass,这样新建一个对象时,右键点击这个对象,刚才建立的SmartClass会出现在菜单中,选择应用。
    3. 属性类
       可以在form和menu中定义。
       如果一个对象基于属性类,如果对象的属性在属性类中存在,可以继承,否则忽略。
       当删除属性的时候,从属性类继承的属性设置为默认值。
       属性类只能从其它属性类继承。
       属性类与视觉属性类似,但是也有不同,例如:视觉属性只能定义视觉效果的属性,可以在运行时更改视觉属性,视觉属性如果与属性类的属性冲突的话,视觉属性优先。
    4.设定List控件
       当时用List控件与记录组关联的时候,记录组必须只能是两列,一列是名称,一列是值。例如:
       SELECT name,TO_CHAR(id) id FROM test02
    5.利用AUTO_HINT属性保存状态
       可以使用AUTO_HINT等属性保存与Item相关的信息。
       例如:将BOOLEAN保存在其中。
       Get_Item_Property('BTN_SAVE',AUTO_HINT);
       Set_Item_Property('BTN_SAVE',AUTO_HINT,PROPERTY_TRUE);
    展开全文
  • 下载以后,通过"站点管理"-->"新建站点".输入IP,用户名,密码.然后连接即可. 当然也可用FTP工具.直接在IE浏览器地址栏输入ftp://www.域名/然后输入用户名和密码.同样可以上传.随时更新文件! 第三章 开发环境的说明与...
  • const Name表示语音命令的标识,参数Caption表示该命令在输入命令窗口的显示标题, 参数Voice表示该命令对应的语句。当用户通过麦克风向动画人物发出语音命令时,触发 Agent的Command事件,因此我们可以另外编写...
  • FMLDATA的源码

    2014-06-02 15:57:42
    第二个参数也是个数据,含义同"[email=FMLDATA@WRITE]FMLDATA@WRITE"(X,N[/email])"的N,表示要读取哪个序列的数值。 例5、读入当前股票的某个外部序列数据 公式为V1: "[email=FMLDATA@READ]FMLDATA@READ"(0,4[/...
  • ASP.NET的网页代码模型及生命周期

    热门讨论 2009-07-28 14:22:11
    创建一个单文件页模型,在【文件】按钮选择【新建文件】选项,在弹出对话框选择【Web窗体】或在右击当前项目,在下拉菜单选择【添加新建项】选项即可创建一个.aspx页面,如图4-2所示。 图4-2 创建单文件页...
  • 首先说以下.xlsm文件和.xlsx文件的区别: .xlsx文件只能存储数据,不能存储对数据进行处理的VB代码,而.xlsm文件既可以存储数据,又可以存储代码。...图红圈1表示当前工作簿的第一个工作表,系统命名为Sh...

    首先说一下.xlsm文件和.xlsx文件的区别:

           .xlsx文件只能存储数据,不能存储对数据进行处理的VB代码,而.xlsm文件既可以存储数据,又可以存储代码。

    新建一个.xlsm文件(打开.xlsx源数据文件并另存为.xlsm也可以),输入数据源(源数据和VB代码可以从以下链接下载):

                        原始数据以及 VBA 代码

    打开.xlsm文件后在当前Sheet的名字上右击,选“View Code”(或者直接快捷键Alt+F11打开VB编辑窗口),出现下图:

    图中红圈1表示当前工作簿的第一个工作表,系统命名为Sheet,我们重命名为RAW_DATA。写VB代码的时候通过这两个名称都可以引用到相应工作表,不过代码稍微会有一点不一样,我的代码使用的是系统命名,即Sheet1。

    双击图中的Sheet1,Sheet2,Sheet3以及红圈2中的Module1都会出现一个代码编辑区域,我的代码是写在Module1中的。(个人猜想在Sheet1中写的代码只能控制Sheet1中的对象,当要调用其他工资表数据时可能会有约束;而Module1是对整个工作簿的对象都有控制权,因为我的代码不是太复杂,但每个工资表都要用到,为了方便,我的代码就写在了Module1中)

    图中红圈3中三个按钮分别是运行,暂停,停止的作用,当代码写完后按绿色三角形运行,Debug时按蓝色方框结束Debug模式。

    接下来就没甚好说的了,Let me show you my code...

    (VB代码的注释用英文单引号“'”开始,而且只能单行注释。View-Toolbars-Edit工具栏里有一个注释代码块的按钮,很方便)

    以下代码段是针对代码的功能进行注释的。相对小白的来说,首先要理解每行代码的意思才能理解整个程序。(其实是为了防止我自己健忘)

    ' 由'开始的行是注释,直到本行结束
    ' Range()	--用于指定某一个或者某一些单元格区域
    ' Rows()	--指定某一行或者多行
    ' Columns()	--指定某一列或者多列
    
    Sub MyCode()
        
        Sheet2.UsedRange.ClearContents      	' 删除Sheet2工作表的所有单元格内容
        
        If Sheet3.ChartObjects.Count > 0 Then   	' 删除Sheet3工作表的所有图表。当对一个没有图表的工作表进行删除操作时会报错,
            Sheet3.ChartObjects.Delete          	' 所有要先进行判断,如果图表数大于0才执行删除操作
        End If
        
        Sheet1.Columns(3).Copy Destination:=Sheet2.Columns(1)   	' 将Sheet1第3列的数据拷贝到Sheet2的第一列
        Sheet1.Columns(4).Copy Destination:=Sheet2.Columns(3)
        Sheet1.Columns(5).Copy Destination:=Sheet2.Columns(6)
        Sheet1.Columns(6).Copy Destination:=Sheet2.Columns(4)
        
        Sheet2.Rows(1).Delete					' 删除Sheet2的第一行
        Sheet2.Range("A1") = "       TIME       "			' 设置Sheet2的A1单元格内容,注意这里有多余的空格
        Sheet2.Range("B1") = " Delta time(min) "
        Sheet2.Range("C1") = " Temp setting(deg) "
        Sheet2.Range("D1") = " Temp test(deg) "
        Sheet2.Range("E1") = " PCB Output(V) "
        Sheet2.Range("F1") = " MCU Output(12bit DAC) "
        Sheet2.Range("A1:F1").Font.Bold = True			' 把Sheet2的A1:F1区域字体加粗
        Sheet2.Range("A1:F1").Columns.AutoFit			
    	' 设置Sheet2的A到F列根据其第一行的内容而自动调节单元格宽度,上面设置内容时多余的空格是为了占位,使整列数据都可以完整显示
        'Sheet2.Columns("A:F").Select          			' 选择Sheet2的A到F列
        'Selection.HorizontalAlignment = Excel.xlCenter		' 对选择的区域设置为居中对齐
        Sheet2.Columns("A:F").HorizontalAlignment = Excel.xlCenter  ' 这一行和上面两行的结果一样,可相互替换
        'Sheet2.Columns("E").Select					' 选择Sheet2的E列
        'Selection.NumberFormatLocal = "0.00"			' 对选择的单元格区域进行格式化。0.00表示数字保留两位小数,0.00%表示以百分制表示。
        Sheet2.Columns("E").NumberFormatLocal = "0.00"    		' 这一行和上面两行的结果一样,可相互替换
        Sheet2.Columns("B").NumberFormatLocal = "0"			' 设置Sheet2的B列数学不显示小数部分
        
        countRows = Sheet2.UsedRange.Rows.Count            		' 计算Sheet2工作表所有数据的总行数
        
        Sheet2.Range("E2").Formula = "=IF(F2>824,(F2-824)/(4095-824)*5,(F2-824)/824*1.6)"		' 在Sheet2的E2单元格写入公式
        Sheet2.Range("E2:E" & countRows).FillDown			' 对E2单元格的内容向下填充到最后一行。countRows是前面定义的记录总行数的变量
        
        fragState = "FindStandbyStart"			' 设置变量并赋值
        startRows = 2
        endRows = 0
        countLoop = 0
        
        For i = 2 To countRows				' for循环,从2循环到countRows(表示总行数的变量),即从第2行遍历到最后一行
    
    	If i = countRows Then			
                endRows = countRows		
                fragState = "DrawChart"	
            End If
    
            If fragState = "FindStandbyStart" Then		' 判断是否相等
                If Sheet2.Range("C" & i) = 25 Then          ' 判断Sheet2当前行(i)的C列是否为25
                    fragState = "FindLoopEnd"		' 变量值改变(状态改变)
                End If					' 判断语句结束
            ElseIf fragState = "FindLoopEnd" Then		' Else if分支
                If Sheet2.Range("C" & i) = 95 Then          ' 判断Sheet2当前行(i)的C列是否为95
                    endRows = i - 1
                    fragState = "DrawChart"
                    'MsgBox endRows				' 调试的时候用了,就是把endRows的值打印出来看看是否正确
                End If
    	End If
            If fragState = "DrawChart" Then         	
                'MsgBox startRows
                'MsgBox endRows
                Sheet2.Range("B" & startRows).Formula = "=(A" & startRows & "-$A$" & startRows & ")*24*60"	
    		' 为了便于理解,这里可以把startRows当成2,即Sheet2.Range("B2").Formula = "=(A2-$A$2)*24*60",但实际上startRows不是固定的。
    		' 这样应该很容易理解了,就是在B2中写了个公式而已。注意这里的处理方式,变量是不需要写在双引号里的,然后用&连接起来。
                Sheet2.Range("B" & startRows, "B" & endRows).FillDown	' 对Sheet2的B列 从startRows行到endRows行 按startRow单元格的内容 进行填充
                
                x = Sheet3.Range("A" & countLoop * 15 + 1, "A" & countLoop * 15 + 15).Left	' 设置图表容器的左边缘
                y = Sheet3.Range("A" & countLoop * 15 + 1, "S" & countLoop * 15 + 1).Top	' 设置图表容器的右边缘
    	    w = Sheet3.Range("A1:S1").Width		' 设置图表容器的宽度为A列到S列
                h = Sheet3.Range("A1:A15").Height - 1	' 设置图表容器的高度为15行
    
                Set Ch1 = Sheet3.ChartObjects.Add(x, y, w, h)     	' Ch1相对于一个图表容器,后面要画的折线图的所有对象都在这个容器内,这里是设置容器大小
                
                If countLoop < 10 Then				' 设置图表容器的名字,为了控制名字的长度以致所有加了这个判断
                    Ch1.Name = "Result-0" & countLoop + 1		' 容器名字为格式为“Result-xx”
                Else
                    Ch1.Name = "Result-" & countLoop + 1
                End If
    
                With Ch1.Chart				' With是一个代码块,由End With结束。表示这个with块中的所有代码都是对Ch1.Chart的属性进行设置。
                    .HasTitle = True			' 如果没有With块,这句完全能用"Ch1.Chart.HasTitle = True"代替
                    .ChartTitle.Text = Ch1.Name		' 把图表容器的名字作为图表的标题
                    .ChartTitle.Left = 415			' 设置图表标题的位置
                    .ChartTitle.Top = -5
    
                    .PlotArea.Width = 885       		' 设置图表容器中 画图区域 相对于图表容器的位置
                    .PlotArea.Left = 10			' 图表容器中除了画图区域,还有标题,图列,以及坐标轴名字等其他对象
                    .PlotArea.Top = 15			' 设置合适的 画图区域,是为了其他对象更好的显示
                    .PlotArea.Height = 175
    
                    .Legend.Position = xlLegendPositionTop	' 将图例放在画图区域的上方。图例就是在一个有多个折线的图中,对每个折线含义的说明
                    .Legend.Left = 275			' 因为按上面的方法设置的图例位置稍微有点不太理想,所有这里对图例位置进行微调。
                    .Legend.Top = 20			' 注意这里的微调值是相对于图表容器的左上角,而不是 画图区域
                    .ChartType = xlLine			' 设置图表类型为折线图
    
                    .SeriesCollection.NewSeries		' 为折线图添加数据
                    .SeriesCollection(1).Values = Sheet2.Range("C" & startRows, "C" & endRows)	' 选择数据区域
                    .SeriesCollection(1).XValues = Sheet2.Range("B" & startRows, "B" & endRows)	' 选择X轴数据区域
                    .SeriesCollection(1).Name = Sheet2.Range("C1")					' 设置这一系列数据的名称,即图例的名称
                    .SeriesCollection(1).AxisGroup = 1	' 这里是指明这些数据用Y主坐标轴(图表中可以有左右两个表示不同意义的Y轴,左边是1,右边是2)
    
                    .SeriesCollection.NewSeries		' 添加新数据
                    .SeriesCollection(2).Values = Sheet2.Range("D" & startRows, "D" & endRows)
                    .SeriesCollection(2).XValues = Sheet2.Range("B" & startRows, "B" & endRows)
                    .SeriesCollection(2).Name = Sheet2.Range("D1")
                    .SeriesCollection(2).AxisGroup = 1
    
                    .SeriesCollection.NewSeries
                    .SeriesCollection(3).Values = Sheet2.Range("E" & startRows, "E" & endRows)
                    .SeriesCollection(3).XValues = Sheet2.Range("B" & startRows, "B" & endRows)
                    .SeriesCollection(3).Name = Sheet2.Range("E1")
                    .SeriesCollection(3).AxisGroup = 2	' 这一系列数据用的是Y副轴(右边)
                    
                    With .Axes(xlValue, xlPrimary)		' 对Y主坐标轴的属性进行设置
                        .MinimumScale = 0			' 设置Y主坐标轴的最小值
                        .MaximumScale = 115			' 最大值
                        .HasTitle = True			' 显示这个坐标轴的标题
                        .AxisTitle.Text = "Temp(Degree)"	' 设置标题为"Temp(Degree)"
                    End With
                    
                    With .Axes(xlValue, xlSecondary)	' 对Y副坐标轴的属性进行设置
                        .MinimumScale = -2
                        .MaximumScale = 12
                        .HasTitle = True
                        .AxisTitle.Text = "Voltage(V)"
                    End With
                    
                    With .Axes(xlCategory)			' 对X坐标轴的属性进行设置
                        .HasTitle = True
                        .AxisTitle.Text = "Time(min)"
                        .TickLabelSpacing = 200		' X轴坐标刻度太密了,设置每200个数据显示一个刻度。(设置范围是0-255)
                    End With
                    
                End With		' 注意,每一个With代码块都由With开始,End With结束
    
                countLoop = countLoop + 1
                startRows = endRows + 1
                fragState = "FindStandbyStart"
            End If
        Next
    End Sub
    

    现在对整个程序的功能进行一个简单的说明:原始数据是对一个产品进行工作寿命进行测试而得到的,所以数据总是在一定时间后又从新开始,但是这个一定时间稍微有点差别,这就导致了每次运行产生的数据长度是不太一样的。那如何区分每次运行产生的数据呢?请看Sheet2(DATA)的C列,C列每一次运行都是以95->50->72->95->50->72->...->25的方式结束的,但是每个值都会重复很多次。所以我就从C列开始查找,找到第一个95,表示第一次运行开始了,把行号startRows记录下来,然后接着找25,找的25后再向后查找95,这个95就表示第二次运行开始了,把这个行号减一就得到第一次运行的结束行号了。

    既然已经知道了数据范围,就可以根据数据画图了。

    下面的代码和上面一样,只是这一份的注释主要偏重于逻辑方面:

    ' 以'开始的为注释,一直到本行结束有效
    
    Sub MyCode()
        
        Sheet2.UsedRange.ClearContents      	' delete all the data of Sheet2
        
        If Sheet3.ChartObjects.Count > 0 Then   	' there is error if delete the sheet without chart
            Sheet3.ChartObjects.Delete          	' delete all the chart
        End If
        
        Sheet1.Columns(3).Copy Destination:=Sheet2.Columns(1)   ' 数据拷贝
        Sheet1.Columns(4).Copy Destination:=Sheet2.Columns(3)
        Sheet1.Columns(5).Copy Destination:=Sheet2.Columns(6)
        Sheet1.Columns(6).Copy Destination:=Sheet2.Columns(4)
        
        Sheet2.Rows(1).Delete
        Sheet2.Range("A1") = "       TIME       "		' 每一列数据的名称
        Sheet2.Range("B1") = " Delta time(min) "
        Sheet2.Range("C1") = " Temp setting(deg) "
        Sheet2.Range("D1") = " Temp test(deg) "
        Sheet2.Range("E1") = " PCB Output(V) "
        Sheet2.Range("F1") = " MCU Output(12bit DAC) "
        Sheet2.Range("A1:F1").Font.Bold = True
        Sheet2.Range("A1:F1").Columns.AutoFit
        'Sheet2.Columns("A:F").Select          		' select columns A to F
        'Selection.HorizontalAlignment = Excel.xlCenter
        Sheet2.Columns("A:F").HorizontalAlignment = Excel.xlCenter    	' same with above 2 rows
        'Sheet2.Columns("E").Select
        'Selection.NumberFormatLocal = "0.00"
        Sheet2.Columns("E").NumberFormatLocal = "0.00"    	' same with above 2 rows
        Sheet2.Columns("B").NumberFormatLocal = "0"
        
        countRows = Sheet2.UsedRange.Rows.Count            	' get the number of rows
        
        Sheet2.Range("E2").Formula = "=IF(F2>824,(F2-824)/(4095-824)*5,(F2-824)/824*1.6)"	' 填充公式,这里是把12位的ADC采样数据转换成电压值
        Sheet2.Range("E2:E" & countRows).FillDown						' 把上面填充的公式下拉到最后一行
        
        fragState = "FindStandbyStart"
        startRows = 2			' 原始数据的第一次循环一定从第二行开始,所以不用找了
        endRows = 0
        countLoop = 0			' 运行次数计数,主要是为了画图的时候决定图表位置,不能所有的图表都重叠画在一起啊
        
        For i = 2 To countRows
        
            If i = countRows Then		' 因为程序可能在任意地方停止,如果没有这个判断,就只能按部就班每次找到25后面的第一个95的前一行才能得到endRows	
                endRows = countRows		' 但如果数据就停在了25呢??那fragState的状态就永远到不了"DrawChart",也就永远无法画出最后一个图了
                fragState = "DrawChart"	' 所有这个If的作用只是为了画最后一个不完整循环的图形。
            End If
            
            If fragState = "FindStandbyStart" Then		' 因为前面已经记录了第一个95的位置,即startRows
                If Sheet2.Range("C" & i) = 25 Then         	' 所以这里是在找25了
                    fragState = "FindLoopEnd"		' 如果找到了就进入下一个状态,即找下一个95
                End If
            ElseIf fragState = "FindLoopEnd" Then
                If Sheet2.Range("C" & i) = 95 Then         	' 如果找到了下一个95,即下一个循环的开始
                    endRows = i - 1				' 则上一行就是上次循环的结束,即endRows
                    fragState = "DrawChart"			' 找到了startRows和endRows,制图的数据源就确定了,也就可以开始画图了
                    'MsgBox endRows
                End If
    	End If
            If fragState = "DrawChart" Then         	' 开始画图
                'MsgBox startRows
                'MsgBox endRows
                Sheet2.Range("B" & startRows).Formula = "=(A" & startRows & "-$A$" & startRows & ")*24*60"	' 填充公式并下拉
                Sheet2.Range("B" & startRows, "B" & endRows).FillDown					' 这里是计算每一行数据距循环开始的时间,单位为分钟
                
                x = Sheet3.Range("A" & countLoop * 15 + 1, "A" & countLoop * 15 + 15).Left
                y = Sheet3.Range("A" & countLoop * 15 + 1, "S" & countLoop * 15 + 1).Top
                w = Sheet3.Range("A1:S1").Width
                h = Sheet3.Range("A1:A15").Height - 1
                Set Ch1 = Sheet3.ChartObjects.Add(x, y, w, h)     	' 定义图表容器的大小
                
                If countLoop < 10 Then				' 给图表容器命名,并保证名字长度一致	
                    Ch1.Name = "Result-0" & countLoop + 1
                Else
                    Ch1.Name = "Result-" & countLoop + 1
                End If
    
                With Ch1.Chart
                    .HasTitle = True
                    .ChartTitle.Text = Ch1.Name
                    .ChartTitle.Left = 415
                    .ChartTitle.Top = -5
    
                    .PlotArea.Width = 885       			' 设置作图区大小
                    .PlotArea.Left = 10
                    .PlotArea.Top = 15
                    .PlotArea.Height = 175
    
                    .Legend.Position = xlLegendPositionTop		' 这三行是把图例放置在任意位置的法宝。第一行是为了让图例单行显示
                    .Legend.Left = 275				' xlLegendPositionRight可以让图例多行显示,然后再利用这两行调整位置
                    .Legend.Top = 20
    
                    .ChartType = xlLine				' 折线图
                    .SeriesCollection.NewSeries			' 添加数据
                    .SeriesCollection(1).Values = Sheet2.Range("C" & startRows, "C" & endRows)
                    .SeriesCollection(1).XValues = Sheet2.Range("B" & startRows, "B" & endRows)
                    .SeriesCollection(1).Name = Sheet2.Range("C1")	' 设置图例名称
                    .SeriesCollection(1).AxisGroup = 1		' 设置参考坐标
                    .SeriesCollection.NewSeries
                    .SeriesCollection(2).Values = Sheet2.Range("D" & startRows, "D" & endRows)
                    .SeriesCollection(2).XValues = Sheet2.Range("B" & startRows, "B" & endRows)
                    .SeriesCollection(2).Name = Sheet2.Range("D1")
                    .SeriesCollection(2).AxisGroup = 1
                    .SeriesCollection.NewSeries
                    .SeriesCollection(3).Values = Sheet2.Range("E" & startRows, "E" & endRows)
                    .SeriesCollection(3).XValues = Sheet2.Range("B" & startRows, "B" & endRows)
                    .SeriesCollection(3).Name = Sheet2.Range("E1")
                    .SeriesCollection(3).AxisGroup = 2
                    
                    With .Axes(xlValue, xlPrimary)
                        .MinimumScale = 0
                        .MaximumScale = 115
                        .HasTitle = True
                        .AxisTitle.Text = "Temp(Degree)"
                    End With
                    
                    With .Axes(xlValue, xlSecondary)
                        .MinimumScale = -2
                        .MaximumScale = 12
                        .HasTitle = True
                        .AxisTitle.Text = "Voltage(V)"
                    End With
                    
                    With .Axes(xlCategory)
                        .HasTitle = True
                        .AxisTitle.Text = "Time(min)"
                        .TickLabelSpacing = 200
                    End With
                    
                End With
    
                countLoop = countLoop + 1		' 循环次数递增,表示一个循环的图表已经制作完成,将开始下一个循环图表的制作
                startRows = endRows + 1             ' 记录好下一次循环开始位置,也可以写成startRows = i
                fragState = "FindStandbyStart"	' 进入开始寻找下一个25的状态
            End If
        Next					' for循环的结束
    End Sub						' 函数结尾
    

    OVER

     

     

     

    展开全文
  • QTP操作xml文件方法

    2012-12-24 11:24:53
    搜索1: 目前,企业对XML的应用越来越广泛,作为自动化测试的测试工程师,也应该掌握XML的读写操作。  以下我使用XML DOM技术演示一个例子,用以读取XML指定节点的节点内容值。... 首先,新建一个vb...
    搜索1:
    目前,企业中对XML的应用越来越广泛,作为自动化测试的测试工程师,也应该掌握XML的读写操作。
      以下我使用XML DOM技术演示一个例子,用以读取XML指定节点的节点内容值。
      读取函数原型 GetXml strXmlPath,nodeName
      这个函数的第一个参数表示xml文件所在路径,第二个参数表示希望获取到的xml节点名,请结合下列例子看
      首先,新建一个vbs文件(取个名字叫readXml.vbs),输入代码:
    Dim strXML
      GetXml "c:search.xml","TestResult" '这个函数的第一个参数表示xml文件所在路径,第二个参数表示希望获取到的xml节点名,请结合下列例子看
    MsgBox strXML
    Function GetXml (ByVal strXmlFilePath,ByVal xmlNodeName)
    Dim xmlDoc,xmlRoot
    Set xmlDoc = CreateObject("Microsoft.XMLDOM") '创建XML DOM对象
    xmlDoc.async = False '控制加载模式为同步模式(xml树加载完毕后再执行后续代码)
    xmlDoc.load strXmlFilePath '载入xml文件
    If xmlDoc.parseError.errorCode <> 0 Then
    MsgBox "XML文件格式不对,原因是:" & Chr(13) & xmlDoc.parseError.reason
    Exit Function
    End If
    Set xmlRoot = xmlDoc.documentElement
    xmlRecursion xmlRoot,xmlNodeName '调用xml递归函数传入指定的根和节点名
    GetXml = True 'xmlRecursion (xmlRoot)
    End Function
    Function xmlRecursion(byval xmlNode,byval strNodeName)
    If xmlNode.nodeName = strNodeName And xmlNode.hasChildNodes Then
    If xmlNode.childNodes.item(0).nodeName = "#text" Then
    strXML = strXML & xmlNode.nodeName & ":" & xmlNode.childNodes.item(0).nodeValue & Chr(13)
    End If
    End If
    If xmlNode.hasChildNodes Then
    For Each childNodeItem In xmlNode.ChildNodes
    If childNodeItem.hasChildNodes Then
    xmlRecursion childNodeItem,strNodeName
    End If
    Next
    End If
    End Function

    问题:
      haschildnodes()这个方法好奇怪,明明已经没有子节点了,却仍然返回true,
      比如<TestResult>1</TestResult>这个节点,它的childNodes.item(0).nodeName竟然是“#text”,但是根据例子来看TestResult已经没有子节点了阿
    回答:
      因为在xml有一个特殊的“子节点”——文本节点。比如 <TestResult>100</TestResult>
      这个节点TestResult下并不是没有子节点,而是有一个文本节点,这个节点的nodeName就是“#text”,而nodeValue是100.如果是 <TestResult/> 这种节点的话,那么用hasChildNodes则返回False
    遍历xml的代码:
    Option Explicit
    Dim xmlDoc,myErr,strXML
    Set xmlDoc = CreateObject("Microsoft.XMLDOM")
    xmlDoc.async = False
    xmlDoc.load "c:calc1.xml"
    If xmlDoc.parseError.errorCode <> 0 Then
    Set myErr = xmlDoc.parseError
    MsgBox("XML Loads Failed. " & myErr.reason)
    Else
    Set rootNode = xmlDoc.documentElement
    Call rTravel(rootNode)
    MsgBox strXML
    End If
    Sub rTravel (rNode)
    Dim blnTwo,intTestCase,
    blnTwo = False
    iLen = rNode.childNodes.length
    If iLen > 0 Then
    For i = 0 To rNode.childNodes.length -1
    Set child = rNode.childNodes.item(i)
    Call rTravel(child)
    childtext = child.nodeValue
    strXML = strXML & childtext & chr(13)
    Next
    Else
    Exit Sub
    End If
    End Sub

    方法二:
    Option Explicit
    Dim xmlDoc,myErr,strXML
    Set xmlDoc = CreateObject("Microsoft.XMLDOM")
    xmlDoc.async = False
    xmlDoc.load "c:calc1.xml"
    If xmlDoc.parseError.errorCode <> 0 Then
    Set myErr = xmlDoc.parseError
    MsgBox("XML Loads Failed. " & myErr.reason)
    Else
    Set rootNode = xmlDoc.documentElement
    Call rTravel(rootNode)
    MsgBox strXML
    End If
    Sub rTravel (rNode)
    Dim blnTwo,intTestCase,
    blnTwo = False
    iLen = rNode.childNodes.length
    If iLen > 0 Then
    For i = 0 To rNode.childNodes.length -1
    Set child = rNode.childNodes.item(i)
    Call rTravel(child)
    childtext = child.nodeValue
    strXML = strXML & childtext & chr(13)
    Next
    Else
    Exit Sub
    End If
    End Sub


    搜索2:
    Dim filepath,xmlDoc,myErr,strXML,rootNode
    filepath="c:\12.xml"
    Set xmlDoc=CreateObject("Microsoft.XMLDOM")'创建一个xml对象
    xmlDoc.async=False
    xmlDoc.load filepath '加载xml文件
    If xmlDoc.parseError.errorCode<>0 Then'返回错误信息
    Set myErr=xmlDoc.parseError
    MsgBox("XML Loads Faild."&myErr.reason)
    Else
    Set rootNode=xmlDoc.documentElement'设置根节点
    Call rTravel(rootNode)'遍历节点
    msgBox strXML
    End If

    Sub rTravel(rNode)
    Dim blnTwo,intTestCase,iLen,i,child
    blnTwo=False
    iLen=rNode.childNodes.length'返回节点的子节点数目
    If iLen>0 Then
    For i=0 to rNode.childNodes.length-1
    Set child=rNode.childNodes.item(i)'获取当前节点对象
    Call rTravel(child)
    childtext=child.nodeValue'获取节点的值
    strXML=strXML & childtext & chr(13)'chr(13)回车符
    Next
    else
    Exit Sub
    End If
    End Sub


    另附搜索到的qtp_xml学习总结
    展开全文
  • 28.SQLSERVER服务器,给定表 table1 有两个字段 ID、LastUpdateDate,ID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号 答:Select ID FROM table1 Where ...
  • arcgis工具

    2012-10-22 22:37:31
    arcgis工具总结 ...这种方法选择某一图层包含另一图层要素的要素。这种方法与完全包含(Completely contain)方法的区别在于:要素间的边界可以接触。例如,使用包含(Contain)方法,即使湖泊的边界和包含该...
  • IDE 1号接口检测到光驱,IDE 2号接口检测到希捷硬盘为80GB,其它为NONE表示检测没有设备连接到接口上。 Warning!! Now system is in safe mode. Please re-setting CPU frequency in CMOS setup. 警告:现在系统处在...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
  • “在库的对应命令名”以@开头表示以cdecl方式调用,否则表示以默认的stdcall方式调用;各参数声明要与其定义一致。  请参考易语言安装目录内的例程:samples\静态编译\调用LIB和OBJ 1. 静态编译方面的改进和...
  • java源码包2

    千次下载 热门讨论 2013-04-20 11:28:17
     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
  • java源码包3

    千次下载 热门讨论 2013-04-20 11:30:13
     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
  • Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...
  • Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...
  • Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

空空如也

空空如也

1 2
收藏数 23
精华内容 9
关键字:

vb中表示新建的