Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.08.2010, 17:11
Rhot Rhot вне форума
Прохожий
 
Регистрация: 27.07.2010
Сообщения: 12
Репутация: 10
По умолчанию Чтение текстового файла

Здравстуйте, есть такая проблема:

Есть текстовый фаил формата:

1234 3214 2431
4311 2314 2233
4123 4123 1245

(на самом деле файл больше, не 3на3 а 6на20)

И есть набор едитбоксов, задача считать этот файл и вывести значения в едитбоксы в виде таблицы, такого же формата.
Как сделать это наиболее эффективно, не выписывая килотонну кода?

Так же интересует сама реализация считывания, т.к. формат известен, то можно сделать переменные (или массив) string[5] и идти через обычный read(фаил, переменные) и в конце строки писать readln (это чтобы не парится с отделением пробелов) или можно как-то лучше?

Вопрос конечно вышел сумбурным, если что-то не понятно в нем, я уточню.
Спасибо за внимание.
Ответить с цитированием
  #2  
Старый 04.08.2010, 20:06
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,047
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну тут скорее вопрос к тому - зачем тебе именно Edit'ы. Проще использовать TStringGrid. Хотя можно извратиться и с TEdit - надо просто дать им осмысленные имена (Edit11 - левый верхний, Edit12 - следующий в первой строке и т.д.). Далее вычитываешь все в массив и по индексу массива находишь соотв. Edit (читать именно в массив совершенно не обязательно - тебе достаточно рассчитать индексы соотв. ячейки).

Теперь о чтении.
Я бы читал через TStringList - за один раз считаешь весь файл целиком в виде списка строк. А вот отдельную строку надо будет парсить руками. Тут опять же вопрос - на сколько должен быть универсальный парсер. Если у тебя гарантированно 6 груп по 4 цифры, разделенные пробелами, то можно просто по индексам с помощью функции Copy вырезать нужные знаяения. Если кол-во груп может быть меньше или длинна каждого значения может быть любой, то придется честно "резать" строку по пробелам (Pos и Copy).
Ответить с цитированием
  #3  
Старый 04.08.2010, 23:05
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от lmikle
придется честно "резать" строку по пробелам (Pos и Copy)
В этом моменте не соглашусь - читай про разбиение строк через тот же TStringList.
А в остальном - Imikle прав...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #4  
Старый 05.08.2010, 00:07
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,047
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Опять же, теперь я позволю себе не согласиться.
Да, через TStringList заменой пробела на #13#10 быстрее написать и короче выглядит. а теперь попробуй обработать файлик размером так в пару гигов. А потом моим методом. И посмотри - что быстрее будет. Да TStringList умрет только когда подумает о таком безобразии. Там вообще все надо будет руками писать, что бы хоть более-менее адекватно работало. Да и еще придумывать алгоритм хранения/накопления информации, что бы и задача решалась, и ресурсы сверх меры не жрались.
Да, возражения, типа "да тут файлик в 500 байт - нафига так сложно, вполне резонны. Однако, не так сложно и написать код "резанья" по пробелам, а, глядишь, человек разберется как пользоваться нужными функциями и следующий раз сделает все сам.
Ответить с цитированием
  #5  
Старый 05.08.2010, 00:24
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Теперь я не соглашусь. Построчно читать можно и через FileAssign - Reset - Readln - ..., кстати, а вот разбить в TStringList и обращаться таким образом - гораздо удобнее. Геморроя меньше.
И ты не подумал, что, опять же, можно построчно обрабатывать один стринглист, а строки на ячейки разбивать уже во втором... как вариант...
З.Ы. люблю интеллектуальные споры с модераторами...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #6  
Старый 05.08.2010, 00:32
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,047
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, в чем-то ты прав. Собственно. в том, что читать надо через AssignFile и т.д. Просто лень. Поверь, мне как-то пришлось обрабатывать ОЧЕНЬ БОЛЬШОЙ файл и я точно знаю, что там будут проблемы с быстродействием, если делать все через TStringList. Короче, средства надо выбирать исходя из задачи
Ответить с цитированием
  #7  
Старый 06.08.2010, 12:09
Rhot Rhot вне форума
Прохожий
 
Регистрация: 27.07.2010
Сообщения: 12
Репутация: 10
По умолчанию

Спасибо за ответы. Написал код, все работает как надо =)

