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

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

StringList вместо виртуального множества [D7, WinXP]


Страницы:   1 2

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 действительно работает. А вот насчет множеств.... КАК СОЗДАТЬ ЕГО В РАНТАЙМ ???


Страницы:   1 2

Наверх

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