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

Вниз

свойство типа массив   Найти похожие ветки 

 
mikeflat ©   (2004-04-25 21:22) [0]

Ребята, как можно сделать свойство типа массив - чего-то он у меня все время ругается, когда пытаюсь записать или считать данные


 
DrPass ©   (2004-04-25 21:37) [1]

Наверное, ты где-то допустил ошибку


 
Rouse_ ©   (2004-04-25 21:41) [2]

> [1] DrPass ©   (25.04.04 21:37)
Я даже примерно знаю в какой строке :)


 
Anatoly Podgoretsky ©   (2004-04-25 21:56) [3]

Одназначно твоя вина.


 
evvcom ©   (2004-04-26 01:54) [4]

Пора уже завести конференцию "Для телепатов"...


 
Miwa ©   (2004-04-26 02:37) [5]

Дайте угадаю. Есть класс типа TMyClass в котором нужно свойство PMyProperty: array[1..n]of sometype;. По-поему, это надо сделать так:

MyType: array[1..n]of othertype;
MyClass = TMyClass
 PMyProperty: MyType;
end;

2 "плоский майк": я примерно угадал, что ты имел в виду?
Кстати, информация на будущее: постарайся точнее описывать проблему и приводить пару строчек, на которые ругается компилятор, а иначе долго тебе ждать здесь помощи. Ну, разве что у кого-то еще после пива будет настроение хорошее %о))).


 
Sun bittern ©   (2004-04-26 06:26) [6]

mikeflat ©   (25.04.04 21:22)

На сайт Анатолия Подгоредского и качай Тейксера с Пачеко.

Miwa ©   (26.04.04 02:37) [5]
Интересная коснтрукция ;)
Для доступа к свойству типа массив, у класса для доступа к данному свойству должны быть отдельно реализованы методы типа SetMyArray/GetMyArray.


 
Miwa ©   (2004-04-26 08:47) [7]

2 Sun bittern ©   (26.04.04 06:26) [6]

>Для доступа к свойству типа массив, у класса для доступа к данному свойству должны быть отдельно реализованы

Не должны а рекомендуется.


 
Anatoly Podgoretsky ©   (2004-04-26 08:57) [8]

И ты знаешь другие варианты, кроме методов доступа?


 
mikeflat ©   (2004-04-26 10:47) [9]

Мужики, делаю так:

 PArray = ^TArray;
 TArray = array [0..7] of integer;

 TObj = class(TPersistent)
 private
   FArray: PArray;
   ...
   function GetArray(Ind: integer): integer;
   procedure SetArray(Ind: integer;Value: integer);
 public
   ...
   property AddressArray[Ind: integer]: integer read GetAddressArray write SetAddressArray;
   ...
   end;

function TObj.GetArray(Ind: integer): integer;
begin
 Result := FArray^[Ind];
end;

procedure TObj.SetArray(Ind: integer; Value: integer);
begin
 FArray^[Ind] := Value;
end;

Где косяк - не могу понять?


 
Sun bittern ©   (2004-04-26 10:50) [10]

>> PArray = ^TArray;

А почему указатель, а не просто массив?


 
VMcL ©   (2004-04-26 10:55) [11]

>>mikeflat ©  (26.04.04 10:47) [9]

1. У тебя в коде нет определений GetAddressArray и SetAddressArray.

2. Текст сообщения об ошибке - это военная тайна?


 
Sun bittern ©   (2004-04-26 10:59) [12]

TObj = class(TPersistent)

Где метод Assign? Данный класс TObj создан?

Точно задуманно TPersistent?
Moжет TPersistent заменить на TComponent?


 
mikeflat ©   (2004-04-26 11:02) [13]

Класс создан все нормально, все остальные свойства работают - это нет. Указатель, а не массов потому что, тот тоже не работает - у пробовал повсякому. класс должен быть обязательно TPersistent


 
mikeflat ©   (2004-04-26 11:03) [14]

