Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Свойство Delimiter компонента TStringList

11K
27 октября 2006 года
proc
32 / / 23.07.2006
Необходимо разбить строку "Мама моет^раму" на строки "Мама моет" и "раму". Пишу код:

 
Код:
List2->Delimiter='^';
List2->DelimitedText="Мама моет^раму";
for(int i=0;i<List2->Count;i++)
ShowMessage(List2->Strings);


В List2 записываются три строки: "Мама", "моет", "раму". То есть по умолчанию пробел тоже считается разделителем, получается, что разделителя два. Как сделать так, чтобы пробел не принимался за знак разбиения строк на подстроки.
3.0K
28 октября 2006 года
Мerlin
267 / / 25.07.2006
Недавно был такой вопрос и оказалось, что TStringList на этот счет немношко крывой.
Два варианта. Перед разбиением заменить пробел например на '#', и после разбиения вернуть все обратно. Или разбить на отдельные строк вручную:
Код:
void splitSentence(TStringList *slist, String &str, char delim)
{
  char *fst = str.c_str();
  while(*fst!=0)
  {
    char *lst = strchr(fst, delim);
    if(lst==NULL)
    {
      slist->Add(fst);
      break;
    }
    *lst = 0;
    slist->Add(fst);
    *lst = delim;
    fst = lst + 1;
  }
}
11K
30 октября 2006 года
proc
32 / / 23.07.2006
Оказалось, что если просто присвоить конкретную строку, набрав ее в билдере, то она разбивается как нужно. Но в моей программе, я загружаю текст из файла в TStringList1, затем перевожу текст из досовской кодировки функцией OemToChar, и в TStringList2 передаю DelimitedText=TStringList1->Strings. В результате во втором листе получается три строки, для нашего примера: 1.Мама 2.моет 3. раму. Вот код программы:

Код:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TStringList *List1=new TStringList,*List2=new TStringList;
int strnum=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        List1->LoadFromFile("F:\\base.txt");
        for(int i=0;i<List1->Count;i++)
        {
                OemToChar(List1->Strings.c_str(),List1->Strings.c_str());
                ListBox1->Items->Add(List1->Strings);
        }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
        delete List1,List2;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
        for(int i=0;i<ListBox1->Items->Count;i++)
        {
                if(ListBox1->Selected)
                {
                        strnum=ListBox1->ItemIndex;
                }
        }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        List2->Clear();
        List2->Delimiter='^';
        List2->DelimitedText=List1->Strings[strnum];
        for(int i=0;i<List2->Count;i++)
                ShowMessage(List2->Strings);
}


Подскажите, где ошибка?
547
31 октября 2006 года
Hydra
488 / / 20.06.2006
Если добавить List2->QuoteChar='^' и задать текст в виде "мама мыла"^"раму", то работать будет, а так он разделителем пробел по умолчанию считает.
11K
31 октября 2006 года
proc
32 / / 23.07.2006
[QUOTE=Hydra]Если добавить List2->QuoteChar='^' и задать текст в виде "мама мыла"^"раму", то работать будет, а так он разделителем пробел по умолчанию считает.[/QUOTE]

Ты имеешь ввиду создать строку вида: AnsiString str="мама мыла"+'^'+"раму"? А какая разица? Или я что-то не понял? А с QuoteChar я пробовал, все равно пробелы разбивает.
3.0K
31 октября 2006 года
Мerlin
267 / / 25.07.2006
Код:
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  TStringList *List1=new TStringList;
  List1->LoadFromFile("F:\\base.txt");
  for(int i=0;i<List1->Count;i++)
  {
    OemToChar(List1->Strings.c_str(),List1->Strings.c_str());
    char *fst = List1->Strings.c_str();
    while(*fst!=0)
    {
      char *lst = strchr(fst, '^');
      if(lst==NULL)
      {
        ListBox1->Items->Add(fst);
        break;
      }
      *lst = 0;
      ListBox1->Items->Add(fst);
      *lst = '^';
      fst = lst + 1;
    }
  }
  delete List1;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог