Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Массив свойств


Автор: Christoph 10.2.2009, 18:44
Есть вопрос по свойству массивов, для начала напишу небольшой пример
Код

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, что это индекс массива свойств?


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

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

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

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

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

А он и не знает.
Ты сам описываешь, что делать с этим индексом.
И сам пишешь, что возвращать нужно элемент массива.
С тем же успехом ты можешь возвращать что угодно. Хоть квадратный корень от индекса.
Также ты можешь использовать в качестве индекса что угодно. Строку, или вообще объект.
Соответственно сеттер и геттер будут принимать это самое в качестве параметра.
Можешь обозвать и не индекс, а как угодно. 

Автор: bems 10.2.2009, 19:44
Цитата(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 Найти цитируемый пост)
вижу у тебя мало плюсиков, держи
Да, вот такой я нещасный. Сплю и вижу как бы плюсегом разжытцо

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

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.

Автор: Snowy 10.2.2009, 20:55
Нет, местами менять нельзя.
Если ты обращаешься по индексу, то, разумеется, геттер и сеттер должны его как-то получить.
Для этого существует строгий синтаксис записи оных.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)