Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как объявить свойство с дополнительным параметром?


Страницы:   1 2

Abcdef123 ©   (2012-11-28 07:37:00) 

Здравствуйте, Мастера!
Прошу прощения за вопрос, скорее всего он примитивный, но я не знаю на него ответ.
Итак, обычно если надо в некоем классе объявить паблик проперти, то это делается так:
TmyClass=class
 private
   function GetCISSkinID: String;
   procedure SetCISSkinID(const Value: String);
 public
   property CISSkinID: String read GetCISSkinID write SetCISSkinID;
end;
Но мне нужно работать со значением в зависимости от USERID, то есть было бы замечательно если б работало так:
TmyClass=class
 private
   function GetCISSkinID (AUserID: String): String;  //взять значение из таблицы на конкретного пользователя

   procedure SetCISSkinID( AUserID: String;const Value: String);//записать значение в таблицу на конкретного пользователя

 public
   property CISSkinID: String read GetCISSkinID write SetCISSkinID;
end;
Но, к сожалению, такая "грамматика" не проходит через компилятор. Помогите, плиз, как я могу реализовать такую вот задачку?
Заранее благодарна!


DevilDevil   (2012-11-29 02:33:00) [1]

> Abcdef123   (28.11.12 07:37) 

всё-таки лучше такие задачи решать через property
удобнее пользоваться

как уже сказали:
TmyClass=class
private
 function GetCISSkinID(AUserID: String): String;  
 procedure SetCISSkinID(AUserID: String; const Value: String);
public
 property CISSkinID[UserID: string]: String read GetCISSkinID write SetCISSkinID;
end;


если уж совсем по правильному, то указывая, что это константы :)
TmyClass=class
private
 function GetCISSkinID(const AUserID: String): String;  
 procedure SetCISSkinID(const AUserID: String; const Value: String);
public
 property CISSkinID[const UserID: string]: String read GetCISSkinID write SetCISSkinID;
end;


Юрий Зотов   (2012-11-28 22:24:00) [2]

> Abcdef123

Это называется "индексированное свойство". В качестве индекса может использоваться и строка.

F1
TStrings
property Values[const Name: string]: string;


Плохиш   (2012-11-28 16:38:00) [3]


> han_malign   (28.11.12 13:25) [20]

Проблема ветки не в том надо-не надо или можно-не можно, а в отсутствии у тс базовых знаний и, главное, отсутствии желания эти знания получить. Ибо эта тема прекрасно описана в справке с требуемыми тс примерами чуть ли не для копи/пасте.


Sha   (2012-11-28 13:30:00) [4]

> нахрена вообще property

желание ТС


han_malign   (2012-11-28 13:25:00) [5]

нахрена вообще property, если сериализация не предполагается и доступ на запись не обламывается - только ради семантики присваивания?
public
   ...
   function GetCISSkinID(): string; overload;
   function GetCISSkinID(out AUserID: string): string; overload;

   function exchangeCISSkinID(out AUserID: string; const NewValue: string): string;
end;


Sha   (2012-11-28 12:09:00) [6]


unit Unit1;

interface

type
 TmyClass=class
 private
   FId, FValue: string;
   function GetCISSkinID(const AUserID: string): string;
   procedure SetCISSkinID(const AUserID, AValue: string);
 public
   property CISSkinID[const AUserID: string]: string read GetCISSkinID write SetCISSkinID;
 end;

implementation

{ TmyClass }

function TmyClass.GetCISSkinID(const AUserID: string): string;
begin;
 if AUserID=FId then Result:=FValue else Result:='IdNotFound';
 end;

procedure TmyClass.SetCISSkinID(const AUserID, AValue: string);
begin;
 FId:=AUserId;
 FValue:=AValue;
 end;

end.

//-------------

procedure TForm1.Button2Click(Sender: TObject);
var
 my: TmyClass;
begin;
 my:=TmyClass.Create;
 my.CISSkinID['a']:='aa';
 Memo1.Lines.Add(my.CISSkinID['b']);
 Memo1.Lines.Add(my.CISSkinID['a']);
 my.Free;
 end;


sniknik   (2012-11-28 11:26:00) [7]

> A что представляет собой TGetCISSkinID
рекорд с полями, вообще любыми, а в по теме - AUserID и CISSkinID


Abcdef123   (2012-11-28 11:17:00) [8]

Исходя из написанного в [11], [12], [16] я решила остановиться на первом совете sniknik, объявлю UserID отдельно. Тем не менее большое спасибо Ega23 за [3] как приобретенное знание на будущее.
И также для себя  (для расширения кругозора) хотела бы спросить sniknik пояснение To [14]  A что представляет собой TGetCISSkinID, как прописать объявление этого типа?
Надеюсь на ответ по этому вопросу, и тему можно считать закрытой. Всем откликнувшимся большое спасибо!!!


sniknik   (2012-11-28 10:23:00) [9]

вообще, ИМХО т.к. задача/логика не известна, неправильно объединять, правильнее в объекте держать дефаултного юзера, работать по нему, а в обработчиках свойств подымать эксепты если не задан..


Плохиш   (2012-11-28 10:01:00) [10]


> Abcdef123   (28.11.12 08:33) [5]
> To [3] UserID У меня не числовое :-( С типом строки можно
> как то  прописать подобное тому, что вы написали?
>
>

Вам нужен код для копи/паста? Тогда наймите программиста.


sniknik   (2012-11-28 09:45:00) [11]

> через тип рекорд, как это?
property CISSkinID: TGetCISSkinIDread GetCISSkinID write SetCISSkinID;


sniknik   (2012-11-28 09:31:00) [12]

> Есть какие-нибудь идеи как реализовать такую вот задачку?
2 варианта привел в "комментарии", читать умеешь?


O'ShinW   (2012-11-28 09:24:00) [13]


> Ну неудобно же

насчет удобства - без разницы
просто медленнее, обычно, чем int


Ega23   (2012-11-28 09:13:00) [14]


> например, guid as string

Ну неудобно же. Давай ещё IntToStr использовать, ага.


O'ShinW   (2012-11-28 09:03:00) [15]


> Как это ID не числовое???

например, guid as string


Ega23   (2012-11-28 08:58:00) [16]

Стоп!
Как это ID не числовое???


Ega23   (2012-11-28 08:57:00) [17]


>  UserID У меня не числовое :-( С типом строки можно как
> то  прописать подобное тому, что вы написали?


Можно.


Dimka Maslov   (2012-11-28 08:45:00) [18]


> У меня не числовое


Тип может быть любым. Хоть записью, хоть массивом


Abcdef123   (2012-11-28 08:41:00) [19]

To [2] Да, я знаю, что можно так, как вы сказали (либо еще одно свойство в класс - UserID). Вероятно, что так я в конечном итоге и поступлю. Просто подумала, что может как то через проперти можно обе части сразу "обрабатывать". А могли бы вы пример прописать второй вариант - через тип рекорд, как это?


Abcdef123   (2012-11-28 08:33:00) [20]

To [3] UserID У меня не числовое :-( С типом строки можно как то  прописать подобное тому, что вы написали?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо