![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравстуйте, есть такая проблема:
Есть текстовый фаил формата: 1234 3214 2431 4311 2314 2233 4123 4123 1245 (на самом деле файл больше, не 3на3 а 6на20) И есть набор едитбоксов, задача считать этот файл и вывести значения в едитбоксы в виде таблицы, такого же формата. Как сделать это наиболее эффективно, не выписывая килотонну кода? Так же интересует сама реализация считывания, т.к. формат известен, то можно сделать переменные (или массив) string[5] и идти через обычный read(фаил, переменные) и в конце строки писать readln (это чтобы не парится с отделением пробелов) или можно как-то лучше? Вопрос конечно вышел сумбурным, если что-то не понятно в нем, я уточню. Спасибо за внимание. |
|
#2
|
|||
|
|||
|
Ну тут скорее вопрос к тому - зачем тебе именно Edit'ы. Проще использовать TStringGrid. Хотя можно извратиться и с TEdit - надо просто дать им осмысленные имена (Edit11 - левый верхний, Edit12 - следующий в первой строке и т.д.). Далее вычитываешь все в массив и по индексу массива находишь соотв. Edit (читать именно в массив совершенно не обязательно - тебе достаточно рассчитать индексы соотв. ячейки).
Теперь о чтении. Я бы читал через TStringList - за один раз считаешь весь файл целиком в виде списка строк. А вот отдельную строку надо будет парсить руками. Тут опять же вопрос - на сколько должен быть универсальный парсер. Если у тебя гарантированно 6 груп по 4 цифры, разделенные пробелами, то можно просто по индексам с помощью функции Copy вырезать нужные знаяения. Если кол-во груп может быть меньше или длинна каждого значения может быть любой, то придется честно "резать" строку по пробелам (Pos и Copy). |
|
#3
|
||||
|
||||
|
Цитата:
А в остальном - Imikle прав... |
|
#4
|
|||
|
|||
|
Опять же, теперь я позволю себе не согласиться.
Да, через TStringList заменой пробела на #13#10 быстрее написать и короче выглядит. а теперь попробуй обработать файлик размером так в пару гигов. А потом моим методом. И посмотри - что быстрее будет. Да TStringList умрет только когда подумает о таком безобразии. Там вообще все надо будет руками писать, что бы хоть более-менее адекватно работало. Да и еще придумывать алгоритм хранения/накопления информации, что бы и задача решалась, и ресурсы сверх меры не жрались. Да, возражения, типа "да тут файлик в 500 байт - нафига так сложно, вполне резонны. Однако, не так сложно и написать код "резанья" по пробелам, а, глядишь, человек разберется как пользоваться нужными функциями и следующий раз сделает все сам. |
|
#5
|
||||
|
||||
|
Теперь я не соглашусь. Построчно читать можно и через FileAssign - Reset - Readln - ..., кстати, а вот разбить в TStringList и обращаться таким образом - гораздо удобнее. Геморроя меньше.
И ты не подумал, что, опять же, можно построчно обрабатывать один стринглист, а строки на ячейки разбивать уже во втором... как вариант... З.Ы. люблю интеллектуальные споры с модераторами... |
|
#6
|
|||
|
|||
|
Ну, в чем-то ты прав. Собственно. в том, что читать надо через AssignFile и т.д. Просто лень. Поверь, мне как-то пришлось обрабатывать ОЧЕНЬ БОЛЬШОЙ файл и я точно знаю, что там будут проблемы с быстродействием, если делать все через TStringList. Короче, средства надо выбирать исходя из задачи
![]() |
|
#7
|
|||
|
|||
|
Спасибо за ответы. Написал код, все работает как надо =)
Только вот может можно как-нитибудь в цикле сделать это ? Код:
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
|
|||
|
|||
|
Вообщем продалжаю интересоваться, можно ли большому количеству объектов с одинаковым префиксом быстро изменить свойство, что типо такого:
For i:=1 to 30 do begin Edt_test_[i].Visible:=False; end; И 30 штук едит боксов Edt_test_1...Edt_test_30 станут невидимыми? |
|
#9
|
||||
|
||||
|
Код:
(Form1.FindComponent('Edt_test_'+IntToStr(i)) as TEdit).Visible := false; |
|
#10
|
||||
|
||||
|
-- удалено --
|
|
#11
|
|||
|
|||
|
Цитата:
Большое спасибо! Работает прекрасно. А может это ещё как-то и с процедурами можно сделать? Код:
procedure TForm1.edt_test_1Click(Sender: TObject);
begin
edt_test_1.Text:=FormatDateTime('tt', SysUtils.Time);
end;При нажатии на едит бокс туда вписывается дата. Едит боксов опять же очень много. Есть возможность в этом случае что-то сделать? |
|
#12
|
|||
|
|||
|
ровно тоже самое. только в свойство OnClick надо присваивать готовую процедуру.
|
|
#13
|
|||
|
|||
|
Цитата:
Код:
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
|
|||
|
|||
|
Код:
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
|
|||
|
|||
|
Работает, спасибо =)
|