Форум: "Начинающим";
Текущий архив: 2008.03.02;
Скачать: [xml.tar.bz2];
ВнизПомогите с сохранением в файл Найти похожие ветки
← →
repus © (2008-01-30 09:23) [0]Допустим, у меня есть запись
type
TReiting=record
name:string;
//и т.д.
end;
var
rec:file of TReiting;
При нажатии на Кнопку, данные этой записи добавляются в файл с помощью
reset(rec);
seek(rec, FileSize(rec));
. А в ListBox при этом добавляется значение переменной name каждой вводимой записи. Потом при выборе в ListBox определенного имени и нажатия на вторую Кнопку, мне показываются данные записи, соответствующей выбранному имени.
Вопрос такой: если я там что-то изменяю и снова сохраняю, то он добавляет еще одну запись в конец файла. Можно ли как-нибудь изменить ранее записанную запись или удалить предыдущую и потом перезаписать заново?
Или же лучше использовать Динамические списки. Но дело в том, что я еще толком в них не разобрался. Только дошел до их изучения. И не пойму как сохранить их в файл. А спросить не у кого.
← →
Dennis I. Komarov © (2008-01-30 09:25) [1]> [0] repus © (30.01.08 09:23)
Уверен, что тебе string нужен?
← →
ketmar © (2008-01-30 09:29) [2]AnsiString, F1, не возвращаться, пока не озарит.
← →
Slym © (2008-01-30 10:01) [3]Пока не поймешь почему ответ (смотри в Caption) не тот который тобой ожидается, работать твоя прога не будет
procedure TForm1.FormCreate(Sender: TObject);
var s:string;
begin
s:="0123456789";
Caption:=IntToStr(SizeOf(S));
end;
← →
Семеныч (2008-01-30 10:01) [4]> repus © (30.01.08 09:23)
1. Name:String замените на Name:String[максимальная_длина_Name]. Со String правильно писать/читать не будет. Если интересна причина, то см. в справке строковые типы данных, что такое длинная строка (AnsiString), короткая строка (ShortString) и директиву компилятора $H.
2. > добавляет еще одну запись в конец файла
Вы же сами ставите позицию записи в конец файлы: seek(rec, FileSize(rec));
Куда поставили - туда и пишет.
3. > Можно ли как-нибудь изменить ранее записанную запись
Размер всех записей одинаковый, поэтому можно. Надо выставить позицию записи в файле на начало нужной записи. Например, чтобы перезаписать N-ю от начала файла запись, то так:
Seek(Rec, (N-1) * SizeOf(TReiting));
4. > Динамические списки... как сохранить их в файл
Там в каждом элементе списка есть один или несколько указателей на другие элементы. Так вот - эти указатели не сохраняем никак, а все остальное сохраняем как обычно. При чтении: что сохраняли, то и читаем, а указатели элементов друг на друга проставляем сами.
← →
ketmar © (2008-01-30 10:06) [5]>[4] Семеныч (30.01.08 10:01)
плохому людей учишь.
← →
Семеныч (2008-01-30 10:29) [6]> ketmar © (30.01.08 10:06) [5]
Хех... родной ты мой, вспомни, как тебя читать учили. Сразу дали книжку и сказали - читай, или сначала буквы показали, потом слоги объяснили... ?
Если серьезно - да, при обучении надо заставлять человека думать и работать. Для этого как бы надо забегать, вперед, за пределы того, что он уже знает - тогда как раз и образуется тот барьерчик, который он должен преодолеть сам. Все правильно.
Но весь фокус в высоте этого барьерчика. Она не должна быть слишком большой, понимаешь? Она должна быть такой, чтобы человек реально мог ее преодолеть. Иначе ты заставляешь его бесполезно мучиться, и все.
Теперь перечитай [4] и сопоставь, что я написал там и здесь.
Хех... теперь въехал? Тут все хитро, брат.
:о)
← →
Slym © (2008-01-30 10:31) [7]Семеныч (30.01.08 10:01) [4]
Seek(
1. не байтовый файл, а файл записей, нужно указывать порядковый номер записи, а не байта... (хотя и так работать будет) это раз, чем Append(rec); не угодил
Семеныч (30.01.08 10:01) [4]
замените на Name:String[максимальная_длина_Name].
и лишний байт длинны словиш в файле, а это мусор!... пользуй array[0..255] of char;
а в определении записи ставь packed, чтоб потом проблем небыло
TReiting=packed record
name:array[0..255] of char;
//и т.д.
end;
← →
ketmar © (2008-01-30 10:32) [8]>[6] Семеныч (30.01.08 10:29)
если человек лезет что-то писать, он априори читать умеет. если человек не способен прочесть справку и уяснить — ему не надо программы писать. ты же приучаешь не самому разбираться, а ждать, пока разжуют и в рот положат. это, имо, в корне неверный подход.
зыж меня читать не учили, я сам научился.
← →
Плохиш © (2008-01-30 10:38) [9]
> Семеныч (30.01.08 10:01) [4]
> Размер всех записей одинаковый, поэтому можно. Надо выставить
> позицию записи в файле на начало нужной записи. Например,
> чтобы перезаписать N-ю от начала файла запись, то так:
> Seek(Rec, (N-1) * SizeOf(TReiting));
Представляешь, куда улетит указатель в из [0]
> var
> rec:file of TReiting;
?
> ketmar © (30.01.08 10:32) [8]
> зыж меня читать не учили, я сам научился.
Так прочитай название конференции и то что под ним написано.
← →
ketmar © (2008-01-30 10:43) [10]>[9] Плохиш ©(30.01.08 10:38)
прочитал. не вижу никаких проблем в [2]. если автор вопроса не удосужился изучить язык, который пытается использовать, ему надо посоветовать именно изучать. чтобы не писал магических конструкций, которые не понимает.
← →
Семеныч (2008-01-30 10:53) [11]> Slym © (30.01.08 10:31) [7]
1. Насчет файла записей - согласен, если это файл записей и не согласен, если это file of byte. Как он объявлен - мы не знаем.
2. Насчет байта длины - это не мусор. Он должен проинициализироваться при чтении - значит, его надо писать.
3. Насчет array[0..255] of char - скорее всего, реальная длина имени намного меньше. Значит, при таком объявлении действительно поимеем мусор, и немало.
4. Насчет packed - в данном случае непринципиально. Да, размер записи может уменьшить, но проблем не будет и с неупакованной записью.
> ketmar © (30.01.08 10:32) [8]
А не надо мерять всех по себе. Люди разные, и максимальная высота барьерчика у каждого своя. С чего ты решил, что этому челу стать программером не суждено? Это пока еще неизвестно.
← →
ketmar © (2008-01-30 11:10) [12]>[11] Семеныч (30.01.08 10:53)
если бы я «решил, что не суждено», я бы посоветовал ему последовать примеру Томми. вместо этого я — как истинный оптимист — считаю, что всё вполне возможно. и даю направление, в котором можно рыть. прочитав разделы справки об AnsiSitring, человек или всё поймёт сам, или вернётся с уточнающими вопросами и получит очередное направление. и снова что-то накопает. и в итоге будет иметь не набор заклинаний на разные случаи жизни, а умение составлять заклинания и понимать, как они работают.
← →
Семеныч (2008-01-30 11:18) [13]> ketmar © (30.01.08 11:10) [12]
А я не то же самое сделал?
:o)
Не последовал ты совету "перечитай [4] и сопоставь, что я написал там и здесь", а зря. Если бы последовал, то увидел, что ни одного готового решения и ни одного законченного пояснения я не дал. Даже если чел прочтет [4] 100 раз, без справки ему все равно не обойтись, только после [4] он будет к ее пониманию более-менее подготовлен. Высота барьерчика немного уменьшилась, вот и вся разница.
Ладно, флудить завязываю, это все же тематическая конфа.
← →
ketmar © (2008-01-30 11:22) [14]>[13] Семеныч (30.01.08 11:18)
таки перечитывал. ты там как раз даёшь заклинания.
← →
repus © (2008-01-31 17:55) [15]
> Семеныч (30.01.08 10:01)
Спасибо. Попробую. Извиняюсь, что так долго, с инетом проблему. Да и я не совсем правильно написал в первом посте.
Там у меня
name:string[20];
fam:string[20];
ves:integer;
rost:integer;
> ketmar ©
Ну, справку я прочесть не могу, к сожалению(( Туго у меня с английским((Если есть справка на русском, буду премного благодарен. Все-таки ведь трудно все без подсказок делать. Я не думаю, что если подсказали что-то вперед, это плохо. Выучюсь я или нет, зависит только от меня, я думаю. Время покажет. Но за совет Спасибо.
ЗЫ А "магические конструкции" пишу именно для того, чтобы Понять.
Но в общем, я эту програмку я почти доделал, осталось использовать только Ваши подсказки. Всем Большое спасибо.
← →
ketmar © (2008-02-01 12:42) [16]>Туго у меня с английским
на счёт раз-два иди за метлой. я был оптимистом, когда считатал, что из тебя может что-то получиться.
← →
repus © (2008-02-03 11:18) [17]
> на счёт раз-два иди за метлой.
Спасибо, Йода.
ЗЫ Уже все сделал, что нужно было...
← →
ketmar © (2008-02-03 12:05) [18]>[17] repus©(03.02.08 11:18)
учитывая [15], я прозреваю ещё не одно посещение форумов с вопросами, которые решаются чтением справки.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.03.02;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.045 c