| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > new |
| Автор: Guest_Alexey 23.4.2003, 20:42 |
| Отцы! Такая в дельфях проблема -- в одном юните у меня класс - ничего особенного - там один рекортд, и пара процедурок -- одна инициализация полей рекорда. В другом модуле (формы) создаю укахатель на класс с помощью new, после попытки обратиться в процедуре генерит исключение. Что сделать? innews@mail333.com |
| Автор: AntonSaburov 24.4.2003, 10:58 |
| Нам бы код бы посмотреть бы. Как я понимаю код небольшой и в сообщение влезет. Так что кидай прямо сюда. А мы рассмотрим. |
| Автор: Guest_Alexey 24.4.2003, 12:37 |
| AntonSaburov unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses Dominos; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var c: PDomino; begin new©; c^.Init(0,0); end; end. unit Dominos; interface uses SysUtils, classes; type DSize=0..6; TPlain = record L:DSize; R:DSize; end; PDomino = ^TDomino; Tdomino = class (TObject) private Info:TPlain; protected public Procedure Init(LL:integer{ DSize};RR:integer {DSize}); function GetAsText:string; published end; implementation { Tdomino } Procedure Tdomino.Init(LL:integer{ DSize};RR:integer {DSize}); begin Info.L:=LL; Info.R:=RR; end; function Tdomino.GetAsText: string; var d:TPlain; begin d:=self.Info ; GetAsText:=IntToStr(Info.L)+'|'+IntToStr(Info.R); end; end. |
| Автор: AntonSaburov 24.4.2003, 14:36 | ||||
| Ну теперь все понятно. Код правильный смотри ниже. Обрати внимание на следующее: Если ты объявляешь тип как class, то он автоматически является по сути указателем. И поэтому к нему надо применять метод Create А объявлять указатель на класс не надо. Переменная такого типа сама указатель и есть. Просто с не теперь можно без "шляпки" обходиться. Посмотри внимательно на код процедуры TForm1.Button1Click. Вот там есть ошибка - будет утечка памяти - ты выделяешь память под объект типа TDomino, а потом локальная переменная c, которая содержит этот указатель у тебя исчезает (он локальная в процедуре). И каждый раз при вызове Button1.Click у тебя будет съедаться кусок памяти размеров с TDomino. А теперь непосредственно код:
|
| Автор: Unregistered 24.4.2003, 21:35 |
| Большое thanx, все сработало |