Только вот может можно как-нитибудь в цикле сделать это ?
Код:
edt_sc_1.Text:=numbers[1,0];
edt_sc_2.Text:=numbers[2,0];
edt_sc_3.Text:=numbers[3,0];
edt_sc_4.Text:=numbers[4,0];
edt_sc_5.Text:=numbers[5,0];
edt_sc_6.Text:=numbers[6,0];
и т.д.

edt_sc_x - Это едитбоксы

Я просто не знаю, может в делфи как-то можно так работать с TEdit, чтобы не присваивать каждому едиту значение по отдельности.
В проге много где это нужно и она в длинну будет просто нереальной.

Последний раз редактировалось Rhot, 06.08.2010 в 12:11.
Ответить с цитированием
  #8  
Старый 06.08.2010, 22:17
Rhot Rhot вне форума
Прохожий
 
Регистрация: 27.07.2010
Сообщения: 12
Репутация: 10
По умолчанию

Вообщем продалжаю интересоваться, можно ли большому количеству объектов с одинаковым префиксом быстро изменить свойство, что типо такого:

For i:=1 to 30 do
begin
Edt_test_[i].Visible:=False;
end;

И 30 штук едит боксов Edt_test_1...Edt_test_30 станут невидимыми?
Ответить с цитированием
  #9  
Старый 06.08.2010, 23:26
Аватар для mak-karpov
mak-karpov mak-karpov вне форума
Активный
 
Регистрация: 18.09.2008
Сообщения: 235
Версия Delphi: 2010 и 7
Репутация: 1242
По умолчанию

Код:
(Form1.FindComponent('Edt_test_'+IntToStr(i)) as TEdit).Visible := false;
__________________
Кнопка "+" - весы в правом верхнем углу сообщения...
Ответить с цитированием
  #10  
Старый 06.08.2010, 23:34
Аватар для mak-karpov
mak-karpov mak-karpov вне форума
Активный
 
Регистрация: 18.09.2008
Сообщения: 235
Версия Delphi: 2010 и 7
Репутация: 1242
По умолчанию

-- удалено --
__________________
Кнопка "+" - весы в правом верхнем углу сообщения...
Ответить с цитированием
  #11  
Старый 07.08.2010, 01:20
Rhot Rhot вне форума
Прохожий
 
Регистрация: 27.07.2010
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от mak-karpov
Код:
(Form1.FindComponent('Edt_test_'+IntToStr(i)) as TEdit).Visible := false;

Большое спасибо! Работает прекрасно.
А может это ещё как-то и с процедурами можно сделать?

Код:
procedure TForm1.edt_test_1Click(Sender: TObject);

begin

edt_test_1.Text:=FormatDateTime('tt', SysUtils.Time);

end;

При нажатии на едит бокс туда вписывается дата. Едит боксов опять же очень много. Есть возможность в этом случае что-то сделать?
Ответить с цитированием
  #12  
Старый 07.08.2010, 02:16
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,047
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

ровно тоже самое. только в свойство OnClick надо присваивать готовую процедуру.
Ответить с цитированием
  #13  
Старый 07.08.2010, 02:37
Rhot Rhot вне форума
Прохожий
 
Регистрация: 27.07.2010
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
ровно тоже самое. только в свойство OnClick надо присваивать готовую процедуру.
Можно поподробнее, а то я не понимаю

Код:
procedure TForm1.edt_test_1Click(Sender: TObject); { Как здесь переделать на Form1.FindComponent('Edt_test_'+IntToStr(i)) as TEdit) вместо edt_test_1}

begin

edt_test_1.Text:=FormatDateTime('tt', SysUtils.Time); {ну и здесь как узнать по какому едит боксу кликнули, чтобы туда вписать значение}

end;
Задача кликнуть по едит боксу и чтобы только в нем появилась дата.

Заранее спасибо!
Ответить с цитированием
  #14  
Старый 07.08.2010, 02:42
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,047
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Код:
procedure TForm1.Editclick(Sender : TObject);
begin
  (Sender As TEdit).Text :=  FormatDateTime('tt', SysUtils.Time);
end;

...

(Form1.FindComponent('Edt_test_'+IntToStr(i)) as TEdit).OnClick := EditClick;
Ответить с цитированием
  #15  
Старый 07.08.2010, 02:54
Rhot Rhot вне форума
Прохожий
 
Регистрация: 27.07.2010
Сообщения: 12
Репутация: 10
По умолчанию

Работает, спасибо =)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter