Форум: "Начинающим";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
ВнизStringList вместо виртуального множества Найти похожие ветки
← →
kyn66 © (2005-08-31 19:22) [0]Уважаемые мастера, у себя в программе я хочу сделать нечто виртуального множества при помощи 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;
← →
Piter © (2005-08-31 19:34) [1]kyn66 © (31.08.05 19:22)
но вылетает ошибка
а значит прочитать что за ошибка уже нельзя?
← →
jack128 © (2005-08-31 19:39) [2]kyn66 © (31.08.05 19:22)
if IntToStr(b) in sg.Commatext then
это что такое??
← →
kyn66 © (2005-08-31 19:42) [3]>> jack128
Пытаюсь проверить, входит-ли число во множество.
← →
AlexWlad © (2005-08-31 19:46) [4]А кто тебе сказал, что sg.Commatext - множество?
← →
begin...end © (2005-08-31 19:49) [5]> kyn66 © (31.08.05 19:22)
> у себя в программе я хочу сделать нечто виртуального множества
> при помощи StringGrid
А чем не устроило обычное множество? Из приведённого кода не видно, почему оно не подошло.
> if IntToStr(b) in sg.Commatext then
См. в справке: TStringList.IndexOf.
← →
kyn66 © (2005-08-31 19:50) [6]Яж и говорю, пытаюсь таким образом его извоять. А ошибку выдает такую:
Operator not applicable to this operand type
А что есть способ сделать множество в рантайм?
← →
Piter © (2005-08-31 19:54) [7]Насчет множеств - почитай справку Delphi и не морочь людям голову.
Насчет поиска значение в TStringList - тебе уже указали - используй IndexOf
← →
kyn66 © (2005-09-01 11:07) [8]IndexOf действительно работает. А вот насчет множеств.... КАК СОЗДАТЬ ЕГО В РАНТАЙМ ???
← →
begin...end © (2005-09-01 11:10) [9]> kyn66 © (01.09.05 11:07) [8]
Я так и не понял, какие числа нужно хранить во множестве.
← →
Digitman © (2005-09-01 11:14) [10]
> kyn66 © (01.09.05 11:07) [8]
зачем тебе StringList понадобился - совершенно непонятно ..
← →
Наиль © (2005-09-01 11:17) [11]Запахло жаренными орехами...
А аромат-то какой!
← →
kyn66 © (2005-09-01 15:04) [12]Я проверяю вводимые числа от 1 до 100. И как только число введено, заношу его в это множество, дабы при последующем вводе проверять из этого множества, чтобы не ввести повторно.
← →
begin...end © (2005-09-01 15:15) [13]> 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 := []
. В некоторых случаях это происходит автоматически, в соответствии с правилами инициализации переменных (см. справку).
← →
Digitman © (2005-09-01 15:52) [14]
> проверяю вводимые числа от 1 до 100.
и для этого, конечно же, нужен TStringList, TStringGrid и иже с ними ?
> как только число введено, заношу его в это множество
да не заносишь ты ничего ни в какое множество !
у тебя и множества-то нет в коде.
а есть какой-то StringList, который не имеет ничего общего со множествами с т.з. Паскаля.
если у тебя есть некий список неких значений, и тебя заботит уникальность значений в этом списке, то так и говори, а не меси в одну кучу понятия множество и список - это разные разности.
← →
kyn66 © (2005-09-01 16:53) [15]>>Digitman
...я хочу сделать нечто вроде виртуального множества...
← →
Джо © (2005-09-01 16:58) [16]
> [15] kyn66 © (01.09.05 16:53)
> ...я хочу сделать нечто вроде виртуального множества...
Что есть "виртуальный"? И, если уж так приспичило заносить строки в StringList с проверкой на дубликаты, то см. свойство TStringList.Duplicates. А про настоящие множества см. [13] begin...end.
← →
Digitman © (2005-09-01 17:11) [17]
> хочу сделать нечто вроде виртуального множества
извини, туп я как пробка.
объясни мне, валенку, что есть "виртуальное множество" ..
← →
Джо © (2005-09-01 17:14) [18]
> ...я хочу сделать нечто вроде виртуального множества...
Телепатирую... Может, что-то в эдаком духе?
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;
← →
kyn66 © (2005-09-01 17:24) [19]Вау... А что так много? Вот правильное решение [13]. В очередной раз автору Огромное спасибо.
>> Джо Аналогично, спасибо за проявленную отзывчивость
← →
Джо © (2005-09-01 17:26) [20]
> [19] kyn66 © (01.09.05 17:24)
Нет, если [13] тебе подходит, ты уж, будь добр, объясни - что такое "виртуальное множество"?!
← →
kyn66 © (2005-09-01 17:32) [21]Ну начнем с того, что множество изначально описывается, сколько и из чего. А я не знаю, сколько элементов в него будет входить, понимаш? А мне сам способ проверки, привлек, понравился как-бы. if Digit in MySet... Вот и все, ничего более. Просто нужно было временное место с накоплением иметь и чтобы с ним сравнивать
← →
Джо © (2005-09-01 17:38) [22]
> [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:53) [23]Ну вот ты привязался к этому слову "виртуальное", ну я так просто его назвал, ну пусть мнимое будет. Насчет границ - меня устраивает. Хотя за подсказку большое спасибо.
← →
Digitman © (2005-09-01 18:05) [24]
> я так просто его назвал, ну пусть мнимое будет
и мнимого тоже нет.
либо множество либо не множество.
Паскаль ..
← →
begin...end © (2005-09-01 18:07) [25]> Джо © (01.09.05 17:14) [18]
Я извиняюсь, а что за реализация IndexOf такая странная? И вообще, зачем IndexOf в множестве?
← →
Джо © (2005-09-01 18:19) [26]
> [25] begin...end © (01.09.05 18:07)
> И вообще, зачем IndexOf в множестве?
Во "множестве" не нужно, конечно, поэтому не public.
> а что за реализация IndexOf такая странная?
Приведенный код "на автомате" накропал где-то за минуту, во время работы над своей иерархией классов (чертов парсер дикого формата, как раз реализовывал имитацию "списка" для дин. массива). В связи с "автоматом" и машинально продублировал TList.IndexOf. :)
← →
Джо © (2005-09-01 18:36) [27]
> В связи с "автоматом" и машинально продублировал TList.IndexOf.
> :)
Да еще неверно:
Result := Integer(FList[I]);
:))
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.013 c