Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 381

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!У меня в ListBox из prn-файла загружаются столбцы цифр,теперь мне надо выгрузить из ListBox их в 2-х мерный динамический массив,произвести с ними кое-какие действия и снова загрузить массив в ListBox.Помогите мне с кодом выгрузки и загрузки.

GAZ Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: GAZ (статус: Посетитель)
Вопрос отправлен: 27 февраля 2008, 17:44
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Почитал я форум и по твоим постам написал примерчик тебе. Прицепляю файл к ответу.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 28 февраля 2008, 09:30
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 11; последнее сообщение — 1 марта 2008, 08:29; участников в обсуждении: 3.
Feniks

Feniks (статус: Бакалавр), 27 февраля 2008, 18:08 [#1]:

А как вы, интересно, бо мы не телепаты, заполняете в несколько колонок своими цифрами, если у TListBox по определению всегда только одна колонка текста TStrings ?
Может вы в одну строку вставляете несколько цифр через какой-то знак-разделитель ? Так может в таких случаех проще использовать TStringGrid ? И сам массив двумерный динамический мы умеете создавать ?
GAZ

GAZ (статус: Посетитель), 27 февраля 2008, 18:24 [#2]:

Feniks
В строке допустим 5 цифр, разделитель пробелы.С динамическими массивами тоже проблем нет.TStringGrid не подходит для других операций.А по существу вопроса можете ответить ?
GAZ

GAZ (статус: Посетитель), 27 февраля 2008, 18:29 [#3]:

Да ещё prn-файл формирую не я,загружаю его так
ListBox1.Items.LoadFromFile(OpenDialog1.FileName);
Вадим К

Вадим К (статус: Академик), 28 февраля 2008, 00:31 [#4]:

А почему люди придумывают себе решение, потом упираются в что то непонятное для них и "подняв лапки вверх" говорят "не знаю, не понимаю"?
Почему не грузить сразу с файла данные? А в листбокс можно и загрузить старым методом. Вот если бы привели формат данных, вот это другое дело.
А также ответили на такие вопросы
1) количество столбцов постоянно, переменно, известно ли оно зарание.
2) кол-во пробелов между числами одинаково, или данные выровненны "столбцами" - тоесть числа привязаны к своей позиции.
Без этого ответить на ваш вопрос никак нельзя. Телепаты в отпуске.
Галочка "подтверждения прочтения" - вселенское зло.
GAZ

GAZ (статус: Посетитель), 28 февраля 2008, 06:24 [#5]:

Вадиму К
Количество столбцов постоянно(9),с пробелами наверное ваше второе предположение,столбцы ровные, а числа в них различные(есть и целые,и дробные,и отрицательные).
Почему не сразу в массив,долго объяснять,но если кратко,необходима автоматическая,а потом ещё и ручная выборка.
Вадим К

Вадим К (статус: Академик), 28 февраля 2008, 16:06 [#6]:

Сами данные где? покажите их или они секретные? Иначе кода вам не видеть.
Галочка "подтверждения прочтения" - вселенское зло.
GAZ

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

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

GAZ (статус: Посетитель), 1 марта 2008, 08:29 [#11]:

Вадиму К
Согласен,а вот с
...А что же произойдёт, если в качестве разделителя будет не один пробел, а два... или больше. подумайте над этим... нет.
У меня в моих данных сначала идёт один пробел,затем три раза по шесть,потом опять по одному и в конце четыре пробела,на заполнение массива это не влияет

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:25
Выполнено за 0.02 сек.