2010年9月3日金曜日

SplitStringを試してみる。

Delphi XEでSplitString関数が追加された。VBにあって、Delphiになかった関数で
個人的には気になってた関数です。(欲しかった関数です。)

で、ちょっとためしてみた。

以下、ソースコード

  1. unit Unit1;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs, StdCtrls;  
  8.   
  9. type  
  10.   TForm1 = class(TForm)  
  11.     Button1: TButton;  
  12.     Label1: TLabel;  
  13.     ListBox1: TListBox;  
  14.     procedure Button1Click(Sender: TObject);  
  15.   private  
  16.     { Private 宣言 }  
  17.   public  
  18.     { Public 宣言 }  
  19.   end;  
  20.   
  21. var  
  22.   Form1: TForm1;  
  23.   
  24. implementation  
  25.   
  26. {$R *.dfm}  
  27.   
  28. uses  
  29.   StrUtils,Types;  
  30.   
  31. procedure TForm1.Button1Click(Sender: TObject);  
  32. var  
  33.   TestString : String;  
  34.   SplitResult:TStringDynArray;  
  35. begin  
  36.   TestString := 'フリーダム,ジャスティス,デストロイ,セイバー';  
  37.   SplitResult := SplitString(TestString,',');  
  38.   Label1.Caption := TestString;  
  39.   
  40.   for TestString in SplitResult do begin  
  41.     ListBox1.Items.Add(TestString);  
  42.   end;  
  43.   
  44. end;  
  45.   
  46. end.  

Visual Basicライクで非常に簡単に使えます。

内部的には、FindDelimiter関数を使ってDelemeterをみつけ
Copy関数で部分文字列を切り出してます。

これなら、下位バージョンでも実装できそうですね。

ところでFindDelimiter関数は、いつから存在したのでしょうか?
個人的には、Delphiにはまだまだ知らない便利な関数が一杯ありそうです。


2010.09.10 山本隆の開発日記で紹介して頂いたので
調子にのってC++ Builderで書いてみました。
(C++は自信がないので、役に立つかどうかわかりませんが・・・)

  1. //---------------------------------------------------------------------------  
  2.   
  3. #include <vcl.h>  
  4. #include <strutils.hpp>  
  5. #pragma hdrstop  
  6.   
  7. #include "Unit1.h"  
  8. //---------------------------------------------------------------------------  
  9. #pragma package(smart_init)  
  10. #pragma resource "*.dfm"  
  11. TForm1 *Form1;  
  12. //---------------------------------------------------------------------------  
  13. __fastcall TForm1::TForm1(TComponent* Owner)  
  14.  : TForm(Owner)  
  15. {  
  16.   
  17. }  
  18. //---------------------------------------------------------------------------  
  19. void __fastcall TForm1::Button1Click(TObject *Sender)  
  20. {  
  21.   
  22.  UnicodeString TestString = "イージス|バスター|デュエル|ブリッツ|ストライク";  
  23.   
  24.  LabeledEdit1->Text = TestString;  
  25.   
  26.  TStringDynArray SplitResult = SplitString(TestString,"|");  
  27.   
  28.  for (int i = 0; i < SplitResult.Length; i ++) {  
  29.   ListBox1->Items->Add(SplitResult[i]);  
  30.  }  
  31.   
  32.  SplitResult.set_length(0);  
  33.   
  34. }  
  35. //---------------------------------------------------------------------------  
  36.   
  37. </strutils.hpp></vcl.h>  

2 件のコメント:

匿名 さんのコメント...

ListBox1.Items の DelimitedText を使えばすむと思いますがどうでしょう?

OldTPFun さんのコメント...

今までは、自作するか、ご指摘のような
メソッドを使っていましたが、文字列を分割するためだけに、クラスを生成するのは、どうかなぁ?というのがありまして、軽量な関数が欲しいと思っておりました。