|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Классы TList и TStringList используют метод QuickSort. Основная разница между классами в том, что в TList грузим объекты (ссылки на них), а в TStringList строку и при необходимости объект с ним связанный. Выбирай какой класс больше подходит под задачу.
|
#17
|
|||
|
|||
Итак я со стринглистом разобрался. Раньше было через невидимое Memo, строки в которые добавлялись из потока. Со StringList'ом всё тоже самое, только это абстрактный компонент. А вот с метотдами сортировки я не смог подружится. Читал информацию на одном форуме, там сранительно доступно было изложено, но я не понял как эти методы применить к моему случаю. Пришлось оставить свой алгоритм)
|
#18
|
||||
|
||||
Используй AddObject, при этом в качестве строки может служить "Имя", а в качестве объекта - запись "Имя" + "Очки". Если Sorted = True сортировка происходит автоматически, иначе вызываем метод Sort.
|
#19
|
|||
|
|||
Продолжая добивать програму по подсчету голосов, выводу рейтинга уперся в неочень заметную, но весьма неприятную вещь.
Фрагмент кода: Код:
procedure TForm1.Button5Click(Sender: TObject); var i,k,j:integer; f:textfile; s:string; begin ClearGrid(StringGrid1); ClearGrid(StringGrid2); if OpenDialog1.Execute then begin assignfile(f,OpenDialog1.FileName); reset(f); with StringGrid1 do begin i:=1; while not SeekEof(f) do begin while not SeekEoln(f) do begin read(f,s); Rows[i].Text:=StringReplace(s, #9, #13#10, [rfReplaceAll]); end; i:=i+1; readln(f); end; RowCount:=i; end; end; closefile(f); ... ... 1) Так вот, суть вопроса в том, что если нажать кнопку "открыть сохраненный результат" выскакивает проводник, предлагая выбрать путь к файлу. Если я выберу сохраненный файл, то всё нормально откроется. Если это окно OpenDialog закрыть, не выбрав файла - будет ошибка I\O Error 103. Можно ли это исправить? 2) И по ходу написания этого поста возник еще один вопрос. Дело в том что файл, в который сохраняется результат - текстового формата, и вида табулированной таблицы. Можно ли сделать так, что если файл не удовлетворяет виду a1 b1 c1 d1 e1 a2 b2 c2 d2 e2 ... ... ... ... ... то ничего не будет открываться, либо же будет писаться сообщение. 3) Или второй вариант вопроса: Если имя файла имеет вид saved 29-06-2011 (то есть вида "saved dd-mm-yyyy"), а не какого-то там другого (вроде "Отчет по практике" или "1111")- он открывается, если иначе - ничего не происходит, или опять таки вывод сообщения ... ? Буду благодарен за помощь! Последний раз редактировалось us8ihj, 29.06.2011 в 08:43. |
#20
|
||||
|
||||
closefile(f); из блока begin-end "if OpenDialog1.Execute then begin" вылетел. по остальному - можно.
Пишу программы за еду. __________________ |
#21
|
|||
|
|||
С OpenDialog разобрался. Всё работает как надо (причина была в том, что часть кода по обработке файла была после end'а OpenDialog.Execute.
Вопросы 2 и 3 остаются актуальными. |
#22
|
|||
|
|||
Цитата:
Можно то можно, только как?.. Хотя бы на мысль наведи, а я попробую разобраться сам. А вообще у меня есть идеи. Допустим сделать так: файл открыть, содержимое отправить в стринглист, и в ввиде массива обработать (а именно подсчитать количество стоблцов, опираясь на табуляторы). Второй вариант - отправить в невидимый стринггрид, подсчитать кол-во столбцов. Но это увеличит размер приложения, я думаю, да и кода будет больше. Если через стринггрид делать - то тут все понятно. А вот через стринглист - могут быть сложности. Это пока два варианта которые пришли мне в голову после бессонной ночи. Может есть что попроще, подскажите. А по поводу имени файла - как можно реализовать такую процедуру "Если имя файла содержит слово "saved", пробел, слово ??-??-???? (где ? - цифра), то программа выполняется дальше"? Ну или что-то в этом роде. Последний раз редактировалось us8ihj, 29.06.2011 в 09:02. |
#23
|
|||
|
|||
Функция проверки на имя:
Код:
function NameRevision(S:String):boolean; const A: array [0..7] of byte = (7,8,10,11,13,14,15,16); var i,x:Cardinal; begin Result:=True; For i:=1 to Length(S) do if S[i]='\' then x:=i; Delete(S,1,x); Form1.Caption:=S; if (Length(S)<>20) or (Pos('saved',S)<>1) or (S[6]<>' ') or (S[9]<>'-') or (S[12]<>'-') or (S[17]<>'.') or (S[18]<>'t') or (S[19]<>'x') or (S[20]<>'t') then begin Result:=False; exit; end; for i:=0 to Length(A)-1 do if not (S[A[i]] in ['0'..'9'])then Result:=False; end; Код:
if OpenDialog1.Execute then begin if NameRevision(OpenDialog1.FileName) then begin ShowMessage('Все КРУТО!!!'); //Действия если все ништя и имя нам подходит... end else begin ShowMessage('Имя файла не соответствует необходимому!!!'); end; end; |
#24
|
||||
|
||||
Ну реализовать проверку файла на верный набор данных можно несколькими способами.
1. Просто придумать свое уникальное расширение к имени файла. Метод простой и позволяет делать проверку на этапе выбора файла, но если данные все-же не совпадают по структуре, то получите ошибку. 2. В начале данных файла ставить уникальный маркер, который будет говорить вам о типе и версии файла. 3. И наконец полный предварительный анализ структуры данных. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 29.06.2011 в 12:02. |
#25
|
|||
|
|||
Цитата:
А еще лучше комбинировать... |
#26
|
|||
|
|||
Понятно, но не всё. Ниже, в комментариях к строкам я написал что до меня дошло, а что неочень. Или же где-то сомневаюсь.
Код:
function NameRevision(S:String):boolean; //посылаем в функцию строку с именем файла const A: array [0..7] of byte = (7,8,10,11,13,14,15,16); //что это значит?? var i,x:Cardinal; //я так понимаю, можно было использовать integer begin Result:=True; //изначально предпологаем, что имя удовлетворяет виду. For i:=1 to Length(S) do if S[i]='\' then x:=i; // Тут ничего не понял. Особенно с косой чертой. Delete(S,1,x); //удаляем в строке с именем файла первый и иксовый элемент (со смещением влево). Form1.Caption:=S; if (Length(S)<>20) {тут понятно} or (Pos('saved',S)<>1) {если в строке S ниразу не встречается слово "saved"} or (S[6]<>' ') or (S[9]<>'-') or (S[12]<>'-') or (S[17]<>'.') or (S[18]<>'t') or (S[19]<>'x') or (S[20]<>'t') then // с остальными условиями ясно begin Result:=False; //возвращаем значение в ложь, если мы неубедили программу в том, что форма имени файла нам удовлетворяет exit; //а вот этот эксит для чего (или с чем) используется? end; for i:=0 to Length(A)-1 do if not (S[A[i]] in ['0'..'9'])then Result:=False; //Тут что-то с байтами, я не понял. end; Извиняюсь, если много вопросов, но я хочу понять и полностью осознавать что делаю на 100%. Так в будущем будет меньше непоняток..) Последний раз редактировалось us8ihj, 29.06.2011 в 17:36. |
#27
|
|||
|
|||
Код:
function NameRevision(S:String):boolean; //посылаем в функцию строку с именем файла const A: array [0..7] of byte = (7,8,10,11,13,14,15,16); //Номера символов которые должны быть буквами var i,x:Cardinal; //Да, просто отрицательных порядковых номеров быть не может begin Result:=False; if Length(S)=0 then exit; //Если строка пуста выходим из процедуры Result:=True; //изначально предпологаем, что имя удовлетворяет виду. For i:=1 to Length(S) do if S[i]='\' then x:=i; // в пути к файлу ищем разделители последний остается в памяти Delete(S,1,x); //удаляем в строке с путем кфайлу все кроме имени файла Form1.Caption:=S;//Это не надо тестил забул удалить))) if (Length(S)<>20) {тут понятно} or (Pos('saved',S)<>1) {если в строке S слово "saved" не первое или отсутствует} or (S[6]<>' ') or (S[9]<>'-') or (S[12]<>'-') or (S[17]<>'.') or (S[18]<>'t') or (S[19]<>'x') or (S[20]<>'t') then // с остальными условиями ясно begin Result:=False; //возвращаем значение в ложь, если мы неубедили программу в том, что форма имени файла нам удовлетворяет exit; //Выйти из функции т.к. имя нам уже не подходит end; for i:=0 to Length(A)-1 do if not (S[A[i]] in ['0'..'9'])then Result:=False; //Проверка что стоит там где должны стоять цифры end; |
#28
|
|||
|
|||
Теперь всё понятно, только поправочка:
Код:
const A: array [0..7] of byte = (7,8,10,11,13,14,15,16); //Номера символов которые должны быть цифрами Спасибо за помощь! Дальше буду пытаться реализовать проверку файла на его сожержимое. Впринципе на счет маркера было хорошо сказано, но если же в сохраненных файлах дописывать в первой строке шифр, то либо же он будет для всех один, либо если уникальный для каждого сохр. результата - то надо же иметь второй файл, в котором будут хранится список с этими шифрами. Кто-то что-то говорил о "третьем", способе проерки содержимого ("полный анализ структуры данных"). Можно чуть-чуть подробнее? P.S. Функция запустилась с первого раза, работает так, как надо. Открывает только файлы, имя которых имеет вид "saved 29-06-2011" Последний раз редактировалось us8ihj, 29.06.2011 в 22:25. |
#29
|
||||
|
||||
Куда уж подробнее, к примеру:
Код:
type TMyStruct = record id : string[8]; // 'My_table' ... bla-bla-bla ... end; var MyStruct : TMyStruct |
#30
|
|||
|
|||
Цитата:
|