Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.07;
Скачать: CL | DM;

Вниз

Class. Вопросы.   Найти похожие ветки 

 
Temporary   (2004-10-21 14:42) [0]

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


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


 
Digitman ©   (2004-10-21 14:45) [1]


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


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


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

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

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


Он же не nil?


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

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

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


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

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


 
clickmaker ©   (2004-10-21 14:58) [5]


> [2] Temporary   (21.10.04 14:51)

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


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

clickmaker ©   (21.10.04 14:58) [5]

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


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

Ega23 ©   (21.10.04 14:56) [4]

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


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


> Temporary


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

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


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

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


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

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

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


 
Temporary   (2004-10-21 16:10) [11]

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;


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

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

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) [13]

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

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

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


 
Digitman ©   (2004-10-21 16:18) [14]


> Temporary   (21.10.04 16:14) [13]


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


> А это нет.


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


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


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


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

Comps:=TComputers.Create;

И не гони.


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.11.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.039 c
1-1098810143
TIKO
2004-10-26 21:02
2004.11.07
координаты иконки в теле файла


3-1097126482
Its
2004-10-07 09:21
2004.11.07
DBGrid


1-1098778534
PURGEN
2004-10-26 12:15
2004.11.07
файл DAT


11-1082389428
Stefan
2004-04-19 19:43
2004.11.07
Глюк в DLL с формой (пример с сайта) ???


1-1098475502
voron
2004-10-23 00:05
2004.11.07
Как работать в Делфи с очень большими числами