OberonCore https://forum.oberoncore.ru/ |
|
Подскажите простой пример использования stores https://forum.oberoncore.ru/viewtopic.php?f=35&t=3012 |
Страница 1 из 1 |
Автор: | Хохулин Олег [ Воскресенье, 21 Ноябрь, 2010 20:52 ] |
Заголовок сообщения: | Подскажите простой пример использования stores |
Не могу разобраться с сохранением данных в ББ, может кто-то может привести "детский" пример с store.stores. |
Автор: | Info21 [ Воскресенье, 21 Ноябрь, 2010 21:28 ] |
Заголовок сообщения: | Re: Подскажите простой пример использования stores |
Хохулин Олег писал(а): Не могу разобраться с сохранением данных в ББ, может кто-то может привести "детский" пример с store.stores. Stores.Store -- это уже не по-детски.Возможно, Вы хотите вот такого (создаем новый файл, записывает туда число, сохраняем, снова открываем, читаем это число; переменной n 100 нигде не присваивается, но будет напечатано в рабочий журнал именно 100, проверьте): Код: MODULE x; IMPORT Log := StdLog, Files, Stores; PROCEDURE ex; VAR loc: Files.Locator; f: Files.File; wr: Stores.Writer; rd: Stores.Reader; n, res: INTEGER; BEGIN loc := Files.dir.This(''); (*рабочая папка*) f := Files.dir.New( loc, FALSE ); (*новый файл в папке loc*) wr.ConnectTo( f ); (*подсоеднили объект записи*) wr.WriteInt( 100 ); (*пишем туда целое в двоичном виде*) wr.ConnectTo( NIL ); (*для порядка отсоединились*) f.Register('имя файла', '', Files.dontAsk, res); (*зафиксировали файл с указанным именем*) f := Files.dir.Old( loc, 'имя файла', FALSE ); (*открыли снова файл с этим именем в папке loc*) rd.ConnectTo( f ); (*подсоединили объект чтения*) rd.ReadInt( n ); (*считываем целое в переменную n*) Log.Int( n ); (*печатаем в рабочий журнал -- убеждаемся, что 100*) END ex; BEGIN ex END x. Выполнять: Ctrl+F9 в сборках от И-21. |
Автор: | Info21 [ Воскресенье, 21 Ноябрь, 2010 21:32 ] |
Заголовок сообщения: | Re: Подскажите простой пример использования stores |
Если хотите действительно по-детски, то смотрите i21примFiles в школьной сборке. Там средство читать-писать только один файл в рабочей папке. (С локаторами можно в любую пойти.) |
Автор: | Пётр Кушнир [ Воскресенье, 21 Ноябрь, 2010 23:51 ] |
Заголовок сообщения: | Re: Подскажите простой пример использования stores |
пример-примером. А вообще, для какой задачи нужны Stores? |
Автор: | Хохулин Олег [ Понедельник, 22 Ноябрь, 2010 09:19 ] |
Заголовок сообщения: | Re: Подскажите простой пример использования stores |
Среди кружковских (10-11 класс) проектов - векторный учебный редактор для изучения векторов и координат. - игра типа Героев меча и магии (II-III) - игра типа "ascendancy" / "Master of orion - I-II" - самоиграйка типа "жизнь", с возможностью эволюции краеугольный камень ― сохранение/загрузка динамических массивов разнотипных объектов. |
Автор: | Хохулин Олег [ Понедельник, 22 Ноябрь, 2010 09:35 ] |
Заголовок сообщения: | Re: Подскажите простой пример использования stores |
Info21 писал(а): Хохулин Олег писал(а): Не могу разобраться с сохранением данных в ББ, может кто-то может привести "детский" пример с store.stores. Stores.Store -- это уже не по-детски.Возможно, Вы хотите вот такого (создаем новый файл, записывает туда число, сохраняем, снова открываем, читаем это число; переменной n 100 нигде не присваивается, но будет напечатано в рабочий журнал именно 100, проверьте): Код: MODULE x; IMPORT Log := StdLog, Files, Stores; PROCEDURE ex; VAR loc: Files.Locator; f: Files.File; wr: Stores.Writer; rd: Stores.Reader; n, res: INTEGER; BEGIN loc := Files.dir.This(''); (*рабочая папка*) f := Files.dir.New( loc, FALSE ); (*новый файл в папке loc*) wr.ConnectTo( f ); (*подсоеднили объект записи*) wr.WriteInt( 100 ); (*пишем туда целое в двоичном виде*) wr.ConnectTo( NIL ); (*для порядка отсоединились*) f.Register('имя файла', '', Files.dontAsk, res); (*зафиксировали файл с указанным именем*) f := Files.dir.Old( loc, 'имя файла', FALSE ); (*открыли снова файл с этим именем в папке loc*) rd.ConnectTo( f ); (*подсоединили объект чтения*) rd.ReadInt( n ); (*считываем целое в переменную n*) Log.Int( n ); (*печатаем в рабочий журнал -- убеждаемся, что 100*) END ex; BEGIN ex END x. Выполнять: Ctrl+F9 в сборках от И-21. Огромный респект Info 21 Раз уж начали может быть приведете пример сохранение/загрузка динамических массивов из объектов 2-х типов (ну, например, кругов и треугольников)? От этого кажется уже будет понятнее как "танцевать"... |
Автор: | Евгений Темиргалеев [ Понедельник, 22 Ноябрь, 2010 09:48 ] |
Заголовок сообщения: | Re: Подскажите простой пример использования stores |
Хохулин Олег писал(а): Раз уж начали может быть приведете пример сохранение/загрузка динамических массивов из объектов 2-х типов (ну, например, кругов и треугольников)? От этого кажется уже будет понятнее как "танцевать"... Посмотрите viewtopic.php?f=28&t=797
|
Автор: | Хохулин Олег [ Понедельник, 22 Ноябрь, 2010 12:30 ] |
Заголовок сообщения: | Re: Подскажите простой пример использования stores |
Евгений Темиргалеев писал(а): Хохулин Олег писал(а): Раз уж начали может быть приведете пример сохранение/загрузка динамических массивов из объектов 2-х типов (ну, например, кругов и треугольников)? От этого кажется уже будет понятнее как "танцевать"... Посмотрите viewtopic.php?f=28&t=797Да это, конечно, динамический массив с элементами 2х типов... Я обычная серая учительская масса. Сколько как вы думаете мне понадобиться времени (одновременно с основной работой), чтобы выцепить оттуда то, что относится к персистентам. Там даже комментариев нет. Вот я уже сообразил, что комманда на сохранение поступает из меню... <Удалено модератором (оффтоп)> |
Автор: | Евгений Темиргалеев [ Понедельник, 22 Ноябрь, 2010 13:04 ] |
Заголовок сообщения: | Re: Подскажите простой пример использования stores |
Там несколько конкретных примеров Stores. Думал, что по имени базового типа и именам абстрактных методов можно найти... Команда на сохранение: wr.WriteStore(x) Код: Star = POINTER TO RECORD (Stores.Store) point: Point; owner: Gamer; buildTurn, totalBuildTurns: INTEGER; slots: ARRAY playersCount OF RECORD ships: Ships; dest: Ship END END; Ship = POINTER TO RECORD (Stores.Store) destroyed: BOOLEAN; point: Point; dest, port: Star; speed, force: REAL; (* non serializable fields: *) turnDistance: INTEGER END; Ships = RECORD n: INTEGER; buff: POINTER TO ARRAY OF Ship END; Код: PROCEDURE (star: Star) Externalize (VAR wr: Stores.Writer);
VAR i: INTEGER; BEGIN star.point.Externalize(wr); wr.WriteStore(star.owner); wr.WriteInt(star.buildTurn); wr.WriteInt(star.totalBuildTurns); FOR i := 0 TO playersCount - 1 DO star.slots[i].ships.Externalize(wr); wr.WriteStore(star.slots[i].dest) END END Externalize; PROCEDURE (star: Star) Internalize (VAR rd: Stores.Reader); VAR store: Stores.Store; i: INTEGER; BEGIN star.point.Internalize(rd); rd.ReadStore(store); IF store # NIL THEN star.owner := store(Gamer) END; rd.ReadInt(star.buildTurn); rd.ReadInt(star.totalBuildTurns); FOR i := 0 TO playersCount - 1 DO star.slots[i].ships.Internalize(rd); rd.ReadStore(store); IF store # NIL THEN star.slots[i].dest := store(Ship) END END END Internalize; |
Автор: | Хохулин Олег [ Понедельник, 22 Ноябрь, 2010 13:45 ] |
Заголовок сообщения: | Re: Подскажите простой пример использования stores |
сПАсибо, изучаю |
Автор: | Хохулин Олег [ Понедельник, 22 Ноябрь, 2010 15:12 ] |
Заголовок сообщения: | Re: Подскажите простой пример использования stores |
Тупой вопрос: уже два раза за последний час я что-то неудачно нажал на клавиатуре и "стрелочки" в КП перестают двигать позицию в тексте !!! После этого стрелки сдвигают текст относительно окна. Караул!!! Второй раз забиваю установленный КП оригиналом из архива. Подскажите, где я так глупо лажаюсь? |
Автор: | Info21 [ Понедельник, 22 Ноябрь, 2010 15:41 ] |
Заголовок сообщения: | Re: Подскажите простой пример использования stores |
Хохулин Олег писал(а): "стрелочки" в КП перестают двигать позицию в тексте !!! После этого стрелки сдвигают текст относительно окна. Это не кнопка Scroll Lock? Вверху справа.Она может быть вплотную к типа Home, и нажиматься заодно. |
Автор: | Хохулин Олег [ Понедельник, 22 Ноябрь, 2010 15:53 ] |
Заголовок сообщения: | Re: Подскажите простой пример использования stores |
Черт, такая детская глупость... А я думал, что это «слабодокументированная» особенность КП.... Собрался перевести и, несколько упростив, выложить здесь адаптированные для начинающих http://www.zinnamturm.eu/downloadsOS.htm OOP Examples for Beginners и OO Collection Example. (обильно обкомментировав ) Уважаемые мэтры стоит ли заморачиваться? Кроме меня это кому-то будет нужно? |
Автор: | Роман М. [ Понедельник, 22 Ноябрь, 2010 16:09 ] |
Заголовок сообщения: | Re: Подскажите простой пример использования stores |
Конечно, хорошие примеры всегда хорошо иметь. Прежде чем выкладывать у Цинна, стоит выложить на тестирование здесь, на форуме. А в дальнейшем можно разместить в коллекции Цинна и в Вики. |
Автор: | Роман М. [ Понедельник, 22 Ноябрь, 2010 16:17 ] |
Заголовок сообщения: | Re: Подскажите простой пример использования stores |
Я для себя написал такой модуль, чтобы понять как действует Stores. Переопределяемый метод Externalize отвечает за сохранение записи модели, унаследованной от Stores.Store. Internalize, соответственно, отвечает за воспроизведение записи из файла. Код: MODULE TestFileOfRecord;
IMPORT Files, Stores, Log := StdLog; TYPE Record* = POINTER TO RECORD (Stores.Store) x, y: REAL END; PROCEDURE (r: Record) Externalize- (VAR wr: Stores.Writer); VAR k: INTEGER; BEGIN r.Externalize^(wr); wr.WriteReal(r.x); wr.WriteReal(r.y) END Externalize; PROCEDURE (r: Record) Internalize- (VAR rd: Stores.Reader); VAR k: INTEGER; BEGIN r.Internalize^(rd); rd.ReadReal(r.x); rd.ReadReal(r.y) END Internalize; PROCEDURE ExportToFile* (r: Record; f: Files.File); VAR wr: Stores.Writer; BEGIN wr.ConnectTo(f); wr.WriteStore(r) END ExportToFile; PROCEDURE ImportFromFile* (OUT r: Record; f: Files.File); VAR rd: Stores.Reader; s: Stores.Store; BEGIN rd.ConnectTo(f); rd.ReadStore(s); r := s(Record) END ImportFromFile; PROCEDURE Run*; VAR rec: Record; f: Files.File; res: INTEGER; BEGIN NEW(rec); rec.x := 10; rec.y := 20; f := Files.dir.New(Files.dir.This("."), Files.exclusive); IF f # NIL THEN ExportToFile (rec, f); f.Register("records", "dat", Files.dontAsk, res); IF res # 0 THEN Log.String("Error #"); Log.Int( res ); Log.Ln END END; rec := NIL END Run; END TestFileOfRecord. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |