| 
| 
 | Вопрос # 1 381/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!У меня в ListBox из prn-файла загружаются столбцы цифр,теперь мне надо выгрузить из  ListBox их в 2-х мерный динамический массив,произвести с ними кое-какие действия и снова загрузить массив в  ListBox.Помогите мне с кодом выгрузки и загрузки. 
|  |   Вопрос задал: GAZ (статус: Посетитель)Вопрос отправлен: 27 февраля 2008, 17:44
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: min@y™ Почитал я форум и по твоим постам написал примерчик тебе. Прицепляю файл к ответу.К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)
 
 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 28 февраля 2008, 09:30
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 11; последнее сообщение — 1 марта 2008, 08:29; участников в обсуждении: 3. 
|   | Feniks (статус: Бакалавр), 27 февраля 2008, 18:08 [#1]:А как вы, интересно, бо мы не телепаты, заполняете в несколько колонок своими цифрами, если у TListBox по определению всегда только одна колонка текста TStrings ? Может вы в одну строку вставляете несколько цифр через какой-то знак-разделитель ? Так может в таких случаех проще использовать TStringGrid ? И сам массив двумерный динамический мы умеете создавать ?
 |  
|   | GAZ (статус: Посетитель), 27 февраля 2008, 18:24 [#2]:Feniks В строке допустим 5 цифр, разделитель пробелы.С динамическими массивами тоже проблем нет.TStringGrid не подходит для других операций.А по существу вопроса можете ответить ?
 |  
|   | GAZ (статус: Посетитель), 27 февраля 2008, 18:29 [#3]:Да ещё prn-файл формирую не я,загружаю его так ListBox1.Items.LoadFromFile(OpenDialog1.FileName);
 |  
|   | Вадим К (статус: Академик), 28 февраля 2008, 00:31 [#4]:А почему люди придумывают себе решение, потом упираются в что то непонятное для них и "подняв лапки вверх" говорят "не знаю, не понимаю"? Почему не грузить сразу с файла данные? А в листбокс можно и загрузить старым методом. Вот если бы привели формат данных, вот это другое дело.
 А также ответили на такие вопросы
 1) количество столбцов постоянно, переменно, известно ли оно зарание.
 2) кол-во пробелов между числами одинаково, или данные выровненны "столбцами" - тоесть числа привязаны к своей позиции.
 Без этого ответить на ваш вопрос никак нельзя. Телепаты  в отпуске.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | GAZ (статус: Посетитель), 28 февраля 2008, 06:24 [#5]:Вадиму К Количество столбцов постоянно(9),с пробелами наверное ваше второе предположение,столбцы ровные, а числа в них различные(есть и целые,и дробные,и отрицательные).
 Почему не сразу в массив,долго объяснять,но если кратко,необходима автоматическая,а потом ещё и ручная выборка.
 |  
|   | Вадим К (статус: Академик), 28 февраля 2008, 16:06 [#6]:Сами данные где? покажите их или они секретные? Иначе кода вам не видеть. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | GAZ (статус: Посетитель), 28 февраля 2008, 17:59 [#7]:Вадиму К По моему вы задаёте совершенно не нужные вопросы
 
 1) количество столбцов постоянно, переменно, известно ли оно зарание.
 
 Да какая разница
 SL := TStringList.Create;
 try
 for j := 0 to ListBox2.Count - 1 do
 begin
 SL.Clear;
 SL.Delimiter := #32;
 SL.DelimitedText := ListBox2.Items.Strings[j];
 if j = 0 then
 SetLength(ArrayPoint,ListBox2.Count,SL.Count);//задаём длину динамического массива
 for i := 0 to SL.Count-1 do
 begin
 temp_mas := SL[i];
 ........
 ArrayPoint[j,i]:= strtofloat(temp_mas );
 end;
 end;
 finally
 SL.Free;
 end;
 
 2) кол-во пробелов между числами одинаково, или данные   выровненны "столбцами" - тоесть числа привязаны к своей позиции.
 
 Ну а это зачем,главное принцип,а кол-во я и сам задам
 ListBox3.Clear;
 try
 for j:=0 to High(ArrayPoint) do
 begin
 mas_temp  := ' ';
 for i:=0 to Length(ArrayPoint[j]) do
 begin
 mas_temp := mas_temp + FloatToStrF(ArrayPoint[j,i],ffFixed,10,4)+ '   ';
 end;
 ListBox3.Items.Add(mas_temp);
 except
 on E: Exception do
 ShowMessage(E.Message);
 end;
 
 3)Сами данные где?
 
 А это для чего?
 |  
|   | Вадим К (статус: Академик), 28 февраля 2008, 23:11 [#8]:Так-с, сами написали причем первый пример - конвертирование с файла, а второй в файл (ну в листбокс, какая разница). Хотя код написан немного плоховато, но теперь я не понимаю в чём-же вопрос.
 
 по поводу пункта 3. Я могу конечно написать универсальный парсер, но думаю, вы будете долго разбирать код. Поэтому, я и хотел увидеть реальные данные, по которым бы и был написан парсер для данного случая
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | GAZ (статус: Посетитель), 29 февраля 2008, 06:16 [#9]:Вадиму К Да написал сам,потому что не получил ответ.
 ... Хотя код написан немного плоховато...
 Вот и научите или подскажите как лучше,в чём недостаток.
 ...Я могу конечно написать универсальный парсер, но думаю, вы будете долго разбирать код...
 Если вы так думаете, почему бы в этих местах не поставить коментарий
 |  
|   | Вадим К (статус: Академик), 29 февраля 2008, 23:41 [#10]:Первое. Уж извините, но эксперты не пишут решение задач только потому, что человеку лень разбираться. По крайней мере я не пишу. ведь каждый готовый код только отупляет. коментарий к коду
 1 пример - если StrToFloat даст ошибку, то дальнейший код считывания данных перестанет выполняться. И массив окажеться инициализированным на половину. Если уж ошибка произошла, то лучше сразу пользователю кричать об этом. В данном случае это могло бы выглядеть где то так
 
 try
  ArrayPoint[j,i]:= strtofloat(temp_mas );
except
  ShowMessage('При преобразовании произошла ошибка!');
  exit;
end;не смотря на то, что здесь написан exit - тоесть покинуть процедуру, деструктор в блоке finally отработает. Можно конечно не просто вывести сообщение, а ещё и сообщить в какой строке, какой текст не понравился. Например так
 ShowMessage(Format('Упс. У нас накладка в строке номер %d. Ожидалось число, а найдено "%s". ',[j, temp_mas]));Дальше. А что же произойдёт, если в качестве разделителя будет не один пробел, а два... или больше. подумайте над этим.второй пример
 в коде используется то Length, то High в случае с Length забываем "минус один", мелочь, компилятор умолчит, а потом полезут глюки, в самый неподходящий момент. Также не советую "смешивать стили". Используйте или одну или другую функцию.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | GAZ (статус: Посетитель), 1 марта 2008, 08:29 [#11]:Вадиму К Согласен,а вот с
 ...А что же произойдёт, если в качестве разделителя будет не один пробел, а два... или больше. подумайте над этим... нет.
 У меня в моих данных сначала идёт один пробел,затем три раза по шесть,потом опять по одному и в конце четыре пробела,на заполнение массива это не влияет
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |