| 
| 
 | Вопрос # 3 167/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!Есть текст такого вида: (именно такого, точь в точь)
 
 *.cda
 *.flac;*.fla
 *.midi;*.mid;*.rmi;*.kar
 *.wma
 *.wv
 *.aac
 *.ac3
 *.adx
 *.m4a
 *.ape;*.mac
 *.mpc;*.mp+;*.mpp
 *.ofr;*.ofs
 *.spx
 *.tta
 
 Как можно добавить каждое расширение в List box, тоесть чтобы было так
 .cda
 .flac
 .fla
 .midi
 и т д
 
 то есть опуская звездочки и точки с запятой... я попытался реализовать так, что он функцией Pos ищет точку, запоминает ее положение, ищет точку с запятой, запоминает ее положение, копирует в новую строчку все то что между первым и вторым положением, и зразу это удаляет, и идет дальше искать, мне кажется это очень муторно, и почему то это не работает :) Подскажите пожалуйста как это можно реализовать :)
 
|  |   Вопрос задал: BloodVIRUS (статус: Посетитель)Вопрос отправлен: 9 сентября 2009, 21:10
 Состояние вопроса: открыт, ответов: 3.
 |  Ответ #1. Отвечает эксперт: Мережников Андрей Здравствуйте, BloodVIRUS!listbox1.items.loadfromfile('имя файла');
 listbox1.items.text:=AnsiReplaceStr(listbox1.items.text,';',#10#13);
 
|  | Ответ отправил: Мережников Андрей (статус: Абитуриент)Время отправки: 9 сентября 2009, 21:38
 
 |  Ответ #2. Отвечает эксперт: Вадим К Здравствуйте, BloodVIRUS!Можно, просто и красиво:)  суть в том, что бы заменить точку с запятой на перевод строки.
 
 var sl:TStringList;
s:string;
begin
sl := TStringList.create;
sl.LoadFromFile('file.ext');//или с другого места подгружаем данные.
s := sl.text;
sl.free;
s := ReplaceString(s, ';',#13#10, [rfReplaceAll]);
ListBox1.Text := s;Вроде не сделал ошибок.
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 9 сентября 2009, 21:41
 
 |  Ответ #3. Отвечает эксперт: min@y™ Ну, где-то примерно так:
 procedure ExtentionsToListBox(AText: TStrings; AListBox: TListBox);
var
  Index, j: Integer;
  Temp: TStringList;
begin
  AListBox.Clear();
  Temp:= TStringList.Create;
  try
    Temp.Delimiter:= ';';
 
    for Index:= 0 to AText.Count - 1 do
      begin
        Temp.DelimitedText:= AText[Index];
 
        for j:= 0 to Temp.Count - 1 do
          AListBox.Items.Add(ExtractFileExt(Temp[j]));
      end;
  finally
    Temp.Free();
  end;
end;
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 9 сентября 2009, 21:46
 Оценка за ответ: 5
 Комментарий к оценке: безупречно ) |  
 Мини-форум вопросаВсего сообщений: 5; последнее сообщение — 10 сентября 2009, 05:37; участников в обсуждении: 4. 
|   | IlluminatI (статус: 2-ой класс), 9 сентября 2009, 21:25 [#1]:Привет BloodVIRUS! Уверен, эксперты подскажут более эффективный код, но, все же, мое решение:
 
 вот ваш файл (с расставленными ";"):
 
 *.cda;
 *.flac;*.fla;
 *.midi;*.mid;*.rmi;*.kar;
 *.wma;
 *.wv;
 *.aac;
 *.ac3;
 *.adx;
 *.m4a;
 *.ape;*.mac;
 *.mpc;*.mp+;*.mpp;
 *.ofr;*.ofs;
 *.spx;
 *.tta;
 --------
 
 Кидаем на форму Мемо1, Лист Бокс, и кнопку. Пишем такой код в OnClick для кнопки:
 
 procedure TForm1.Button1Click(Sender: TObject);
 var i: integer;
 s, st: string;
 begin
 Memo1.Lines.LoadFromFile('<имя файла>.txt');
 s:=Memo1.Text;
 while pos('*',s)>0 do
 delete(s, pos('*',s),1);
 while pos(#13#10,s)>0 do
 delete(s,pos(#13#10,s),2);
 while pos('.',s)>0 do
 begin
 st:=Copy(s,pos('.',s),pos(';',s)-1);
 delete(s,pos('.',s),pos(';',s));
 ListBox1.Items.Add(st);
 st:='';
 end;
 end;
 |  
|   | Мережников Андрей (статус: Абитуриент), 9 сентября 2009, 21:39 [#2]:упс, перепутал местами #10 и #13 |  
|   | Вадим К (статус: Академик), 9 сентября 2009, 21:44 [#3]:вот я не помню, функция AnsiReplaceStr заменяет только первое вхождение или все? И я бы не рекомендовал привыкать явно в Ansi функциям. делфи 2009 и 2010 уже есть и потом всплывут проблемы с юникодом.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Мережников Андрей (статус: Абитуриент), 10 сентября 2009, 05:37 [#5]:to Вадим К - AnsiReplaceStr заменяет все вхождения. А по поводу юникода - Вы правы. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |