![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
StringList вместо виртуального множества [D7, WinXP]
kyn66 © (2005-08-31 19:22:00)Уважаемые мастера, у себя в программе я хочу сделать нечто виртуального множества при помощи StringGrid. Т.е. я заношу в него некоторые числа. Затем хочу проверить, входит-ли число в это множество, но вылетает ошибка. Что не так?
Var
sg : TStringList
i : Integer;
begin
b := 7;
...
for i := 0 to 10 do
sg.Add(IntToStr(i));
...
if IntToStr(b) in sg.Commatext then
Exit;
end;
Джо (2005-09-01 18:36:00) [1]
> В связи с "автоматом" и машинально продублировал TList.IndexOf.
> :)
Да еще неверно:
Result := Integer(FList[I]);
:))
Джо (2005-09-01 18:19:00) [2]
> [25] begin...end © (01.09.05 18:07)
> И вообще, зачем IndexOf в множестве?
Во "множестве" не нужно, конечно, поэтому не public.
> а что за реализация IndexOf такая странная?
Приведенный код "на автомате" накропал где-то за минуту, во время работы над своей иерархией классов (чертов парсер дикого формата, как раз реализовывал имитацию "списка" для дин. массива). В связи с "автоматом" и машинально продублировал TList.IndexOf. :)
begin...end (2005-09-01 18:07:00) [3]> Джо © (01.09.05 17:14) [18]
Я извиняюсь, а что за реализация IndexOf такая странная? И вообще, зачем IndexOf в множестве?
Digitman (2005-09-01 18:05:00) [4]
> я так просто его назвал, ну пусть мнимое будет
и мнимого тоже нет.
либо множество либо не множество.
Паскаль ..
kyn66 (2005-09-01 17:53:00) [5]Ну вот ты привязался к этому слову "виртуальное", ну я так просто его назвал, ну пусть мнимое будет. Насчет границ - меня устраивает. Хотя за подсказку большое спасибо.
Джо (2005-09-01 17:38:00) [6]
> [21] kyn66 © (01.09.05 17:32)
В том-то и дело, что в [13] нет никакого "виртуального" множества. Множество самое обыкновенное. И процедуры добавления и исключения самые обыкновенные, более того, встроенные в язык. Ключевое слово "in", разумеется, тоже.
Кстати, прочитай, все же, стандартную Справку по поводу множеств. Ибо рискуешь получить неприятный "сюрприз".
The base type can have no more than 256 possible values, and their ordinalities must fall between 0 and 255.
kyn66 (2005-09-01 17:32:00) [7]Ну начнем с того, что множество изначально описывается, сколько и из чего. А я не знаю, сколько элементов в него будет входить, понимаш? А мне сам способ проверки, привлек, понравился как-бы. if Digit in MySet...Вот и все, ничего более. Просто нужно было временное место с накоплением иметь и чтобы с ним сравнивать
Джо (2005-09-01 17:26:00) [8]
> [19] kyn66 © (01.09.05 17:24)
Нет, если [13] тебе подходит, ты уж, будь добр, объясни - что такое "виртуальное множество"?!
kyn66 (2005-09-01 17:24:00) [9]Вау... А что так много? Вот правильное решение [13]. В очередной раз автору Огромное спасибо.
>> Джо Аналогично, спасибо за проявленную отзывчивость
Джо (2005-09-01 17:14:00) [10]
> ...я хочу сделать нечто вроде виртуального множества...
Телепатирую... Может, что-то в эдаком духе?
TIntegerSet = class
private
FList: TList;
function IndexOf (const AValue: Integer): Integer;
public
constructor Create;
destructor Destroy; override;
procedure Include (const Value: Integer);
procedure Exclude (const Value: Integer);
function Contains (const Value: Integer): Boolean;
end;
implementation
procedure TIntegerSet.Include(const Value: Integer);
begin
if IndexOf(Value) = -1 then
FList.Add(Pointer(Value))
end;
constructor TIntegerSet.Create;
begin
inherited Create;
FList := TList.Create;
end;
destructor TIntegerSet.Destroy;
begin
FList.Free;
inherited;
end;
function TIntegerSet.Contains(const Value: Integer): Boolean;
begin
Result := IndexOf(Value) <> -1
end;
function TIntegerSet.IndexOf(const AValue: Integer): Integer;
var
I: Integer;
begin
Result := -1;
for I := 0 to FList.Count-1 do
if Integer(FList[I]) = AValue then
begin
Result := Integer(FList[I]);
Break
end
end;
procedure TIntegerSet.Exclude(const Value: Integer);
var
N: Integer;
begin
N := IndexOf(Value);
if N <> -1 then
FList.Delete(N)
else
raise Exception.Create ('Item not found');
end;
Digitman (2005-09-01 17:11:00) [11]
> хочу сделать нечто вроде виртуального множества
извини, туп я как пробка.
объясни мне, валенку, что есть "виртуальное множество" ..
Джо (2005-09-01 16:58:00) [12]
> [15] kyn66 © (01.09.05 16:53)
> ...я хочу сделать нечто вроде виртуального множества...
Что есть "виртуальный"? И, если уж так приспичило заносить строки в StringList с проверкой на дубликаты, то см. свойство TStringList.Duplicates. А про настоящие множества см. [13] begin...end.
kyn66 (2005-09-01 16:53:00) [13]>>Digitman
...я хочу сделать нечто вроде виртуального множества...
Digitman (2005-09-01 15:52:00) [14]
> проверяю вводимые числа от 1 до 100.
и для этого, конечно же, нужен TStringList, TStringGrid и иже с ними ?
> как только число введено, заношу его в это множество
да не заносишь ты ничего ни в какое множество !
у тебя и множества-то нет в коде.
а есть какой-то StringList, который не имеет ничего общего со множествами с т.з. Паскаля.
если у тебя есть некий списокнеких значений, и тебя заботит уникальность значений в этом списке, то так и говори, а не меси в одну кучу понятия множествои список- это разные разности.
begin...end (2005-09-01 15:15:00) [15]> kyn66 © (01.09.05 15:04) [12]
var
MySet: set of 1..100;
I: Byte;
begin
if not (I in MySet) then
// Числа I нет во множестве MySet
begin
// Включаем его во множество, чтобы при следующей
// проверке исключить его повторный ввод
Include(MySet, I);
// Работаем с введённым числом
...
end
end.
Перед началом работы с множеством его нужно обнулить:MySet := []. В некоторых случаях это происходит автоматически, в соответствии с правилами инициализации переменных (см. справку).
kyn66 (2005-09-01 15:04:00) [16]Я проверяю вводимые числа от 1 до 100. И как только число введено, заношу его в это множество, дабы при последующем вводе проверять из этого множества, чтобы не ввести повторно.
Наиль (2005-09-01 11:17:00) [17]Запахло жаренными орехами...
А аромат-то какой!
Digitman (2005-09-01 11:14:00) [18]
> kyn66 © (01.09.05 11:07) [8]
зачем тебе StringList понадобился - совершенно непонятно ..
begin...end (2005-09-01 11:10:00) [19]> kyn66 © (01.09.05 11:07) [8]
Я так и не понял, какие числа нужно хранить во множестве.
kyn66 (2005-09-01 11:07:00) [20]IndexOf действительно работает. А вот насчет множеств.... КАК СОЗДАТЬ ЕГО В РАНТАЙМ ???