Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.024 c
1-1126797182
TStas
2005-09-15 19:13
2005.10.09
Как получить путь к папке «Мои документы»?


4-1123418703
psa247
2005-08-07 16:45
2005.10.09
ProcessID -> Путь Filename.exe


14-1126851684
BiN
2005-09-16 10:21
2005.10.09
Никто в космос слетать не хочет?


14-1127307165
Prohodil Mimo
2005-09-21 16:52
2005.10.09
как определить language for non-Unicode programs ?


4-1124107383
alex-drob
2005-08-15 16:03
2005.10.09
Отловить событие в другом приложении.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский