Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2011, 15:47   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
Восклицание Разбить по колонкам Listview запись вида 1|2|3

Всем привет!

Трабл:
Есть txt файл с записями вида:
Код:
В колонку #1|В колонку #2|В колонку #3
Нужно эту запись разобрать по состовным. Знак | отделяет одно от другого.

Вот что у меня получилось:
Код:
procedure TForm1.sButton1Click(Sender: TObject);
var
  Ts: TStringList;
  Ecaption, EText, Etype: array of string;
  myDir: string;
  i: Integer;
begin
  myDir := ExtractFilePath(ParamStr(0));
  Ts := TStringList.Create;
  try
    Ts.LoadFromFile(myDir + 'User.txt');
    SetLength(Ecaption, Ts.Count);
    SetLength(EText, Ts.Count);
    SetLength(Etype, Ts.Count);
    for i := 0 to Ts.Count - 1 do
    begin
      //получаем текст до 1-ого символа :
      Ecaption[i] := Copy(Ts.Strings[i], 1, Pos('|', Ts.Strings[i]) - 1);
      //получаем текст после 1-ого символа :
      EText[i] := Copy(Ts.Strings[i], Pos('|', Ts.Strings[i]) + 1, Length(Ts.Strings[i]));

    end;

    for i := 0 to Length(Ecaption) - 1 do
    begin
      RichEdit1.Lines.Add(Ecaption[i] + '   ' + Etext[i]);
    end;
  finally
    Ts.Free;
  end;
end;
Получается со строкой:
Код:
В колонку #1|В колонку #2|В колонку #3
выходит:
Код:
В колонку #1   В колонку #2|В колонку #3
как в Etext занести только часть строки "В колонку #2"
а в Etype только " колонку #3"

Пожалуйста, помогите разобраться!
Человек_Борща вне форума Ответить с цитированием
Старый 13.02.2011, 16:31   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Примерно так:
Код:
s:='В колонку #1|В колонку #2|В колонку #3';
i:=pos('|',s);
if i>0 do  Куда-то:=copy(s,1,i-1)

delete(s,1,i);i:=pos('|',s);
if i>0 do  Etype:=copy(s,1,i-1)

delete(s,1,i);i:=pos('|',s);
if i>0 do  Etype:=copy(s,1,i-1)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.02.2011, 17:48   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Хм идея с удалением меня не навещала....

Вот что у меня получилось:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  Ts: TStringList;
  LI:TListItem;
  i,i2, iP: integer;
  TmpStr, myDir: string;
  Ecaption, EText, Etype: array of string;
begin
  myDir := ExtractFilePath(ParamStr(0));
  LI:=ListView1.Items.Add;
  Ts := TStringList.Create;
  try
    Ts.LoadFromFile(myDir + 'User.txt');
    SetLength(Ecaption, Ts.Count);
    SetLength(EText, Ts.Count);
    SetLength(Etype, Ts.Count);
    for i := 0 to Ts.Count - 1 do
    begin
      TmpStr := Ts.Strings[i];
      iP := AnsiPos('|', TmpStr);
        if iP > 0 then
        begin
          Ecaption[i] := Copy(TmpStr, 1, iP - 1);
        Delete(TmpStr, 1, iP);
        end;

        iP := AnsiPos('|', TmpStr);
        if iP > 0 then
        begin
          EText[i] := Copy(TmpStr, 1, iP - 1);
        Delete(TmpStr, 1, iP);
        end;

        iP := AnsiPos('|', TmpStr);
        if iP > 0 then
          Etype[i] := Copy(TmpStr, 1, iP - 1);
    end;

    for i2:=0 to Length(ECaption) -1 do
    begin
    Li.Caption:=ECaption[i2];
    Li.SubItems.Add(EText[i2]);
    LI.SubItems.Add(Etype[i2]);
    end;
  finally
    Ts.Free;
  end;
end;
Содержимое txt:
Код:
Начало 0|Серенида 0|1 
Начало 1|Середина 1|1 
Начало 2|Середина 2|1
Начало_|Середина_|
Но всеравно не очень хорошо работает. Подскажите где ошибки, и как привильно надо кодить, пожалуйста=)
Вложения
Тип файла: zip myTest.zip (178.7 Кб, 10 просмотров)