сообщение об ошибке - нарушение доступа по адресу ...


 
Плохиш   (2004-04-26 11:03) [15]

>VMcL ©   (26.04.04 10:55) [11]

> 2. Текст сообщения об ошибке - это военная тайна?

Да это ж всем известно "Обращение в запрещённую область памяти" ;-)

>mikeflat ©   (26.04.04 10:47) [9]

FArray за тебя Пушкин должен создавать?


 
Sun bittern ©   (2004-04-26 11:04) [16]

Тогда
VMcL ©   (26.04.04 10:55) [11]
1.


 
Sun bittern ©   (2004-04-26 11:06) [17]

>> FArray за тебя Пушкин должен создавать?

Можно подробнее ;)


 
evvcom ©   (2004-04-26 11:07) [18]


> PArray = ^TArray;
>  TArray = array [0..7] of integer;
>
>  TObj = class(TPersistent)
>  private
>    FArray: PArray;

А под переменную FArray место выделяешь? Это же указатель. Проще объявить FArray: TArray; - тогда выделять память не надо будет. Замечание VMcL ©   (26.04.04 10:55) [11] пропущено мимо ушей? А зря.


 
evvcom ©   (2004-04-26 11:08) [19]

Во, уже настрочили.


 
Плохиш   (2004-04-26 11:08) [20]


> Sun bittern ©   (26.04.04 11:06) [17]
> >> FArray за тебя Пушкин должен создавать?
> Можно подробнее ;)

Пушкин - это был такой русский известный поэт...


 
mikeflat ©   (2004-04-26 11:21) [21]

Ни хрена не дает это ваше выделение памяти - попробуйте сами!!!!


 
Sun bittern ©   (2004-04-26 11:23) [22]

mikeflat ©   (26.04.04 11:21) [21]

Выкладываей весь код :)


 
mikeflat ©   (2004-04-26 11:27) [23]

Да код-то я уже выложил, все остальное к этому отношения не имеет


 
VAleksey ©   (2004-04-26 11:30) [24]

Может тебе нужен не массив а индексированное св-во наподобие
TStringList.Strings ?

...
Str := List.Strings[i];
...


 
mikeflat ©   (2004-04-26 11:33) [25]

Конечно, это проще всего сделать, но, во-первых, нахрена мне строковый массив, если нужен integer, а во-вторых - это-то чего не работает?!!!


 
Sun bittern ©   (2004-04-26 11:35) [26]

Ну
VMcL ©   (26.04.04 10:55) [11]
1.
Я так и не увидел!!!


 
evvcom ©   (2004-04-26 11:37) [27]


> Да код-то я уже выложил, все остальное к этому отношения
> не имеет

Да ни хрена ты не выложил! Сколько ошибок уже указали, исправил? Как исправил? Все должно работать, если исправил правильно. И как же выделение памяти, например, не имеет отношения к тому коду, который ты выложил раньше?


 
Плохиш   (2004-04-26 11:37) [28]

mikeflat ©   (26.04.04 11:33) [25]

TObj = class(TPersistent)
private
  FArray: PArray;
  ...
  function GetArray(Ind: integer): integer;
  procedure SetArray(Ind: integer;Value: integer);
public
  ...
  property AddressArray[Ind: integer]: integer read GetAddressArray write SetAddressArray;
  ...
  end;

function TObj.GetArray(Ind: integer): integer;
begin
Result := FArray^[Ind];
end;

Объясни-ка на пальцах, куда, при вызове GetArray, указывает твоя переменная FArray?


 
mikeflat ©   (2004-04-26 11:45) [29]

OK, еще раз:
PArray = ^TAddressArray;
TArray = array [0..7] of word;

TObj = class(TPersistent)
 private
   FArray: PArray;
   ...
   function GetArray(Ind: integer): word;
   procedure SetArray(Ind: integer; Value: word);
 public
   constructor Create;
   destructor Destroy; override;
   property Array[Ind: integer]: word read GetArray write SetArray;
   ...
   end;

