Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

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

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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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


 
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.


 
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]

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

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


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

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

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

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


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

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


 
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;

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


 
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;

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


 
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. Текст сообщения об ошибке - это военная тайна?


 
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?


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

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


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

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


 
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 за тебя Пушкин должен создавать?


 
Плохиш   (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:04) [16]

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


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

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

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


 
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: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]

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


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

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


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


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

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


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


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

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


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

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


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

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


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

mikeflat ©   (26.04.04 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]

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


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

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


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

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

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


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

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

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


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

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


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

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


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

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


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

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


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


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

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


 
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?


 
Плохиш   (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


 
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:46) [30]

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


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


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

What is TAddressArray?


 
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)


 
Плохиш   (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) гораздо больше.


 
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]

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


 
Плохиш   (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:51) [35]

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


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

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


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

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


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

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


 
Плохиш   (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?


 
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]

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


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

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


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

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


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

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



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

Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.64 MB
Время: 0.041 c
14-1082103832
juiceman
2004-04-16 12:23
2004.05.09
C++


8-1076941731
kopcap
2004-02-16 17:28
2004.05.09
Как быстрее выводить спрайт


9-1070862618
Kair
2003-12-08 08:50
2004.05.09
FPS


3-1081957334
minstrel
2004-04-14 19:42
2004.05.09
TClientDataSet


14-1082017548
blackman
2004-04-15 12:25
2004.05.09
Как программно обновить список установленного оборудования ? [D6,





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский