精华内容
下载资源
问答
  • Vue.js菜单三级以至于多级联动

    千次阅读 2018-05-08 16:59:51
    公司项目使用Vue.js 前端初学Vue.js 然后给我的静态页面刚开始都能点的动但是接入接口进行数据绑定之后 就点不动了 一番了解之后 才知道是他绑定的是Jquery的click事件在Vue中会因为渲染问题导致失效 常见的解决方法...

    公司项目使用Vue.js 前端初学Vue.js 然后给我的静态页面刚开始都能点的动

    但是接入接口进行数据绑定之后 就点不动了 一番了解之后 才知道是他绑定的是Jquery的click事件

    在Vue中会因为渲染问题导致失效 常见的解决方法通过setTimeout来 但这很不Vue

    于是

       首先定义三个变量

    openOLM:0,
    openTLM:0,
    openSLM:0,

    分别是一级二级三级菜单的索引

    然后分别

      :style="{display:(m1_Index==openOLM)?'':'none'}"

    :style="{display:(m2_Index==openTLM)?'':'none'}"
    :style="{display:(m3_Index==openSLM)?'':'none'}"
    
    





    这是加在菜单对应的Html标签上控制菜单的显示 

    然后分别加上点击事件

    @click="openOLM=(m1_Index==openOLM?null:m1_Index),openTLM=null,openSLM=null"

    @click="openTLM=(m2_Index==openTLM?null:m2_Index)
    @click="openSLM=(openSLM==m3_Index?null:m3_Index)
    这样就通过索引控制 菜单的显示以及打开 然后通过点击菜单 修改索引  修改菜单的展开与否

    写不下去了

    有什么问题直接联系q 451922429吧


    展开全文
  • C语言结构体(struct)常见使用方法

    万次阅读 多人点赞 2014-04-14 01:51:57
    基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。 (因为C++和C有共通之处,但是在...

    注意:盗版是不会得到修正和更新的!

     

    今天复习一下struct,顺便挖掘一下以前没注意的小细节:

    基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。具体一点说,结构体是让一些很散的数据变得很整,不管是网络传输,还是函数传参,还是为了便于你肉眼管理。

    一个函数,你想传入一个参数void func(),就需要改一下函数定义,加一个数据类型和数据名void func(int i);又想加一个参数,又改一遍void func(int i,double b);如此往复。但是用一个结构体(或者类对象)传入,这个函数定义就可以不改动了,只改结构体就好了,比如一个游戏,你的人物属性有成百上千,你只需要修改你的类与结构体成员就好了。

     

    (因为C++和C有共通之处,但是在结构体上的某些机制又有所不同,所以后边提了一下C++得东西,不喜欢可以略过,但是2021年了,用纯C的人估计要消失了吧,尤其新人)

     

    结构体声明与定义:

     

    第一种:只有结构体定义

    struct stuff{
            char job[20];
            int age;
            float height;
    };

     

    第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义

    //直接带变量名Huqinwei
    struct stuff{
            char job[20];
            int age;
            float height;
    }Huqinwei;

    也许初期看不习惯容易困惑,其实这就相当于两步合并一步:先定义结构体stuff,再定义变量Huqinwei

    struct stuff{
            char job[20];
            int age;
            float height;
    };
    struct stuff Huqinwei;
    

     

    第三种:如果该结构体你只用一个变量Huqinwei,而不再需要用

    struct stuff yourname;

    去定义第二个变量。

    那么,附加变量初始化的结构体定义还可进一步简化出第三种

    把结构体名称去掉,用匿名结构体直接定义一个结构体对象(习惯用对象这词了,大家都要习惯,没纯C了),这样更简洁,不过也不能定义其他同类型结构体变量了——除非用typeof再逆向找到这个类型。

    struct{
            char job[20];
            int age;
            float height;
    }Huqinwei;

    第三种附加:使用typeof重新利用HU的结构体定义HU3

    并且定义指针ptr1,ptr2

    #include <stdio.h>
    
    struct
    {
            char a;
            short b;
            int c;
    }HU;
    
    struct
    {
            char a;
            short b;
            int c;
    }HU2;
    
    int main(){
    
            printf("%ld\n",sizeof(HU));
    
            typeof(HU) HU3;
            printf("%ld\n",sizeof(HU3));
            printf("%ld\n",sizeof(HU2));
            typeof(HU) *ptr1 = &HU;
            typeof(HU) *ptr2 = &HU3;
            ptr2->b = 444;
            printf("%d\n",ptr2->b);
            ptr1 = ptr2;
            printf("%d\n",ptr1->b);
    
    
    }
    

    同样的写法,再定义一个结构体成员HU2,他们的“类型”不同,因为如果类型相同,肯定会报错了,实际并没有报。

    不过内存操作角度,HU2和HU应该没有任何区别,也可以用指针强行更改,前提是确认安全,比如没有不同文件不同平台对齐不兼容这种问题,所以C很万能,也很危险

     

    结构体变量及其内部成员变量的定义及访问:

    绕口吧?要分清结构体变量和结构体内部成员变量的概念。

     

    就像刚才的第二种提到的,结构体变量的声明可以用:

    struct stuff yourname;

    其成员变量的定义可以随声明进行:

       struct stuff Huqinwei = {"manager",30,185};
    

    也可以考虑结构体之间的“赋值”(拷贝构造):

            struct stuff faker = Huqinwei;
    //或    struct stuff faker2;
    //      faker2 = faker;
    打印,可见结构体的每一个成员变量一模一样
    

    如果不使用上边两种方法,那么成员数组的操作会稍微麻烦(用for循环可能好点)

            Huqinwei.job[0] = 'M';
            Huqinwei.job[1] = 'a';
            Huqinwei.age = 27;
            Huqinwei.height = 185;
    

    结构体成员变量的访问除了可以借助符号".",还可以用"->"访问(下边会提)。

     

    引用(C++)、指针和数组:

    首先是引用和指针:

    int main()
    {
            struct stuff Huqinwei;
    
            struct stuff &ref = Huqinwei;
            ref.age = 100;
            printf("Huqinwei.age is %d\n",Huqinwei.age);
            printf("ref.age is %d\n",ref.age);
    
            struct stuff *ptr = &Huqinwei;
            ptr->age = 200;
            printf("Huqinwei.age is %d\n",Huqinwei.age);
            printf("ptr->age is %d\n",ptr->age);
    //既然都写了,把指针引用也加上吧
            struct stuff *&refToPtr = ptr;
            refToPtr->age = 300;
            printf("Huqinwei.age is %d\n",Huqinwei.age);
            printf("refToPtr->age is %d\n",refToPtr->age);
    
    
    }
    

     

    更正:之前给引用的初始化语句写错了,而且没注明引用是纯C中没有的东西(在这么个以C为幌子的博客中)。

    引用是C++特有的一个机制,必须靠编译器支撑,至于引用转换到C中本质是什么,我有个帖子写过
     

     

    结构体也不能免俗,必须有数组:

    struct test{
            int a[3];
            int b;
    };
    //对于数组和变量同时存在的情况,有如下定义方法:
            struct test student[3] =      {{{66,77,55},0},
                                            {{44,65,33},0},
                                            {{46,99,77},0}};
    //特别的,可以简化成:
            struct test student[3] =       {{66,77,55,0},
                                            {44,65,33,0},
                                            {46,99,77,0}};
    

     

    变长结构体

    可以变长的数组

    #include <stdio.h>
    #include <malloc.h>
    #include <string.h>
    typedef struct changeable{
            int iCnt;
            char pc[0];
    }schangeable;
    
    main(){
            printf("size of struct changeable : %d\n",sizeof(schangeable));
    
            schangeable *pchangeable = (schangeable *)malloc(sizeof(schangeable) + 10*sizeof(char));
            printf("size of pchangeable : %d\n",sizeof(pchangeable));
    
            schangeable *pchangeable2 = (schangeable *)malloc(sizeof(schangeable) + 20*sizeof(char));
            pchangeable2->iCnt = 20;
            printf("pchangeable2->iCnt : %d\n",pchangeable2->iCnt);
            strncpy(pchangeable2->pc,"hello world",11);
            printf("%s\n",pchangeable2->pc);
            printf("size of pchangeable2 : %d\n",sizeof(pchangeable2));
    }

    运行结果

    size of struct changeable : 4
    size of pchangeable : 4
    pchangeable2->iCnt : 20
    hello world
    size of pchangeable2 : 4

    如上,本例中变长结构体本身长度就是一个int的长度(这个int值通常只为了方便表示后边的数组长度),而后边的数组长度不计算在内,但是该数组可以直接使用。

    (说后边是个指针吧?指针也占长度!这个是不占的!原理很简单,这个东西完全是数组后边的尾巴,malloc开辟的是一片连续空间。其实这不应该算一个机制,感觉应该更像一个技巧吧

    20191113:这块可能有点抽象?建议去了解一下手动开辟空间malloc和指针相关知识,所谓“变长结构体”,不是一个你理解的结构体!至少不是按正常结构体用的,他像是一个逻辑性的概念,空间是malloc开辟的,结构体是以指针形式存在的“虚拟”的概念,简单说,这个“结构体”不在栈空间!

     

     

    20160405补充:

    非弹性数组不能用"char a[]"这种形式定义弹性(flexible)变量,必须明确大小。

    弹性数组在结构体中,下面的形式是唯一允许的:

     

    struct s
    {
            int a;
            char b[] ;
    };

    顺序颠倒会让b和a数据重合,会在编译时不通过。

    char b[] = "hell";也不行(C和C++都不行)

    少了整型变量a又会让整个结构体长度为0,compiler不允许编译通过!不同的是,其实C++形式上是允许空结构体的,本质上是通过机制避免了纯空结构体和类对象,自动给空结构体对象分配一个字节(sizeof()返回1)方便区分对象,避免地址重合!所以呢,C如果有空结构体,定义两个(或一打,或干脆一个数组)该结构体的变量(对象),地址是完全一样的!·!!!!!!!!调试看程序运行,这些语句其实都被当屁放了,根本没有运行,没有实际意义,C压根不支持空结构体这种东西(或者说我也没想好什么场合有用)

     

    struct s2
    {
    //      char a[]  = "hasd" ;
    //      int c;
    };
    int main()
    {
            struct s2 s22;
            struct s2 s23;
            struct s2 s24;
            struct s2 s25;
    }
    


    例外的是,C++唯独不给带弹性数组的结构体分配空间(可能怕和变长结构体机制产生某种冲突,比如大小怎么算):

    struct s
    {
            char b[] ;
    };

     

    struct s
    {
    //        char b[] ;
    };

    C++中两者是不一样的,空的结构体反而“大”(sizeof()返回1)
     

    20160321补充:这个机制利用了一个非常重要的特性——组和指针的区别!数组和指针在很多操作上是一样的,但是本质不一样。最直观的,指针可以改指向,数组不可以,因为数组占用的每一个内存地址都用来保存变量或者对象,而指针占用的内存地址保存的是一个地址,数组没有单独的保存指向地址的这样一个结构。数组的位置是固定的,正如指针变量自身的位置也是固定的,改的是指针的值,是指向的目标地址,而因为数组不存储目标地址,所以改不了指向。企图把地址强制赋值给数组的话,也只是说把指针赋值给数组,类型不兼容。

     

    结构体嵌套:

    结构体嵌套其实没有太意外的东西,只要遵循一定规律即可:

     

    //对于“一锤子买卖”,只对最终的结构体变量感兴趣,其中A、B也可删,不过最好带着
    struct A{ 
            struct B{
                 int c;
            }
            b;
    }
    a;
    //使用如下方式访问:
    a.b.c = 10; 
    

    特别的,可以一边定义结构体B,一边就使用上:

    struct A{
            struct B{
                    int c;
            }b;
    
            struct B sb;
    
    }a;
    

    使用方法与测试:

            a.b.c = 11;
            printf("%d\n",a.b.c);
            a.sb.c = 22;
            printf("%d\n",a.sb.c);
    结果无误。 

    但是如果嵌套的结构体B是在A内部才声明的,并且没定义一个对应的对象实体b,这个结构体B的大小还是不算进结构体A中。

     

     

    结构体与函数:

    关于传参,首先:

    void func(int);
    func(a.b.c);

    把结构体中的int成员变量当做和普通int变量一样的东西来使用,是不用脑子就想到的一种方法。

     

    另外两种就是传递副本和指针了 :

    //struct A定义同上
    //设立了两个函数,分别传递struct A结构体和其指针。
    void func1(struct A a){
            printf("%d\n",a.b.c);
    }
    void func2(struct A* a){
            printf("%d\n",a->b.c);
    }
    main(){
            a.b.c = 112;
            struct A * pa;
            pa = &a;
            func1(a);
            func2(&a);
            func2(pa);
    }
    
    

     

    注意:盗版是得不到更新迭代的(手动滑稽)https://blog.csdn.net/huqinweI987/article/details/23625823

     

     

    占用内存空间:

    struct结构体,在结构体定义的时候不能申请内存空间,不过如果是结构体变量,声明的时候就可以分配——两者关系就像C++的类与对象,对象才分配内存(不过严格讲,作为代码段,结构体定义部分“.text”真的就不占空间了么?当然,这是另外一个范畴的话题)。

     

    结构体的大小通常(只是通常)是结构体所含变量大小的总和,下面打印输出上述结构体的size:

            printf("size of struct man:%d\n",sizeof(struct man));
            printf("size:%d\n",sizeof(Huqinwei));
    结果毫无悬念,都是28:分别是char数组20,int变量4,浮点变量4. 

     

    下边说说不通常的情况:

    对于结构体中比较小的成员,可能会被强行对齐,造成空间的空置,这和读取内存的机制有关,为了效率。通常32位机按4字节对齐,小于的都当4字节,有连续小于4字节的,可以不着急对齐,等到凑够了整,加上下一个元素超出一个对齐位置,才开始调整,比如3+2或者1+4,后者都需要另起(下边的结构体大小是8bytes),相关例子就多了,不赘述。

    struct s
    {
    char a;
    short b;
    int c;
    }

    相应的,64位机按8字节对齐。不过对齐不是绝对的,用#pragma pack()可以修改对齐,如果改成1,结构体大小就是实实在在的成员变量大小的总和了。
    补一个代码,压入1字节对齐,定义s,然后弹出,使用默认,定义s2,两个结构体大小分别为7和8

    #include <stdio.h>
    #pragma pack(push,1)
    struct s
    {
            char a;
            short b;
            int c;
    };
    #pragma pack(pop)
    struct s2
    {
            char a;
            short b;
            int c;
    };
    
    
    
    int main(){
    
            printf("%ld\n",sizeof(struct s));
            printf("%ld\n",sizeof(struct s2));
    
    }
    
    $ ./a.out
    7
    8
    

     

    和C++的类不一样,结构体不可以给结构体内部变量初始化,。

    如下,为错误示范:

     

    #include<stdio.h>
    //直接带变量名Huqinwei
    struct stuff{
    //      char job[20] = "Programmer";
    //      char job[];
    //      int age = 27;
    //      float height = 185;
    }Huqinwei;
    

     

    PS:结构体的声明也要注意位置的,作用域不一样。

    C++的结构体变量的声明定义和C有略微不同,说白了就是更“面向对象”风格化,要求更低。

     

    那么熟悉了常用方法,都要注意哪些常犯错误呢,见C语言结构体常见错误

     

     

     

    展开全文
  • 但是使用Studio还是有一个问题,每次新建工程build都会去下载gradle(自动到国外下载速度你懂的,开代理也得下很久),很多时候想点取消先进入工程再说,却发现Studio没反应卡死了,去网上找了很多方法尝试都无果。...
    
    

            导读:Android Studio从0.9发展到2.1.2依然很卡,一直没有用它,但无可否认它功能的强大,是未来Android开发的趋势,最近在公司实习重新拾起了它。 但是使用Studio还是有一个问题,每次新建工程build都会去下载gradle(自动到国外下载速度你懂的,开代理也得下很久),很多时候想点取消先进入工程再说,却发现Studio没反应卡死了,去网上找了很多方法尝试都无果。
            我是知道能在工程文件中设置gradle的路径为本地路径的,只要把gradle先下载下来修改本地配置就可以,但是新建工程的过程中studio一直卡在那儿,所以我之前的解决方法是每次新建工程一小会儿就调出任务管理器把它的进程杀死,修改配置文件后重新打开,但是我还是觉得太麻烦了。摸索了很久,终于找到一个方法,特来分享给大家。

    1.准备工作(只需要设置一次)

    (1)去网上下载一个gradle(最好是去官网下,示例中使用的是gradle-2.10-bin.zip)
    (2)打开Android Stuio设置,配置代理如下:(这个127.0.0.1其实是表示本地,并不是国外代理,它作用后面就知道了)



    2.新建工程(示例工程为My Application)

    (1)新建工程之后会弹出这个确认窗口,其实这一步就是关键,因为在准备工作中配置了代理,所以每次新建工程的时候都会弹出它来,这个时候工程构建就暂停了,就可以趁这个时候去修改配置了。


    (2)找到工程目录下的/gradle/wrapper,将之前下载的gradle-2.10-bin.zip放到该目录。(我是把这个文件放在我的工作区间里边,和MyApplication同级这样就不用每次都去其它地方拷贝了)


    (3)修改上一步截图中的gradle-wrapper.properties文件。将https\://services.gradle.org/distributions/gradle-2.10-bin.zip的前半部分全删掉,只留下gradle-2.10-bin.zip,然后保存。


    (4)回到Studio,继续新建工程,在第(1)歩中的弹窗选择cancel按钮,后面的步骤就和你平时的步骤一模一样了,不会出现自动下载gradle,卡在那儿很久的情况了,有没有顿时觉得心里舒坦了很多,以后写代码就更愉悦了~~

    当然我们也可以来验证一下(这一步可忽略),在Studio中的命令行输入gradlew build,你会发现它不会再build的时候重新下载gradle!


    就到这里了,希望对大家有所帮助~~ 

    展开全文
  • 1.为什么要用VisualSVN Server,而不用Subversion?...因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Server为windws service,还要通过修改配置文件来控制用户权

    转自:http://blog.csdn.net/liu7183296/article/details/13015969


    1.为什么要用VisualSVN Server,而不用Subversion?

    回答:

    因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Server为windws service,还要通过修改配置文件来控制用户权限,另外如果要想以Web方式【http协议】访问,一般还要安装配置Apache,如果是新手,岂不是很头痛?而VisualSVN Serve集成了Subversion和Apache,省去了以上所有的麻烦。安装的时候SVN Server已经封装为windws service,Apache服务器的配置也只是在图像界面上,指定认证方式、访问端口等简单操作;另外,用户权限的管理也是通过图像界面来配置。

    2.为什么不用TFS?

    回答:

    因为我们一开始就是用Subversion和TortioseSVN,所以就没有更换其他的软件。至于TFS至今没有用过,其实,我只是看了一些的文章而已,对它也不了解。

    3.VisualSVN Server是免费的吗?

    回答:

    是的,VisualSVN Server是免费的,而VisualSVN是收费的。VisualSVN是SVN的客户端,和Visual Studio集成在一起, VisualSvn Server是SVN的服务器端,包括Subversion、Apache和用户及权限管理,优点在上面已经说过了。

    好了,言归正传,正式开始我们今天的教程。

    一、VisualSVN Server的配置和使用方法【服务器端】

    安装好VisualSVN Server后【安装过程看这里】,运行VisualSVN Server Manger,下面是启动界面:

    好的,下面我来添加一个代码库【Repository】,如下图:

    按上图所示,创建新的代码库,在下图所示的文本框中输入代码库名称:

    注意:上图中的CheckBox如果选中,则在代码库StartKit下面会创建trunk、branches、tags三个子目录;不选中,则只创建空的代码库StartKit。

    点击OK按钮,代码库就创建成功了。

    创建完代码库后,没有任何内容在里面。我会在这个教程的第二部分说明如何迁入源代码。

    下面,我们开始安全性设置,在左侧的Users上点击右键:

    输入上面的信息,点击OK,我们就创建一个用户了。按照上面的过程,分别添加用户Developer1、tester1、manager1,好了,我们开始添加这些用户到我们刚才创建的项目里:

    点击上图中的"Add..."按钮,在下图中选择我们刚才添加的用户,点击OK按钮:

    说明:大家可能注意到了下图中的Groups,是的,你也可以先创建组,把用户添加到各个组中,然后对组进行授权,操作比较简单,在此略过。

    按照下图所示,分别对用户【或组】进行授权:

    点击"确定"按钮,上面的用户就具有了访问StartKit代码库的不同权限。

    因为用户starter在团队中是新来者,不希望他向代码库中提交新代码,所以他只能读取代码库中的代码,不能提交代码。tester1是测试人员,不负责代码编写,所以也是只读权限。而Developer1和manager1是开发人员和项目经理,自然具有读、写的权限。

    在实际的项目开发过程中,Developer和tester往往不可能只有一个人,这时候使用组来授权更加方便,这个大家可以自己练习一下。

    二、TotoiseSVN的基本使用方法

    项目管理实践教程一、工欲善其事,必先利其器【Basic Tools】中,我已经讲解了怎样安装TortoiseSVN。在上面的讲解中已经讲了怎么使用VisualSVN Server了,今天我要讲的是,TortoiseSVN的简单使用方法。

    一、签入源代码到SVN服务器

    假如我们使用Visual Studio在文件夹StartKit中创建了一个项目,我们要把这个项目的源代码签入到SVN Server上的代码库中里,首先右键点击StartKit文件夹,这时候的右键菜单如下图所示:

    图2-2-1

    点击Import,弹出下面的窗体,其中http://zt.net.henu.edu.cn 是服务器名,svn是代码仓库的根目录,StartKit是我们在上个教程中添加的一个代码库:

    说明:左下角的CheckBox,在第一次签入源代码时没有用,但是,在以后你提交代码的时候是非常有用的。

    图2-2-2

    点击OK按钮,会弹出下面的窗体,要求输入凭据:

    图2-2-3

    在上面的窗体中输入用户名和密码,点击OK按钮:

    图2-2-4

    如上图所示,好了,源代码已经成功签入SVN服务器了。这时候团队成员就可以迁出SVN服务器上的源代码到自己的机器了。

    二、签出源代码到本机

    在本机创建文件夹StartKit,右键点击Checkout,弹出如下图的窗体:

    图2-2-5

    在上图中URL of Repository:下的文本框中输入svn server中的代码库的地址,其他默认,点击OK按钮,就开始签出源代码了。

    说明:上图中的Checkout Depth,有4个选项,分别是迁出全部、只签出下一级子目录和文件、只签出文件、只签出空项目,默认的是第一项。上面的例子中,我们也可以使用web的方式访问代码库,在浏览器中输入http://zt.net.henu.edu.cn/svn/StartKit/

    这时候也会弹出对话框,要求输入用户名和密码,通过验证后即可浏览代码库中的内容。

    搞定!源代码已经成功签出到刚才新建的StartKit目录中。

    打开StartKit目录,可以看到如下图的文件夹结构:

    图2-2-5

    一旦你对文件或文件夹做了任何修改,那么文件或文件夹的显示图片机会发生变化。下图中我修改了其中的二个文件:

    图2-2-7

    大家看一下不同状态所对应的图片:

    图2-2-8

    我们已经知道怎么将源代码签入到SVN服务器,怎么从服务器签出代码到本机,也简单了解了不同状态所对应的图案啦。

    三、提交修改过的文件到SVN服务器

    上面的图2-2-7中,我修改了位于Model文件中的二个文件ImageInfo.cs和NewsInfo.cs,下面演示如何提交到SVN服务器。

    注意:提交源代码到服务器时,一定确保本机的代码是最新版本,否则可能提交失败,或者造成版本冲突。

    在Model文件夹上点击右键或在Model文件下的空白处点击右键,点击SVN Commit…弹出下面的窗体:

    图2-2-9

    点击OK按钮后,弹出如下图的窗体:

    图2-2-10

    四、添加新文件到SVN服务器

    我们在Model文件下添加一个新的类文件UserInfo.cs,在Model文件下的空白处点击右键,点击SVN Commit…,和上面讲的提交修改过的文件到SVN服务器一样,就可以了。

    另外也可以在文件UserInfo.cs上点击右键,点击TortoiseSVN=>>Add,弹出如下图的窗体:

    图2-2-11

    选中UserInfo.cs文件,点击OK按钮,这样并没有将这个文件提交到SVN服务器,只是将这个文件标记为源代码库库中的文件,并将其状态置为修改状态。之后,我们要再SVN Commit这个文件一次,才可以将其真正提交到SVN服务器上的代码库中。

    上面讲是添加文件,实际上,添加文件夹的步骤也是一样的,这里就不说了。

    五、更新本机代码与SVN服务器上最新的版本一致

    这个也很简单,只要在需要更新的文件夹上点击右键或在该文件下的空白处点击右键,点击SVN Update,就可以了。

    注意:更新操作可能会因为版本冲突而失败,这是可以使用合并【Merge】或其他方法解决;也可能因为锁定【Get Lock】而失败,这是需要先解锁【Release Lock】。

    六、重命名文件或文件夹,并将修改提交到SVN服务器

    只要在需要重命名的文件或文件夹上点击右键,点击TortiseSVN=>>Rename…,在弹出的窗体中输入新名称,点击OK按钮,就可以了。此方法也不是直接重命名,而是将该文件或文件夹的名称标记为重命名后名称,也需要我们使用SVN Commit提交到SVN服务器后才真正重命名。

    七、删除文件或文件夹,并将修改提交到SVN服务器

    最简单就是,你直接删除文件或文件夹,然后使用SVN Commit提交更新到SVN服务器。另外一种方法是在你要删除的文件或文件夹上点击右键=>>TortoiseSVN=>>Delete删除,此方法也不是直接删除,而是将该文件或文件夹的状态置为删除,也需要我们使用SVN Commit提交到SVN服务器后才真正删除。

    说明:实际上,从你把源代码迁签入SVN服务器开始,每一个版本的数据和文件,就算是你已经删除了的,也都可以随时迁出。

    以上只是TortoiseSVN最简单的几个功能,其实他的功能远不止这些,其他的功能大家可以在使用的过程中慢慢体会,有些功能我会在下面的教程中使用到,到时候会和大家讲清楚用法。

    注意:向SVN服务器提交源代码的时候,一定不要提交bin、obj等文件夹,否则会很麻烦。但是web项目的bin目录除外,但是web项目的bin目录中的引用其他项目而生成的dll不需要提交。

    一个好习惯:如果项目中引用了其他的第三方的程序集,比如EnterpriseLibrary、FCKEditor等,这时候不要简单从他们的安装位置引用,而是在你的解决方案下,添加一个Library的目录,把需要的程序集复制到这里,然后从Library目录引用,这样有什么好处,自己想一想吧!

    Tortoise SVN 客户端 基本用法

    1. export 和check out
      export 下载源代码
      用法:
      1、新建一个空的文件夹,右键点击它,可以看到TortoiseSVN菜单以及上面的SVN Checkout。
      2、不用管这个Checkout,我们选择TortoiseSVN菜单下的Export...,接着它会让你输入url。
      3、比如输入【迷宫探宝】的SVN地址是:http://game-rts-framework.googlecode.com/svn/trunk/
      4、其他选项不需要更改,Omit externals不要勾选,HEAD Revision选中表示最新的代码版本,接着点击OK即可将代码导出到这个目录中:)
      check out 意思签出,虽然和Export的效果一样是把代码从服务器下载到本地,但是Checkout有验证的功能,Checkout到某处的代码,将会被TortoiseSVN监视,里面的文件可以享受各种SVN的服务。
      
      2 .每次提交代码需要注意哪些问题
      如果你更新了目录中的文件,提交代码需要用到commit功能,commit的功能不仅仅是上传,他会和服务器上面的文件进行对比,假如你更新了某个文件而服务器上面也有人更新了这个文件,并且是在你checkout之后做的更新,那么它会尝试将你的更新和他人的更新进行融合(merge),假如自动merge不成功,那么报告conflict,你必须自己来手动merge,也就是把你的更新和别人的更新无冲突的写在一起。
      commit的时候,最好填写Log信息,这样保证别人可以看到你的更新究竟做了写什么。这就相当于上传文件并且说明自己做了那些修改,多人合作的时候log非常重要。
      TortoiseSVN的commit只会上传原先checkout然后又被修改了的文件,假如你新加入了某些文件,需要右键点击文件选择Add,然后文件上面会出现一个加号,在下次commit的时候它就会被upload并且被标记为绿色对勾。没有绿色对勾的文件不会被commit。
      假如你需要给带有绿色对勾文件改名或者移动它的位置,请不要使用windows的功能,右键点击它们,TortoiseSVN都有相应的操作。想象这些文件已经不在是你本地的东西,你的一举一动都必须让Tortoise知道。
      假如修改了某个文件但是你后悔了,可以右键点击它选择Revert,它将变回上次checkout时候的情况。或者Revert整个工程到任意一个从前的版本.
      下面描述在使用Commit时的几个注意点:
      -------------如有多个文件需要同时提交,同时文件在不同的目录下,必须找到这些文件的最短目录上点击Commit,TortoiseSVN会搜索被点击目录以及该目录下所有的文件,并将修改变动的文件罗列在列表中。
      -------------仔细查看列表中的文件,确定哪些文件时需要更新的,如果不需要更新某个已经变化了的文件,只需要在该文件上点击右键,选择还原操作;选择需要新增的文件,不要将临时文件添加到版本库中。
      -------------如遇到文件冲突(冲突:要提交的文件已被其他人改动并提交到版本库中)要启用解决冲突功能。
      3. 如何保持本地版本和服务器版本同步
      使用update来同步本地和服务器上的代码。同样是右键选择SVN update,所有的更改就会从服务器端传到你的硬盘。注意,假如别人删除了某个文件,那么更新之后你在本地的也会被删除。
      如果本地的代码已经被修改,和commit一样会先进行merge,不成功的话就会报告conflict
      4 如何在同一个在一个工程的各个分支或者主干之间切换
      使用tortoise SVN-->switch
      在URL中输入branch或trunk的url地址
      5.如何比较两个版本之间的差别
      
      本地更改
      如果你想看到你的本地副本有哪些更加,只用在资源管理器中右键菜单下选TortoiseSVN→ 比较差异。
      与另外一个分支/标签之间的差异
      如果你想查看主干程序(假如你在分支上开发)有哪些修改或者是某一分支(假如你在主干上开发)有哪些修改,你可以使用右键菜单。在你点击文件的同时按住Shift键,然后选择TortoiseSVN→ URL比较。在弹出的对话框中,将特别显示将与你本地版本做比较的版本的URL地址。
      你还可以使用版本库浏览器,选择两个目录树比较,也许是两个标记,或者是分支/标记和最新版本。邮件菜单允许你使用比较版本来比较它们。阅读第 5.9.2 节 “比较文件夹”以便获得更多信息。
      与历史版本的比较差异
      如果你想查看某一特定版本与本地拷贝之间的差异,使用显示日志对话框,选择要比较的版本,然后选择在右键菜单中选与本地拷贝比较差异
      两个历史版本的比较
      如果你要查看任意已提交的两个历史版本之间的差异,在版本日志对话框中选择你要比较的两个版本(一般使用 Ctrl-更改),然后在右键菜单中选比较版本差异
      如果你在文件夹的版本日志中这样做,就会出现一个比较版本对话框,显示此文件夹的文件修改列表。阅读第 5.9.2 节 “比较文件夹”以便获得更多信息。
      提交所有修改
      如果你要在一个视窗中查看某一版本的所有更改,你可以使用统一显示所有比较 (GNU 片段整理)。它将显示所有修改中的部分内容。它很难显示一个全面清晰的比较,但是会将所有更改都集中显示出来。在版本日志对话框中选择某一版本,然后在右键菜单中选择统一显示所有比较。
      文件差异
      如果你要查看两个不同文件之间的差异,你可以直接在资源管理器中选择这两个文件(一般使用 Ctrl-modifier),然后右键菜单中选TortoiseSVN→ 比较差异。
      WC文件/文件夹与URL之间的比较差异
      如果你要查看你本地拷贝中的任一文件与版本库中任一文件之间差异,
      谴责信息之间的比较差异
      如果你要查看的不仅是比较差异而且包括修改该版本的作者,版本号和日期,你可以在版本日志对话框中综合比较差异和谴责信息。这里有更多详细介绍第 5.20.2 节 “追溯不同点”。
      比较文件夹差异
      TortoiseSVN 自带的内置工具不支持查看多级目录之间的差异,但你可以使用支持该功能的外置工具来替代。在这里 第 5.9.4 节 “其他的比较/合并工具”我们可以介绍一些我们使用过的工具。
      6.提交代码时怎样知道自己改了哪些文件,别人改了哪些文件
      7. 如何知道某个文件的某一行是谁在哪个版本修改的
      
      8. 如何为一个SVN主工程建立分支或tag
      创建分支使用步骤:
      1、选择你要产生分支的文件,点击鼠标右键,选择[分支/标记...]
      2、在[至URL(T)]输入框中将文件重命名为你的分支文件名,输入便于区分的日志信息,点击确认。
      3、在SVN仓库中会复制一个你所指定的文件,文件名称就是你所命名的,但是在你的本地目录上看不到新建的分支文件名,要使你的文件更新作用到你的分支上,你必须选择文件,点击鼠标右键,选择[切换...],选择你重命名的文件,点击确定即可。这样你的本地文件就和分支文件关联上了,不要奇怪,这时本地目录上看到的文件名仍然为旧的文件名。
      经验小结:
      1、如果操作的文件之前还未提交,而你又想把文件提交到新的分支上,记得一定要选择切换
      2、SVN分支的管理实际上就是把不同的分支用不同的文件保存,因此你在取得新版本的时候会发现,不同分支的最新文件也会被获取下来。
      创建tag操作,相当于把当前的代码版本复制一份到其他地方,然后以这个地方为出发点进行新的开发,与原来位置的版本互不干扰。
      对于branches、tags、trunk这三个目录,并不是subversion必需的,而是被总结的一种良好的团队开发习惯,其使用方法为:
      1、开发者提交所有的新特性到主干。 每日的修改提交到/trunk:新特性,bug修正和其他。
      2、这个主干被拷贝到“发布”分支。 当小组认为软件已经做好发布的准备(如,版本1.0)然后/trunk会被拷贝到/branches/1.0。
      3、项目组继续并行工作,一个小组开始对分支进行严酷的测试,同时另一个小组在/trunk继续新的工作(如,准备2.0),如果一个bug在任何一个位置被发现,错误修正需要来回运送。然而这个过程有时候也会结束,例如分支已经为发布前的最终测试“停滞”了。
      4、分支已经作了标签并且发布,当测试结束,/branches/1.0作为引用快照已经拷贝到/tags/1.0.0,这个标签被打包发布给客户。
      5、分支多次维护。当继续在/trunk上为版本2.0工作,bug修正继续从/trunk运送到/branches/1.0,如果积累了足够的bug修正,管理部门决定发布1.0.1版本:拷贝/branches/1.0到/tags/1.0.1,标签被打包发布。
      一般建立最初的repository时,就建好这三个目录,把所有代码放入/trunk中,如:要将project1目录下的代码导入repository,project1的结构就是:project1/branches,project1/tags,project1/trunk,project1/trunk/food.c,project1/trunk/egg.pc……,然后将project1目录导入repository,建立最初的资料库。然后export回project1,作为本地工作目录。

    -----------------------------------------------------------------------------------------------------------------------------------

    visualSVN server绿化策略 摆脱两个apache的尴尬                        SVN就不多说了,非常好用的版本控制!安装也非常简单。我的开发环境是WINDOWS,方案是VisualSVN ServerTortoiseSVN,这个安装起来简直超方便!不过有一点非常严重的问题就是官方的VisualSVNServer的安装包里面自带apache服务器,安装的时候不能与本机原有apache(或IIS)端口冲突,这样我的最初的情况就变成机器里有两个apache,4个httpd.exe进程,一下增加了几十M的内存开销,要知道偶的机子本来就很慢,我的想法就是把他们集成到一起,因为visualSVNserver的MMC管理控制台太亲切了,离不开了,虽然SVN已经有更为强大的命令行操作!减少httpd.exe进程为两个,端口只监听8080就好了。
               
                看网上的做法是先安装visualsvn,再将apache重新配置,我觉得这个内置的精简版的apache是绝对不全的,所以我将SVN装到我原有的APM环境中,再安装visualSVN SERVER来管理它!目的很单纯,减少内存开销和端口占用。
               
                SVN的安装不多说了,官方就有很详细的安装教程!这里我用的是最新的 svn-win32-1.4.6.zip
                后面就是绿化visualSVN SERVER
                将visualSVN SERVER官方的安装包里头的文件全部提取,经过分析,我们得到下面的甚为宝贵的注册表文件和后面bin目录中的文件(注意我已经将部分文件更新为svn 1.4.6版)!           

    QUOTE:

               
    Windows Registry Editor Version 5.00
               
                [HKEY_CURRENT_USER\Software\VisualSVN]
               
                [HKEY_CURRENT_USER\Software\VisualSVN\VisualSVN Server]
                "MenuShortcut"="1"
                "Adm_Tools_MenuShortcut"="1"
               
                [HKEY_LOCAL_MACHINE\SOFTWARE\VisualSVN]
               
                [HKEY_LOCAL_MACHINE\SOFTWARE\VisualSVN\VisualSVN Server]
                "RepositoriesRoot"="F:\\Repositories\\"
                "ServerName"="localhost"
                "ServerPort"="8080"
                "SSLServerPort"="8443"
                "UseSSL"="0"
                "InstallDir"="D:\\myserver\\VisualSVN Server\\"
               
                [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MMC\SnapIns\{08B017E8-47AD-4D1B-A928-94FFD77E9950}]
                About={2FC11162-83EE-47ED-87DA-490D7402230C}
               
                [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MMC\SnapIns\{08B017E8-47AD-4D1B-A928-94FFD77E9950}]
                NameString=VisualSVN Server Manager
               
                [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MMC\SnapIns\{08B017E8-47AD-4D1B-A928-94FFD77E9950}\Extension]
                @=Namespace
               
                [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MMC\NodeTypes\{476E6449-AAFF-11D0-B944-00C04FD8D5B0}\Extensions\Namespace]
                {08B017E8-47AD-4D1B-A928-94FFD77E9950}=VisualSVN Server
    里面的设置都是一目了然的,重点就是HKEY_LOCAL_MACHINE\SOFTWARE\VisualSVN\VisualSVN Server键下面,其他的都不需要修改!,然后注册dll文件 regsvr32 /s Manager.dll,bin的目录没有了,文件的部署变成这样的:           

    QUOTE:

               
    D:\myserver\VisualSVN Server 的目录
               
                2007-12-23   00:25    <DIR>            .
                2007-12-23   00:25    <DIR>            ..
                2007-12-20   16:29              131,149 libapr-1.dll
                2007-12-20   16:29               36,952 libapriconv-1.dll
                2007-12-20   16:29              172,118 libaprutil-1.dll
                2007-12-20   16:29           1,073,152 libeay32.dll
                2007-11-30   00:26              274,432 libhttpd.dll
                2006-12-02   06:03                1,869 Microsoft.VC80.CRT.manifest
                2006-12-02   14:22              479,232 msvcm80.dll
                2006-12-02   06:03              548,864 msvcp80.dll
                2006-12-02   06:03              626,688 msvcr80.dll
                2007-12-20   16:29              204,800 ssleay32.dll
                2007-10-09   22:48               28,871 VisualSVN Server.msc
                2007-11-30   00:19               60,416 zlib1.dll
                2007-12-23   00:45                2,064 visualSVN.reg
                2007-12-23   00:38                   578 setup.bat
                2007-12-20   16:29               69,716 intl3_svn.dll
                2007-12-20   16:29              802,816 libdb44.dll
                2007-12-20   16:29           1,019,980 svn.exe
                2007-12-20   16:29              528,470 svnadmin.exe
                2007-12-20   16:29              499,808 svndumpfilter.exe
                2007-12-20   16:29              520,276 svnlook.exe
                2007-12-20   16:29              561,238 svnserve.exe
                2007-12-20   16:29              712,788 svnsync.exe
                2007-12-20   16:29              368,730 svnversion.exe
                2007-12-23   00:33                    23 uninstall.bat
                2007-12-23   01:07                   311 vsvnvars.bat
                2007-11-30   01:06              491,520 Manager.dll
                                  26 个文件       9,216,861 字节
                                   2 个目录   9,841,033,216 可用字节
    路径和上面的注册表文件是对应的,经过这些操作以后,就可以顺利的使用visualSVN SERVER了,不过这个控制台里面的apache服务器控制菜单不能正常使用了,解决的方法是将apache注册为服务的时候名称取为 VisualSVNServer就可以了,语句范例:
               
                D:\myserver\Apache2\bin\httpd.exe -k install -n VisualSVNServer
               
                这样再重新打开visualSVN SERVER的控制台,就可以控制apache的开始、停止以及重启了。
               
                顺便提及:当使用TortoiseSVN连接服务器长时间假死,并且apache的错误日志里有类似:
               
                [Sat Dec 22 15:49:30 2007] [error] [client 127.0.0.1] XML parser error (at end). status=20014
               
                这样的错误记录,问题是出在卡巴斯基 6.0,将TortoiseSVN的bin目录下的TortoiseProc.exe文件添加到卡巴的信任程序里边,即可解决,偶就碰到这个很郁闷的问题,搞了半天才搞定。
    展开全文
  • windows Nginx基本使用方法

    万次阅读 2016-10-10 11:18:05
    windows Nginx基本使用方法
  • JSONObject使用方法详解

    万次阅读 2017-04-05 10:25:01
    JSONObject使用方法详解 投稿:mrr 字体:[增加 减小] 类型:转载 时间:2015-12-17 我要评论 JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包,本文给大家介绍...
  • 详述 Spring MVC 框架中拦截器 Interceptor 的使用方法

    万次阅读 多人点赞 2017-03-30 17:02:05
    1 前言 昨天新接了一个需要,“拦截 XXX,然后 OOO”,...因此,正好借此机会,整理一篇关于拦截器的文章,在此分享给大家,供大家参考阅读。2 拦截器2.1 概念 Java 里的拦截器是动态拦截 action 调用的对象。它提
  • 离线地图使用方法

    万次阅读 2019-08-28 12:02:35
    最近接手了一个web项目,... 首先开发web GIS 主要是采用一些前端框架,目前主流的gis前端框架是openlayers 和Leaflet 至于两者优劣,读者可自行百度,我在项目中使用的是 Leaflet 。 打开地图下载器(工具在底部...
  • JSONObject 使用方法详解

    万次阅读 多人点赞 2017-03-28 10:32:33
    JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包,本文给大家介绍jsonobject使用方法相关知识,感兴趣的朋友一起学习吧 1.JSONObject介绍 JSONObject-lib包是一个beans,...
  • DELPHI MASKEDIT使用方法

    千次阅读 2010-11-24 23:38:00
    MaskEdit的EditMask使用方法
  • JNI使用方法

    千次阅读 2012-10-27 16:41:01
    Java通过JNI调用本地方法,而本地方法库文件的形式存放的(在Windows平台下是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使Java可以实现和本地机器的紧密联系,调用系统级的各...
  • jqGrid使用方法

    万次阅读 2013-09-25 13:02:00
    jqGrid 是一个用来显示网格数据的jQuery插件,通过使用jqGrid可以轻松实现前端页面与后台数据的ajax异步通信。文档比较全面,其官方网址为:http://www.trirand.com。   一、jqGrid特性: · 基于jquery UI主题,...
  • Nginx基本使用方法

    万次阅读 多人点赞 2017-07-12 13:52:32
    反向代理(Reverse Proxy)方式是指代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个...
  • delphi 中locate函数的使用方法

    千次阅读 2017-05-17 15:06:58
    本篇文章主要介绍了"delphi 中locate函数的使用方法",主要涉及到delphi 中locate函数的使用方法方面的内容,对于delphi 中locate函数的使用方法感兴趣的同学可以参考一下 delphi 中locate函数的使用方法 ...
  • footer至于底部的四种方法

    万次阅读 2017-07-06 16:39:48
    实现在页脚永远固定在页面底部的方法有很多,但是有很多方法是需要使用一些hack或借助javaScrip来实现,那么接下来要说的方法三,仅仅使用了15行的样式代码和一个简单明了的HTML结构实现了效果,并且兼容性强,别的...
  • C++中STL用法超详细总结

    万次阅读 多人点赞 2018-08-21 22:06:54
    目录 1 什么是STL? 2 STL内容介绍 2.1 容器 2.2 STL迭代器 2.3 算法 2.4 仿函数 2.4.1 概述 2.4.2 仿函数(functor)在编程语言中的应用  2.4.3 仿函数在STL中的定义...3 常用容器用法介绍  3.1 vec...
  • MaskEdit的EditMask使用方法

    千次阅读 2011-03-04 21:27:00
    MaskEdit的EditMask使用方法 <br />最近需要一个可控制输入输出格式的编辑框,不过Delphi中却没有满足要求的控件,想自己弄一个吧!结果没想到Delphi一如既往地连正则表达式都没有支持,不考虑自己编写...
  • Crawler:关于爬虫的简介、安装、使用方法之详细攻略 目录 爬虫简介 爬虫过程思路 关于Python实现爬虫的一些包 1、requests 2、beautifulsoup 3、scrapy 关于爬虫常用的方法函数 1、基本函数 爬虫...
  • 1.为什么要用VisualSVN Server,而不用Subversion? 回答: 因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Serve
  • JSONObject使用方法详解json解析

    万次阅读 2017-01-12 21:50:07
    JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包,本文给大家介绍jsonobject使用方法相关知识,感兴趣的朋友一起学习吧 1.JSONObject介绍 JSONObject-lib包是一个beans,...
  • ADBannerView 的基本使用方法

    千次阅读 2013-03-15 11:19:51
    本范例只着重在如何使用 ADBannerView 并没有 iAD 的相关设定与申请流程,至于其他行动广告的部份大家可以参考行动广告 Banner!让你赚大钱!一文。    首先汇入 iAD Framework,并引用其标头档,Xcode 4 ...
  • Visual Studio 2015安装使用方法

    万次阅读 2019-01-08 12:57:00
    下载之后的文件是.iso格式的镜像,Windows 8/10都能够双击装载镜像,而Windows 7不能直接装载,可以使用解压软件对.iso文件进行解压。 双击方式装载,会直接进入镜像文件夹。也可以右击镜像,在右键菜单中选择装载...
  • synergy比较详细的使用方法(多台电脑共享一套键盘和鼠标)前言:由于最近使用两台电脑写代码,使用同一套的键盘和鼠标非常不方便,所以安装了两个鼠标,台式机一个键盘,笔记本上有一个键盘。依然不方便,以至于想...
  • Opencv中的Mat类使用方法总结

    万次阅读 2018-06-23 22:32:54
    此文章转载自:...之前用Opencv编过不少的程序了,没想道OpenCV 2.0版本里最基础的Mat类用法还是有些不清楚,这里就总结一下一、Mat类的综述1、Mat类存储图像Mat类是OpenCV里使用广泛的一个类,其...
  • Android开发工具GenyMotion安装和使用方法

    万次阅读 热门讨论 2013-08-02 19:44:24
    好长时间没有再接触Android了,以至于GenyMotion出现这么久了,我还没有试用过,记得当时发布Android Studio时,当天我就开始试用了,好吧,看到GenyMotion这个东西还要归功于这篇文章:... 首先,我
  • mdev 的使用方法和原理

    万次阅读 2013-04-04 14:45:10
    mdev 的使用方法和原理 原文网址:http://blog.csdn.net/hugerat/archive/2008/12/03/3437099.aspx mdev 是busybox 自带的一个简化版的udev,适合于嵌入式的应用埸合。其具有使用简 单的特点。它的作用,就是在...
  • java script 使用方法

    千次阅读 2010-01-22 09:08:00
    一、Javascript在网页的用法  Javascript加入网页有两种方法:  1、直接加入HTML文档  这是最常用的方法,大部分含有Javascript的网页都采用这种方法,如:    <!--  document.writeln("这...
  • regopenkeyex用法

    万次阅读 2012-03-20 00:50:10
    许多CFAN通过对注册表的修改使Win98显得更加个性化,诸多报刊杂志也纷纷扯起注册表这面旗帜,令人遗憾的是,在介绍注册表修改的众多的文章中,大都手工修改为例,极少数文章也只介绍有关修改注册表软件的用法,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 443,730
精华内容 177,492
关键字:

以至于的用法