Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1202556804
oleg_teacher
2008-02-09 14:33
2008.03.02
События


3-1192105820
Dush
2007-10-11 16:30
2008.03.02
условие отображения данных в DBGridEh


2-1202233101
Res
2008-02-05 20:38
2008.03.02
Tnt Unicode companent


2-1202528961
Dmitry S
2008-02-09 06:49
2008.03.02
освобождение памяти дин. массива


2-1202118155
mephisto
2008-02-04 12:42
2008.03.02
Прочитать ячейку в памяти





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский