zoukankan      html  css  js  c++  java
  • C++ Builder AnsiString 类

    AnsiString类
    C++ Builder AnsiString 类介绍和使用


    介绍AnsiString类之前,先要介绍一些背景知识。VCL大量利用Pascal长字串数据类型,几乎所有基于文本的VCL属性都采用Pascal长 字串。例如,Text、Name和Caption属性都是Pascal长字串属性。VCL的许多构件方法和事件处理函数也采用Pascal长字串。
    关于Pascal长字串数据类型要注意两点。第一,Pascal长字串是真正的语言数据类型,而不象C/C++中一样只是个字符数组。第二,C++内部没 有Pascal长字串的对等类型。由于VCL大量使用Pascal长字串,而C++ Builder使用Pascal VCL,所以Borland生成一个C++类来近似Pascal长字串,这个类就是AnsiString类,可以代替Pascal长字串。
    AnsiString类的类名不易理解,你要在SYSDEFS.H中采用如下语句:
    typedef AnsiString String;
    这样就可以在声明AnsiString类的实例时用名称String而不用正式类名AnsiString类:
    String s = "This is a test";
    由于String是AnsiString类的别名,所以不必在C++ Builder程序中再用AnsiString类名(当然,还可以这么用)。为了清晰起见,我在文本中使用AnsiString类名,而在代码例子中使用缩略形式String。
    AnsiString类是功能很强的字串类。AnsiString类构造器可以从Char、Char*、int或double生成AnsiString类 对象。这些构造器很容易将直接字串赋予AnsiString类并将整数或浮点数变成字串。下列例子显式或隐式使用AnsiString类构造器:
    String FloatString = 127.123;
    String AnotherFloatString(0.999);
    String IntString = 49;
    String CharString = 'A';
    Labell>Caption = "This is a test";
    double d = 3.14 * 20;
    Edit1>Text = d;
    也许你对细节不感兴趣,但需要直接赋值时,C++编译器在后台采用相应的AnsiString构造器。以下列语句为例:
    String S = 127.123; // create an AnsiString from a double
    编译器在后台产生如下语句:
    String S = String((double)127.123;
    因此,AnsiString构造器在直接赋值时要进行换算。上述代码可以工作的另一原因是AnsiString类重载了赋值操作符(=)。 AnsiString还重载了接合(+操作符)和测试等式(==操作符)等操作符,从而简化工作。AnsiString类和其它C++类一样,有许多使字 串操作更方便。
    下表列出几个最常用的AnsiString方法,如果需要AnsiString方法的完整清单,请看C++ Builder联机帮助。
    C_str 返回字串的数据的指针(char*)
    Delete 删除字串的一部分
    Insert 在现有字串的指定位置插入文本
    Length 返回字串长度,不包括终止NULL
    LowerCase 将字串变成小写
    Pos 返回搜索字串在字串中的位置
    SubString 返回字串中从指定位置开始、指定长度的子串
    ToDouble 将字串变成浮点数,如果无法将字串变成浮点数,则扔出异常
    ToInt 将字串变成整数,如果无法将字串变成整数,则扔出异常
    ToIntDef 将字串变成整数并在不能换算时提供缺省值而不扔出异常
    Trim 删除字串前后的空格
    UpperCase 将字串变成大写
    其中几个方法需要特别说明。一个是c_str()方法,这个奇怪的方法名用于要取得AnsiString的字串缓冲区指针时。为什么要这么干呢?有些 Windows API函数需要char*参数。AnsiString是个类,不能直接将AnsiString传递给需要字符数组指针的函数。例如,如果使用 Windows API函数DrawText(),则要用如下代码:
    RECT R
    Rect(0,0,100,20);// first,the C waychar
    buff[]="This is a test";
    DrawText(Canvas>Handle,buff,1,&R,DT_SINGLELINE);
    // now the VCL way
    String S ="This is a test";
    DrawText(Canvas>Handle,S.c_str(),1,&R,DT_SINGLELINE);
    DrawText()函数的第二个参数需要字串缓冲区指针,这就要靠c_str()方法提供。如果不理解,可以等以后再回头理解。
    目前不必对DrawText()太费心。这个例子说明VCL将你从WindowsAPI函数隔离开,而又还能使用Windows API函数。深入Windows编程时,有时会需要Windows API函数,这时Windows API函数很有现成。
    另一个AnsiString方法是ToInt()。这个方法将字串变成整数。假设窗体上有个编辑构件要向用户取整数值,由于编辑构件只能放文本,所以需要将字串变成整数。方法如下:
    int value = Edit1>Text.ToInt();
    ToDouble()方法的用法也一样。注意,如果不能换算,这两个方法都会扔出异常。
    有几个AnsiString方法不是作用于字串本身,而是返回新的字串。以UpperCase()方法为例,可以用下列代码将字串变成大写吗?
    String FileName = "c://mystuff//mydata.dat";
    FileName.UpperCase();
    不可以,因为UpperCase()方法返回新字串,而不是作用于字串本身。正确的方法如下:
    FileName= FileName.UpperCase();
    使用AnsiString方法前,先从联机帮助看看这些方法如何操作。另外,记住双反斜杠。另一个AnsiString方法是我所不喜欢的,Format()方法可以象Sprintf()函数一样用变量建立字串。
    Sprintf()函数的例子:
    char buff[20];
    int x = 10 * 20;
    sprintf(buff, "The result is: %d",x);
    这个代码建立内容为"The result is:200"的字串。
    这个工作也可以用AnsiString方法Format()完成:
    String s;
    int x = 10 * 20;
    S = S.Format( "The result is: %d",OPENARRAY(TVarRec,(x)));
    够难看的。这个函数有其存在的原因,但我从来不用Format()方法,一个原因是我记不住这古怪的语法,另一原因是Sprintf()函数更方便。AnsiString格式化的方法如下:
    int x = 10 * 20;
    char buff[20];
    sprintf(buff, "The result is: %d",x);
    String S= buff;
    显然,这个方法并不优雅,但Format()也好不到哪里,读者可以自选其中一个方法。
    AnsiString类还一个怪事值得一提。索引操作符([])可以引用字串的特定元素:
    String S = "Hello World!";
    Label1>Caption = S[7];
    这个代码将字符W赋予标题构件的Caption属性。这里要指出的是,字串的第一个元素在数组索引1处,而不象其它C++数组一样在数组索引0处.基数

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    //Ansistring 转 char
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "哈哈";
        char *chr = Test.c_str();
    }
       
    //char转Ansistring
    #include <windef.h>
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString str = "Sample";
        char chr[MAX_PATH];
        strcpy( chr , str.c_str() );
    }
     
    //Bool转AnsiString
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    AnsiString Test=BoolToStr(CheckBox1->Checked);
    }
     
    //Ansistring转bool
    void __fastcall TForm1::Button1Click(TObject *Sender)
    { AnsiString Test="-1"
        CheckBox1->Checked= StrToBool( Test );
    }
     
    //int转ansistring
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        int i = 123;
        AnsiString str = IntToStr( i );
    }
     
    //AnsiString转double
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "123";
        long double d = StrToFloat( Test );
    }
     
    //double转AnsiString
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        double d = 123.456;
        AnsiString str = FloatToStr( d );
    }
     
    //double转AnsiString并四舍五入
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        long double d = 123.456121212;
        AnsiString str = FloatToStrF( d , ffFixed ,5 , 4 );
    //说明FloatTostrF里5代表从第几个数字的后一位开始四舍五入,4代表取4位小数。
    //执行后得到str是123.4600。:roll:
       
    }
    //double转AnsiString使用类似vb的format函数
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        double d = 123.456;
        AnsiString str = FormatFloat( "000000.00" , d );
    }
    //得到 000123.45,当然你可以使用"# . , ; E+ E- xx"等符号,你自己试试 :wink:
     
    //AnsiString转Tclor型
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "0x00FF8080";
        TColor Col = StringToColor( Test );
    }
    //Tcolor转AnsiString
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        TColor Col = 0x00FF8080;
        AnsiString str = ColorToString( Col );
    }
    //消除AnsiString 中的一部分字符串 代码:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "ABCDEF";
        int First = 3;     // 消除制定开头
        int Length = 2;    // 消除制定长度
        AnsiString Dstr = Test.Delete( First , Length );
    }//得到ABEF
     
    //在AnsiString 中插入字符串
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "ABCDEF";
        AnsiString Ins = "12345";     // 插入串
        int Pos = 3;                  // 在哪插
        AnsiString Istr = Test.Insert( Ins , Pos );
    //得到AB12345CDEF
    }
    //取得ansi某一位字符
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "ABCDEF";
        AnsiString Npos = Test[3];//得到C
    }
    //取得AnsiString里最后一个字符
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "ABCDEF";
        char *Lstr = Test.AnsiLastChar();//得到F
    }
    //取出AnsiString字符,这个类似vb的mid函数!
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "ABCDEF";
        int First = 3;     // 3开始取
        int Length = 2;    // 取2位
        AnsiString Getstr = Test.SubString( First , Length );
    //得到CD
    }
    //AnsiString的字母比较
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "ABCDEF";
        AnsiString Sample = "abcdef";
        int Result = Test.AnsiCompare( Sample );
    //返回1,不同!分大小写。
    }
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "ABCDEF";
        AnsiString Sample = "abcdef";
        int Result = Test.AnsiCompareIC( Sample );
    //返回0,相同!没有分大小写,哈哈
    }
    //在AnsiString中寻找字符
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "ABCDEF";
        AnsiString Sample = "E";
        int Result = Test.Pos( Sample );
    //返回5,如果你写Sample="haha",就返回0,找不到,哈哈
    }
    //在AnsiString中找字符串,和上一个类似
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "ABCDEF";
        AnsiString Sample = "EF";
        int Result = Test.Pos( Sample );
    //返回5,即E字符的位置
    }
    //判断字符串长度,类似vb的len
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "拿金币来";
        int Len = Test.Length();
    //返回8
    }
    //取得字符串,类似vb的left
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "小苹果然看了这篇文章";
        AnsiString SLstr = Test.SetLength(6);
    }//得到"小苹果"
     
    //检测双字节字串
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    AnsiString ChkStr = "你好";
    int ChkPos =  1  ;
    if ( ByteType( ChkStr , ChkPos ) == mbSingleByte ){
        Edit1->Text="0";
        }
        else{
        Edit1->Text="1";
        }//返回1,如果你写ChkStr="fxxk",就返回0
    }
    //检测空字符串
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "";
        bool chk = Test.IsEmpty();
        if (chk )
        Edit1->Text="1";//返回1
    }
    //全部变小写vs全部变大写
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "ABCdef";
        AnsiString Lstr = Test.LowerCase();
    }
    代码:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "ABCdef";
        AnsiString Ustr = Test.UpperCase();
    }
    //类似vb中Trim 的去空格函数
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "     ABCDEF      ";
        AnsiString TLstr = Test.TrimLeft();
       AnsiString TRstr = Test.TrimRight();
      AnsiString Tstr = Test.Trim();
    }
     
    //但是,这个处理不了全角的空格 代码:
    AnsiString __fastcall TForm1::TrimStr( AnsiString Tm , AnsiString LR )
    {
        // LR … L:左除去   R:右除去   B:dou除去
        int len;
        // 左除去
        if ( LR == "L" || LR == "B" ){
            len = Tm.Length();
            while ( Tm.SubString(1,1) == " " || Tm.SubString(1,2) == " "){
                // 半角除去
                if ( Tm.SubString(1,1) == " " ){
                    Tm = Tm.SubString(2,len);
                    len = Tm.Length();
                }
                // 全角除去
                else if ( Tm.SubString(1,2) == " " ){
                    Tm = Tm.SubString(3,len);
                    len = Tm.Length();
                }
            }
        }
        // 右除去
        if ( LR == "R" || LR == "B" ){
            len = Tm.Length();
            while ( Tm.SubString(len,1) == " " || Tm.SubString(len-1,2) == " " ){
                // 半角除去
                if ( Tm.SubString(len,1) == " " ){
                    len = Tm.Length();
                    Tm = Tm.SubString(1,len-1);
                    len = Tm.Length();
                }
                // 全角除去
                else if ( Tm.SubString(len-1,2) == " " ){
                    len = Tm.Length();
                    Tm = Tm.SubString(1,len-2);
                    len = Tm.Length();
                }
            }
        }
        return Tm;
    }
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Test = "  拳脚  ";
        AnsiString Ret = TrimStr(Test,"B")
    }
     
    //相同字符重复输入
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Soc = AnsiString::StringOfChar( '*' , 100 );
       Edit1->Text=Soc ;//显示100个*
    }
    //字符串替换
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Str = "Borland C++ Builder is free"; 
        AnsiString From = "C++ Builder";                     
        AnsiString To = "Delphi";                             
        AnsiString Result;                                     
        Result = StringReplace( Str, From, To, TReplaceFlags() <<
    rfReplaceAll << rfIgnoreCase );
    //<<后是参数,得到Borland Delphi is free
    }
    //全角变半角
        AnsiString Zen = "1234567890";
        int Len = Zen.Length();
        char buf[MAX_PATH];
        ZeroMemory( buf, sizeof( buf ) );
        LCMapString( GetUserDefaultLCID(), LCMAP_HALFWIDTH, Zen.c_str(), Len, buf, sizeof( buf ) );
        AnsiString Han = AnsiString( buf );
        Edit1->Text=Han;
     
    //半角变全角
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString Han = "1234567890";
        int Len = Han.Length();
        char buf[MAX_PATH];
        ZeroMemory( buf, sizeof( buf ) );
        LCMapString( GetUserDefaultLCID(), LCMAP_FULLWIDTH, Han.c_str(), Len, buf, sizeof( buf ) );
        AnsiString Zen = AnsiString( buf );
    }

  • 相关阅读:
    手把手带你画一个 时尚仪表盘 Android 自定义View
    新手自定义view练习实例之(二) 波浪view
    新手自定义view练习实例之(一) 泡泡弹窗
    增加辅助的数据库组件
    解决Plugin is too old,please update to a more recent version,or set ANDROID_DAILY_OVERRIDE..
    Android 自定义View -- 简约的折线图
    android 开源图表库MPChart最简单使用方法示例教程Demo--折线图 柱状图
    改善database schema
    题解报告:hdu 2057 A + B Again
    hdu 2087 剪花布条(KMP入门)
  • 原文地址:https://www.cnblogs.com/cpprun/p/2660767.html
Copyright © 2011-2022 走看看