constructor TObj.Create;
begin
 inherited Create;
 GetMem(FArray,SizeOf(PArray));
end;

destructor TObj.Destroy;
begin
 FreeMem(FArray);
 inherited Destroy;
end;

function TObj.GetArray(Ind: integer): word;
begin
 Result := FArray^[Ind];
end;

procedure TObj.SetArray(Ind: integer; Value: word);
begin
 FArray^[Ind] := Value;
end;

procedure OneProcedure;
var Obj: TObj;
begin
 Obj := TObj.Create;
 Obj.Array[1] := 1;
end;

Please


 
evvcom ©   (2004-04-26 11:46) [30]

+ как делаешь вызов этого [b]GetArray[/b]?


 
evvcom ©   (2004-04-26 11:47) [31]


> OK, еще раз:
> PArray = ^TAddressArray;

What is TAddressArray?


 
Плохиш   (2004-04-26 11:48) [32]


constructor TObj.Create;
begin
inherited Create;
GetMem(FArray,SizeOf(PArray));
end;

Тогда уж и писать надо SizeOf(TArray)


 
evvcom ©   (2004-04-26 11:49) [33]


> GetMem(FArray,SizeOf(PArray));

SizeOf(PArray)=4, а SizeOf(TAddressArray) или SizeOf(TArray) гораздо больше.


 
Плохиш   (2004-04-26 11:49) [34]

>evvcom ©   (26.04.04 11:47) [31]

Опсс, А действительно?


 
evvcom ©   (2004-04-26 11:51) [35]

Действительно! См. также Плохиш   (26.04.04 11:48) [32], а лучше вообще убери указатели и выделение/удаление памяти.


 
evvcom ©   (2004-04-26 11:53) [36]

Оппс...? Это оказывается сам Плохиш вопрос задал, на ник не глянул. Почему такой вопрос?


 
Плохиш   (2004-04-26 11:54) [37]

>evvcom ©   (26.04.04 11:51) [35]
Опсс, А действительно? = What is TAddressArray?
;-)


 
evvcom ©   (2004-04-26 11:57) [38]


> Плохиш   (26.04.04 11:54) [37]
> >evvcom ©   (26.04.04 11:51) [35]
> Опсс, А действительно? = What is TAddressArray?
> ;-)

Чего не понятно? Посмотри еще раз, какой код опять опубликован:

> OK, еще раз:
> PArray = ^[b]TAddressArray[/b];
> [b]TArray[/b] = array [0..7] of word;

И что это такое TAddressArray?


 
mikeflat ©   (2004-04-26 11:58) [39]

СПАСИБО, парни, вы настоящие друзья!


 
Lord Warlock   (2004-04-26 12:10) [40]

я проверил код без всяких указателей, с TArray, работает безукоризненно, так и должно быть. Если ошибка вываливается на выходе из процедуры, в которой создаешь экземпляр TObj, значит не уничтожаешь этот экземпляр (Obj.Free). Если при попытке присвоить значение свойству, значит проблема в чем-то другом, тк твой код вполне рабочий, если из него выкинуть указатели.



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

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

Наверх




Память: 0.56 MB
Время: 0.04 c
1-1079634833
Script
2004-03-18 21:33
2004.04.11
Работа с GroupBox


1-1080056537
TALLA
2004-03-23 18:42
2004.04.11
Использование TChart в DLL - ругается на Parent или ParentWindow


1-1079728986
Igoryok
2004-03-19 23:43
2004.04.11
Консольное - включить русский


1-1080161827
LoMaster
2004-03-24 23:57
2004.04.11
Как создать папку с длинным именем?


11-1061879516
Maxim Pshevlotsky
2003-08-26 10:31
2004.04.11
Как создать библиотеку