1,64 Mb.страница14/15Кузнецова И. АДата конвертации22.09.2011Размер1,64 Mb.Тип Смотрите также: 14 ^ LifeForm.EditSpBtn.Down := false; Кнопка EditSpBtn будет отвечать за редактирование клеток (если она нажата, включен режим редактирования). Во время редактирования таймер LifeTimer должен быть отключен. Поскольку здесь, при открытии, мы включаем этот таймер, то режим редактирования должен быть отключен и кнопка отпущена. MPlayer.Play;LifeImg.Visible := not (ExtractFileExt(MPlayer.FileName) = '.avi');LifeForm.Visible := LifeImage.Visible;LifeForm.EditSpBtn.Down := false;LifeTimer.Enabled := true;ControlForm.PosTimer.Enabled := true; .15. Необходимо описать обработчики событий для новых компонентов. Определим при создании формы ее местоположение.В модуле LifeUnit: var LifeForm: TLifeForm; implementation uses MainUnit, ControlUnit; procedure TLifeForm.FormCreate(Sender: TObject);beginP Top := ControlForm.Top + ControlForm.Height + 4;P Left := ControlForm.Left;end;При нажатии на кнопки очистки и заполнения мы используем процедуры, описанные в модуле главной формы. В модуле LifeUnit: procedure TLifeForm.ClearBtnClick(Sender: TObject);varP i, j: integer;beginP for i := 0 to XSize - 1 doP for j := 0 to YSize - 1 doP A[i, j] := false;P DrawCells;end;procedure TLifeForm.FillBtnClick(Sender: TObject);beginP RandomCells;P DrawCells;end;Однако для того, чтобы подобный вызов был возможен, необходимо в главном модуле объявить эти процедуры в интерфейсе. Извне доступно только то, что объявлено в интерфейсе. В MainUnit необходимо "вывести" в интерфейс объявление процедур:var MainForm: TMainForm; A: TLifeCells; procedure RandomCells;procedure DrawCells; implementation uses ControlUnit; {&r *.DFM}ТrackBar устанавливает интервал для таймера, задавая тем самым скорость визуализации. А кнопка редактирования переключает режим редактирования, останавливая и включая таймер.procedure TLifeForm.FillBtnClick(Sender: TObject);beginP RandomCells;P DrawCells;end;procedure TLifeForm.SpeedTrkBarChange(Sender: TObject); {Меняет скорость «жизни»}beginP MainForm.LifeTimer.Interval := SpeedTrkBar.Position;end;procedure TLifeForm.EditSpBtnClick(Sender: TObject);{включает/выключает режим редактирования}beginP MainForm.LifeTimer.Enabled := not EditSpBtn.Down;end; Само редактирование клеток происходит в главном модуле, в обработчике OnMouseDown компонента LifeImg. procedure TMainForm.LifeImgMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginP if LifeForm.EditSpBtn.Down thenP A[X div 10, Y div 10] := not A[X div 10, Y div 10];P DrawCells;end; В uses нужно описать ссылку на LifeUnit. При запуске программы получается примерно такая картинка. Теперь можно редактировать позиции. 16. Вначале при загрузке и сохранении картинок и прочих файлов использовались специальные методы объектов, в которые происходила загрузка. Теперь произведем эти операции вручную, пользуясь процедурами работы с типизированными файлами. Типизированные файлы содержат записи определенного типа. К примеру, file of integer может хранить произвольное количество переменных integer; file of TLifeCells произвольное количество переменных типа TLifeCells. Однако для наших целей достаточно только одной записи. При работе с типизированными файлами используются следующие процедуры. AssignFile(var F; FileName: string) связывает файловую переменную F с текстовым именем файла. Это действие необходимо сделать перед всеми последующими операциями. ^ Reset(F) открывает существующий файл, связанный с переменной F, и устанавливает позицию чтения-записи в начало. Rewrite(F) создает файл, соответствующий файловой переменной F. Read(F, V) читает из файла, связанного с F, данные в типизированную переменную V. Позиция файла увеличивается на один файловый компонент, байтовый размер которого равен размеру типа переменной (для integer это 4 байта). ^ Write(F, V) записывает в файл, связанный с F, типизированную переменную V. Позиция файла увеличивается на один файловый компонент. Seek(F, N: LongInt) перемещает позицию файла к номеру N, начальная позиция при N = 0. CloseFile(var F) закрывает файл F.В главном модуле описан тип TFileCells:{Private declaration} public {Public declaration} end;const XSize = 40; YSize = 25; type TFileCells = array [0 .. XSize 1, 0 .. YSize 1] of boolean; var MainForm: TMainForm; A: TFileCells;В обработчике OnClick кнопки LifeOpen определяем файл такого же типа. Если файл выбран в диалоге, ассоциируем имя файла с переменной, устанавливаем позицию для чтения в начало и считываем из файла данные в переменную A, описанную в MainUnit и хранящую положения клеток.procedure TLifeForm.LifeOpenBtnClick(Sender: TObject);varP F: file of TLifeCells;beginP if LifeOpenDlg.Execute thenP if FileExists(LifeOpenDlg.FileName) thenP beginPPP AssignFile(F, LifeOpenDlg.FileName);PPP Reset(F);PPP Read(F, A);PPP CloseFile(F);PPP DrawCells;P end;end;Подобное чтение корректно, поскольку типы файла и переменной A совпадают. При записи в файл ситуация похожая, только вдобавок проводится проверка, существует ли файл. Если нет, то он создается; если да, то должны спросить, действительно ли пользователь хочет его перезаписать. Если он просто ошибся, то закрываем файл и выходим из обработчика; если нужно п
Практикум по Delphi для решения прикладных задач учебное пособие для студентов 1 чел. помогло.
LifeForm.EditSpBtn.Down := false - Практикум по Delphi для решения прикладных задач учебное пособие для студентов
Комментариев нет:
Отправить комментарий