Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив свойств 
V
    Опции темы
Christoph
Дата 10.2.2009, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



Есть вопрос по свойству массивов, для начала напишу небольшой пример
Код

property  PropArray[Index:Integer]: string  read GetPropArray write SetPropArray;

Это получается массив свойств типа string, и индексирован числовыми значениями, верно?

Методы доступа к свойству:

Код


type
 TPropArray:array[1..10] of string;

FArr: TPropArray;

function TSomeClass.GetPropArray(Index:Integer):string;
begin
  Result:=FArr[Index];
end;

procedure TSomeClass.SetPropArray(Index:Integer; const Value: string);
begin
  if Value <> FArr[Index] then
    FArr[Index]:=Value;
end;



Пример из книги. зачем в методе SetPropArray, выполнять проверку, и что тут такого страшного, если значение опять запишется в массив?
Я понимаю что 1 пост 1 вопрос, но вопросы мелкие, и связанные.
Например, если я пишу следующие:
Код

SomeClass.PropArray[1]:='bla-bla'; 
\\ это получается что фактически я вызываю
SomeClass.SetPropArray(1,'bla-bla');
\\так же само и при чтении
s:=SomeClass.PropArray[1];
s:=SomeClass.GerPropArray(1);

Если я все правильно сказал, то не пойму, откуда метод знает что параметр Index:Integer, что это индекс массива свойств?




--------------------
user posted image
PM MAIL ICQ   Вверх
bems
Дата 10.2.2009, 18:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(Christoph @  10.2.2009,  18:44 Найти цитируемый пост)
что тут такого страшного, если значение опять запишется в массив?

ничего. Но обычно телается больше работы и для этого случая проверка хороша. Кроме того при изменении свойства часто делают событие и получается что если не проверить, то вызывается событие изменения, когда изменения по факту нет. Это не феншуй.

Цитата(Christoph @  10.2.2009,  18:44 Найти цитируемый пост)
Если я все правильно сказал, то не пойму, откуда метод знает что параметр Index:Integer, что это индекс массива свойств?
это компилятор так превращает обращение к свойству в вызов метода. Передает первым аргументом индекс. А если метод объявлен не соответствующе, то не скомпилируется



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Christoph
Дата 10.2.2009, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



С каждым разом удивляюсь smile сколько работы делает компилятор, но всеже если в поле число, то это не займет много времени, записать заново его, попробую еще поэкспериментировать с массивом свойств,bems, вижу у тебя мало плюсиков, держи  smile 


--------------------
user posted image
PM MAIL ICQ   Вверх
Snowy
Дата 10.2.2009, 19:10 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Цитата
Если я все правильно сказал, то не пойму, откуда метод знает что параметр Index:Integer, что это индекс массива свойств?

А он и не знает.
Ты сам описываешь, что делать с этим индексом.
И сам пишешь, что возвращать нужно элемент массива.
С тем же успехом ты можешь возвращать что угодно. Хоть квадратный корень от индекса.
Также ты можешь использовать в качестве индекса что угодно. Строку, или вообще объект.
Соответственно сеттер и геттер будут принимать это самое в качестве параметра.
Можешь обозвать и не индекс, а как угодно. 
PM MAIL   Вверх
bems
Дата 10.2.2009, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(Christoph @  10.2.2009,  19:04 Найти цитируемый пост)
С каждым разом удивляюсь smile сколько работы делает компилятор
В целом много, ну в данном случае не вижу большой работы. Ты ж сам показал это
Код

s:=SomeClass.PropArray[1];
s:=SomeClass.GerPropArray(1);
Подставляет вместо имени свойства метод и  передает туда то же самое. Ну скобки еще меняются. Тут бы и тупой препроцессор справился, не то что компилятор.

Цитата(Christoph @  10.2.2009,  19:04 Найти цитируемый пост)
если в поле число, то это не займет много времени

Ну а потом ты захочешь делать какую-нить сортировку массива, а писать самому влом. и ты всместо поля-массива сделаешь внутренний объект. И окажется что простое присваивание (в тексте оно может выглядеть неизменно) теперь вызывает метод этого внутреннего объекта. С другой стороны - и сравнение обычно довольно быстрая штука. Так что лучше вырабатывать хорошие привычки и делать сравнение всегда.

Цитата(Christoph @  10.2.2009,  19:04 Найти цитируемый пост)
вижу у тебя мало плюсиков, держи
Да, вот такой я нещасный. Сплю и вижу как бы плюсегом разжытцо



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Christoph
Дата 10.2.2009, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



а можно ли в методах доступа помять параметры местами?Хотя в справке по делфи пишет в методе для чтения должен быть параметр для чтения индекса свойства, а для записи, параметр для чтения свойства, и плюс еще переменная того же типа что и свойство (что то в этом роде) , это получается в методе для чтения, полюбому надо объявлять два параметра, а буду ли я использовать два, это уже делфи не важно, верно я сказал?
Код

type
TPropArr=array[1..10] of string;
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    FPropArr:TPropArr;
  public
    function GetProp(a:Integer):string;
    procedure SetProp(b:Integer;Val:string);
    property PropArr[Index: Integer]: string read GetProp write SetProp;
     end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function TForm1.GetProp(a:integer):string;
begin
  Result:=FpropArr[a];
  ShowMessage(IntToStr(a));
end;

procedure TForm1.SetProp(b:integer;Val:string);
begin
  if Val<>FPropArr[b] then
    FPropArr[b]:=Val;
  ShowMessage(IntToStr(b)+Val);
end;



procedure TForm1.FormCreate(Sender: TObject);
var
str:String;
begin
Form1.PropArr[1]:='blfff';
str:=Form1.PropArr[1];
end;

end.


Это сообщение отредактировал(а) Christoph - 10.2.2009, 20:53


--------------------
user posted image
PM MAIL ICQ   Вверх
Snowy
Дата 10.2.2009, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Нет, местами менять нельзя.
Если ты обращаешься по индексу, то, разумеется, геттер и сеттер должны его как-то получить.
Для этого существует строгий синтаксис записи оных.
PM MAIL   Вверх
Christoph
Дата 10.2.2009, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



спасибо все понял, все разобрал спасибо Snowy, bems, очень признателен, тему закрываю


--------------------
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.