Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятно, почему работает программа ! 
:(
    Опции темы
Winni
Дата 19.7.2005, 11:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Добрый день !

Не могу понять, почему работает эта программа, опубликованная в учебнике А.Я. Архангельского "Язык Pascal и основы программирования в Delphi" (М.Бином, 2004).
на стр 270- 276.

Я упростил ее до предела и после упрощения суть дела в следующем:
Имеется

Код

unit MyClasses3;

interface uses SysUtils, Dialogs, Classes, stdctrls, ComCtrls;
type TPerson = Class
 private
  FName: String;
  FDoc : ^TMemo;
 protected
 public
  FileTMP : string;
  property Name: string read FName write FName;
  Constructor Create;
  Destructor Destroy; override;
  Procedure  SetDoc(var Value: TMemo);
  Procedure  GetDoc(var Value: TMemo);
 end;

 implementation

Procedure TPerson.SetDoc(var Value: TMemo);
begin if FileTMP = ''
 then FileTMP := FName +'.tmp';
  FDoc := @Value;
  FDoc^.Lines.SaveToFile(FileTMP);
end;

Procedure TPerson.GetDoc(var Value: TMemo);
 begin if FileTMP <> ''
  then FDoc^.Lines.LoadFromFile(FileTMP);
 end;

 Constructor TPerson.Create;
 Const unknown = 'неизвестный';
 begin
 inherited;
 FName := Unknown;
 end;

 Destructor TPerson.Destroy;
 begin
  inherited;
 end;

end.

end.

и главная форма проекта (ее модуль - Unit1)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Buttons, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    btnRead,btnWrite,btnClear: TButton;
    btnExit: TBitBtn;
    Edit1: TEdit;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnWriteClick(Sender: TObject);
    Procedure Cistka;
    procedure btnReadClick(Sender: TObject);
    procedure btnClearClick(Sender: TObject);
  end;

var Form1: TForm1;

implementation uses MyClasses3;
{$R *.DFM}
var Pers : TPerson;

procedure TForm1.FormCreate(Sender: TObject);
begin Pers := TPerson.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin Pers.Free;
end;

Procedure TForm1.Cistka;
begin Memo1.Clear; edit1.clear;
end;

procedure TForm1.btnWriteClick(Sender: TObject);
begin Pers.Name := Edit1.Text; Pers.SetDoc(Memo1);
end;

procedure TForm1.btnReadClick(Sender: TObject);
begin Edit1.Text := Pers.Name; Pers.GetDoc(Memo1);
end;

procedure TForm1.btnClearClick(Sender: TObject);
begin cistka;
end;

end.

НЕпонятно, как работает btnWriteClick:

Свойство Pers.Name заполняется из окошка Edit1, но ведь, вроде бы
Pers.SetDoc(Memo1) - записывает в файл ПУСТОЙ список Memo1, потому что в Memo1
ничего не передавалось! На диске действительно формируется пустой файл, однако щелкнув
btnClear (чтобы все очистить), затем btnRead, мы получаем заполненный нормально Edit1.
Если "записать" данные в файл, затем выйти из программы, зайти , щелкнуть btnRead, то из файла, естественно, ничего не читается (Edit1.text = неизвестный).

Это сообщение отредактировал(а) Girder - 19.7.2005, 12:07
  Вверх
Bes
Дата 19.7.2005, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 5
Всего: 7



Что должна делать программа?

Это сообщение отредактировал(а) Girder - 19.7.2005, 12:44
PM MAIL   Вверх
Guest
Дата 19.7.2005, 14:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Добрый день !

Извините за беспокойство, я нашел, в чем дело (непонятность - почему она работает, хотя не должна).
Дело в том, что я не очищал поле Pers.Name. Если обновить процедуру так:

Код

Procedure TForm1.Cistka;
begin Memo1.Clear; edit1.clear;
 Pers.Name := '';
end;


то программа действительно не работает.

По-моему, она должна делать следующее - демонстрировать ( в учебных целях ) использование самодельного класса TPerson.
Вначале обычным путем заполняются информационные поля объекта Pers, затем эти данные записываются на диск с использованием метода TStrings.SaveToFile, затем их можно оттуда прочесть. При закрытии приложения файл удаляется ( т к он .tmp ).

Winni

Это сообщение отредактировал(а) Girder - 19.7.2005, 14:19
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0442 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.