Последний раз редактировалось Человек_Борща; 13.02.2011 в 17:50.
Человек_Борща вне форума Ответить с цитированием
Старый 13.02.2011, 21:00   #4
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  str: string;
begin
  str := 'В колонку #1|В колонку #2|В колонку #3';
  repeat
    Memo1.Lines.Add(Copy(str, 1, Pos(':=',str) - 1));
    Delete(str,1, Pos(':=',str) + 1);
  until Pos(':=',str) = 0;
  Memo1.Lines.Add(Copy(str, 1, Length(str)));
  Delete(str,2, Length(str));
end;
VirusN13

Последний раз редактировалось ArtGrek; 13.02.2011 в 21:03.
ArtGrek вне форума Ответить с цитированием
Старый 13.02.2011, 21:34   #5
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Код:
Procedure SaveListView(S: String; ListView1: TListView);
Const Delimiter = '|';
Var ff: TextFile;
    t: Integer;
begin
 AssignFile(ff, S);
 ReWrite(ff);
 try
  With ListView1 Do For t:=0 to Items.Count - 1 Do
  WriteLn(ff,StringReplace(Items[t].Caption + Delimiter +
  Items.Item[t].SubItems.Text,#13#10,Delimiter,[rfReplaceAll]));
 finally
  CloseFile(ff);
 end;
end;

{$R *.dfm}

Procedure ReadListView(S: String; ListView1: TListView);
Const Delimiter = '|';
Var ff: TextFile;

Begin
 AssignFile(ff, S);
 Reset(ff);
 try
  While not Eof(ff) Do
   Begin
    ReadLn(ff,S);
    With ListView1.Items.Add Do
     Begin
      Caption:=Copy(S,1,Pos(Delimiter,S)-1);
      System.Delete(S,1,Pos(Delimiter,S));
      S:=StringReplace(S,Delimiter,#13#10,[rfReplaceAll]);
      SubItems.Text:=S;
     End; {With}
   End; {While}
 finally
  CloseFile(ff);
 end;
End;
bulldog5293 вне форума Ответить с цитированием
Старый 14.02.2011, 00:09   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Благодарен, ваш код работает.
Но почему выводи только последнюю строку из файла?
Вот переделалпод свой лад:
Код:
procedure LoadToLV(FName: string; Lv: TListView);
const
  Delim = '|';
var
  Ts: TStringList;
  i: Integer;
  LI: TListItem;
  s: string;
begin
  Ts := TStringList.Create;
  Li := Lv.items.add;    //Наш ListView
  try
    Ts.LoadFromFile(FName);  //Грузим файл
    for i := 0 to Ts.Count - 1 do  //пересчитываем строки
    begin
      s := Ts.Strings[i];   //загружаем строку в переменную
      Li.Caption := Copy(s, 1, Pos(Delim, s) - 1);   //копирует тест до первого | в  колонку 1
      Delete(s, 1, Pos(Delim, s)); //Удаляем текст до первого | (включая этот знак)
      S := StringReplace(s, Delim, #13#10, [rfReplaceAll]);     //Заменяем | на ????
      Li.SubItems.Text := s;  //вставляем текст
    end;
  finally
    Ts.Free;     //освобожаем
  end;
end;
в чём причина?



__A-D-D-E-D__

Ну решил проблему=)

Вот что у меня получилось:
Код:
procedure LoadToLVFromFile(Fname: string);

  procedure LoadToLV(S: string; Lv: TListView);
  const
    Delim = '|'; 
  var
    LI: TListItem; 
  begin
    Li := Lv.items.add;

    Li.Caption := Copy(s, 1, Pos(Delim, s) - 1);  
    Delete(s, 1, Pos(Delim, s));
    S := StringReplace(s, Delim, #13#10, [rfReplaceAll]);
    Li.SubItems.Text := s;
  end;

var
  i: Integer;
  Ts: TStringList;
begin
  TS := TStringList.create;
  try
    Ts.LoadFromFile(Fname); 
    for i := 0 to Ts.Count - 1 do 
    begin
      LoadToLV(Ts.Strings[i], Form1.ListView1);
    end;
  finally
    TS.Free;
  end;
end;
bulldog5293,
Всё же хочется задать вопрос:
Что делает код:
Код:
S := StringReplace(s, Delim, #13#10, [rfReplaceAll]);
я понимаю что заменяет все символы Delim на символ #13#10
Можно описать зачем это надо делать?

Последний раз редактировалось Человек_Борща; 14.02.2011 в 01:03.
Человек_Борща вне форума Ответить с цитированием
Старый 14.02.2011, 23:46   #7
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Благодарен, ваш код работает.
Но почему выводи только последнюю строку из файла?
Вот переделалпод свой лад:
Код:
procedure LoadToLV(FName: string; Lv: TListView);
const
  Delim = '|';
var
  Ts: TStringList;
  i: Integer;
  LI: TListItem;
  s: string;
begin
  Ts := TStringList.Create;
  Li := Lv.items.add;    //Наш ListView
  try
    Ts.LoadFromFile(FName);  //Грузим файл
    for i := 0 to Ts.Count - 1 do  //пересчитываем строки
    begin
      s := Ts.Strings[i];   //загружаем строку в переменную
      Li.Caption := Copy(s, 1, Pos(Delim, s) - 1);   //копирует тест до первого | в  колонку 1
      Delete(s, 1, Pos(Delim, s)); //Удаляем текст до первого | (включая этот знак)
      S := StringReplace(s, Delim, #13#10, [rfReplaceAll]);     //Заменяем | на ????
      Li.SubItems.Text := s;  //вставляем текст
    end;
  finally
    Ts.Free;     //освобожаем
  end;
end;
в чём причина?



__A-D-D-E-D__

Ну решил проблему=)

Вот что у меня получилось:
Код:
procedure LoadToLVFromFile(Fname: string);

  procedure LoadToLV(S: string; Lv: TListView);
  const
    Delim = '|'; 
  var
    LI: TListItem; 
  begin
    Li := Lv.items.add;

    Li.Caption := Copy(s, 1, Pos(Delim, s) - 1);  
    Delete(s, 1, Pos(Delim, s));
    S := StringReplace(s, Delim, #13#10, [rfReplaceAll]);
    Li.SubItems.Text := s;
  end;

var
  i: Integer;
  Ts: TStringList;
begin
  TS := TStringList.create;
  try
    Ts.LoadFromFile(Fname); 
    for i := 0 to Ts.Count - 1 do 
    begin
      LoadToLV(Ts.Strings[i], Form1.ListView1);
    end;
  finally
    TS.Free;
  end;
end;
bulldog5293,
Всё же хочется задать вопрос:
Что делает код:
Код:
S := StringReplace(s, Delim, #13#10, [rfReplaceAll]);
я понимаю что заменяет все символы Delim на символ #13#10
Можно описать зачем это надо делать?
Я так понимаю, чтобы загружать текст в разные сабитемы т.к. текст, чтобы разделить на несколько сабитемов мы должны сделать так:
ListView->Items->Item[..]->SubItems->Text='адын'+#13+'два';
при этом мы получим 2 заполненных сабитема.

Мб я ошибаюсь и мир вообще не существует.
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 15.02.2011, 00:27   #8
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Оффтоп...
Зачем цитировать-то такую простыню ? В чем великий смысл сего действа ?
Цитата:
3. Не флудить. Флудом (пустой болтовней) считается все, не относящееся к теме. Здесь вам не чат, а форум серьезно увлеченных людей.
К флуду относится также:
- необоснованное (не требующееся по смыслу) цитирование предыдущего поста;
- оверквотинг (избыточное цитирование). При цитировании имеет смысл оставлять в цитате только тот текст, который имеет непосредственное отношение к вашему ответу.
- размещение своих постов подряд друг за другом - пользуйтесь кнопкой "Правка" для изменения своего сообщения. Исключение составляют лишь случаи, когда с момента написания предыдущего поста прошло не менее дня.
Или со зрением плохо и в соседнюю, меньшую кнопку попасть трудно ?
asmodey1 вне форума Ответить с цитированием
Старый 15.02.2011, 00:39   #9
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от asmodey1 Посмотреть сообщение
Оффтоп...
Зачем цитировать-то такую простыню ? В чем великий смысл сего действа ?

Или со зрением плохо и в соседнюю, меньшую кнопку попасть трудно ?
Каюсь, не заметил кнопки.
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись в типизированный файл из ListView alien^ka Общие вопросы Delphi 0 02.12.2010 19:21
Как разбить число на цифрыКак разбить число на цифры: 3241 => 3,2,4,1 (Pascal) Banderas123 Помощь студентам 3 07.12.2009 18:26
Вопрос по колонкам Sigrom Компьютерное железо 8 20.10.2009 09:19
Отбор по колонкам Romuald Microsoft Office Excel 35 28.12.2007 11:40