![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как объявить свойство с дополнительным параметром?
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 У меня не числовое :-( С типом строки можно как то прописать подобное тому, что вы написали?