Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Class. Вопросы. [D6, WinXP]


Temporary ©   (2004-10-21 14:42:00) 

Что-то я туплю :(
Посмотрите пожалуйста.


type
 TComputerRec = Record
   CompName:string;
   CompDescription:String;
 end;

type
 TComputers = class
 private
   FComputers: array of TComputerRec;
   function GetItem(index: integer): TComputerRec;
   procedure SetItem(index: integer; const Value: TComputerRec);
 public
   function Count():integer;
   property Computer[index : integer] : TComputerRec read GetItem Write SetItem;
 end;


В любом месте FComputers: Inaccessible value


Temporary   (2004-10-21 16:43:00) [1]

Спасибо добрый человек. Я же говорю туплю :) Это после бессонной ночи. Извиняйте, если что не так.


Ega23   (2004-10-21 16:39:00) [2]

Comps:=TComputers.Create;

И не гони.


Temporary   (2004-10-21 16:33:00) [3]


var
 Comps:TComputers;
...
procedure Tfrm_Main.FormCreate(Sender: TObject);
...
 Comps.Create();
...
end;


Вот на этом вываливается:
Access violation at address 00403AD5 in module 'some.exe'. Read of address 00000000.

В CPU это Call @AfterConstruction


Digitman   (2004-10-21 16:18:00) [4]


> Temporary   (21.10.04 16:14) [13]


> Почему это работает:


> А это нет.


не выдумывай.
и то и другое судя по тексту обязано работать.
а то? что ты видишь под отладчиком? отнюдь не означает, что то или иное "не работает"


Temporary   (2004-10-21 16:14:00) [5]

Ошибся в последнем, конечно:

function TComputers.GetItem(index: integer): TComputerRec;
begin
 Result:= FComputers[index];
end;

procedure TComputers.SetItem(index: integer; const Value: TComputerRec);
begin
  FComputers[index]:=value;
end;


Temporary   (2004-10-21 16:14:00) [6]

Ошибся в последнем, конечно:

function TComputers.GetItem(index: integer): TComputerRec;
begin
 Result:= FComputers[index];
end;

procedure TComputers.SetItem(index: integer; const Value: TComputerRec);
begin
  FComputers[index]:=value;
end;


Temporary   (2004-10-21 16:10:00) [7]

Digitman ©   (21.10.04 15:14) [8]
Я и не говорю, что он хуже, но мы не ищем легких путей.

to all
Все такие умные, просто диву даешься!!! Проектирование, TList, TComputerRec = class и не мучайся, а сказать почему ЭТОТ код не работает никто не может. :((((((((((((((

Почему это работает:

type
 TIOWhoUsers = Class
 private
   FIOWhose : array of string;
   function GetIOWhose(index: integer): string;
   procedure SetIOWhose(index: integer; const Value: string);
 public
   property IOWhose [index : integer]: string read GetIOWhose write SetIOWhose;
 end;
 
function TIOWhoUsers.GetIOWhose(index: integer): string;
begin
 Result:=FIOWhose[index];
end;

procedure TIOWhoUsers.SetIOWhose(index: integer; const Value: string);
begin
 FIOWhose[index]:=Value;
end;


А это нет.

type
TComputerRec = Record
  CompName:string;
  CompDescription:String;
end;

type
TComputers = class
private
  FComputers: array of TComputerRec;
  function GetItem(index: integer): TComputerRec;
  procedure SetItem(index: integer; const Value: TComputerRec);
public
  property Computer[index : integer] : TComputerRec read GetItem Write SetItem;
end;

function TComputers.GetItem(index: integer): TComputerRec;
begin
 Result:=Computer[index];
end;

procedure TComputers.SetItem(index: integer; const Value: TComputerRec);
begin
 Computer[index]:=value;
end;


Ega23   (2004-10-21 15:22:00) [8]

Хочется понять в этом конкретном случае, где туплю.

В проектировании модели хранения данных.


-=SS=-   (2004-10-21 15:19:00) [9]

FComputers: array of TComputerRec; --- это динамический массив
Вы под него памать достаточно выделяете. Если вообще выделяете


Digitman   (2004-10-21 15:14:00) [10]


> Temporary


мне не понятна дурь с использованием дин.массивов в таком применении

есть TLIst, чемон хуже ?


Temporary   (2004-10-21 15:06:00) [11]

Ega23 ©   (21.10.04 14:56) [4]

Сделать-то не хитро :) Хочется понять в этом конкретном случае, где туплю.


Temporary   (2004-10-21 15:05:00) [12]

clickmaker ©   (21.10.04 14:58) [5]

В каком месте? На Create?


clickmaker   (2004-10-21 14:58:00) [13]


> [2] Temporary   (21.10.04 14:51)

пока не скажешь SetLength - nil


Ega23   (2004-10-21 14:56:00) [14]

Сделай   TComputerRec = classи не мучайся.


Temporary   (2004-10-21 14:54:00) [15]

Или Add например:

function TComputers.AddItem(const Value: TComputerRec):integer;
begin
 SetLength(FComputers,Length(FComputers)+1);
 SetItem(Length(FComputers)-1, Value);
 Result:=Length(FComputers)-1;
end;


Temporary   (2004-10-21 14:51:00) [16]

Ну хорошо.
А как же тогда:

function TComputers.Count(): integer;
begin
 if FComputers<>nil then Result:=Length(FComputers) else Result:= 0;
end;


Он же не nil?


Digitman   (2004-10-21 14:45:00) [17]


> В любом месте FComputers: Inaccessible value


это - работа оптимизатора.
отнюдь не означающая некие проблемы с этим полем


Наверх

Титульная страница Поиск, карта сайта Написать письмо