Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

Как можно вывести тип Множество на форму?   Найти похожие ветки 

 
towik   (2005-06-01 15:18) [0]

Например,
type
TMySet = set of (1..10);
var
a:TMySet;
begin
a:=[1,2];
И мне теперь надо вывести это множество в какой-нибудь компонент.
Что в Label, что в Edit, что в Memo тип String.
Как можно разобратся с типами? Помогите, новичку!


 
PVOzerski ©   (2005-06-01 15:22) [1]

Первое, что пришло в голову:
s := "";
for i := 1 to 10 do
 if i in a then
   s := s + inttostr(i) + " ";
Edit1.Text := s;


 
ferr ©   (2005-06-01 15:26) [2]

никак
или надо 1100000000


 
towik   (2005-06-01 15:26) [3]

Спасибо большое!


 
ferr ©   (2005-06-01 15:28) [4]

А... Для TMySet можно...


 
Digitman ©   (2005-06-01 15:30) [5]

например, так

type
TMySet = set of (1..10);

var
a:TMySet;
b: Byte;

begin
a:=[1,2];
b := PByte(@a);

for i := 1 to 10 do
 begin
   if (b and 1) = 1 then
     Memo.Lines.Add(IntToStr(i));
   b := b shr 1;
 end;


 
MBo ©   (2005-06-01 15:30) [6]

Typinfo.pas
SetToString

я в древности писал с поддержкой многоточий:

procedure TForm1.Button1Click(Sender: TObject);
var
 s: string;
 m: set of char;
 c: char;
 flag: Boolean;
 first: byte;
begin
 s := "[";
 flag := false;
 m := ["-", "+", "1", "0", "2", "3", "5".."9"];
 for c := #0 to #255 do begin
   if c in m then begin
     if not flag then
       s := s + ",""" + c + """";
     flag := true;
   end
   else begin
     if flag then
       if (Ord(c) - first) > 2 then
         s := s + "..""" + Pred(c) + """";
     flag := false;
     first := Ord(c);
   end;
 end;
 if (Length(s) >= 2) and (Pos(",", s) = 2) then
   Delete(s, 2, 1);
 s := s + "]";
 caption := s;
end;


 
begin...end ©   (2005-06-01 15:35) [7]

> Digitman ©   (01.06.05 15:30) [5]

Там два байта будет, а не один.


 
-=XP=- ©   (2005-06-01 15:36) [8]

В общем случае, в множество могут быть включены любые элементы:

type
 MyType = (1..10);
 MyTypeSet = set of MyType;


Или

type
 MyType2 = (mtOne, mtTwo, mtThree);
 MyType2Set = set of MyType2;


Возможное решение (для второго варианта):

const
 MyType2View: array[MyType2] of string = ("mtOne", "mtTwo", "mtThree");


Тогда вывод:

var
 MySet: MyTypeSet;
 i: MyType;
begin
 MySet := [mtOne, mtThree];
 for i := Low(MyType) to High(MyType) do
   if i in MySet then
     Memo.Lines.Add(MyTypeView[i]);
end;


 
-=XP=- ©   (2005-06-01 15:39) [9]

Упс... MyType2

var
MySet: MyType2Set;
i: MyType2;
begin
MySet := [mtOne, mtThree];
for i := Low(MyType2) to High(MyType2) do
  if i in MySet then
    Memo.Lines.Add(MyType2View[i]);
end;


 
evvcom ©   (2005-06-01 15:42) [10]


> -=XP=- ©

var
 OrdTypeInfo: PTypeInfo;
begin
 OrdTypeInfo := PTypeInfo(TypeInfo(MyType2));
 ShowMessage(GetEnumName(OrdTypeInfo, Ord(mtOne)));


 
Германн ©   (2005-06-01 15:45) [11]

2 begin...end ©   (01.06.05 15:35) [7]
>> Digitman ©   (01.06.05 15:30) [5]

>Там два байта будет, а не один.

Кроме того, если не ошибаюсь, и младший бит младшего байта в описанном случае не будет иметь никакого отношения к множеству.


 
ferr ©   (2005-06-01 15:52) [12]

Может и баян но у меня (1..10) не компилируется.(Скобки лишние).


 
TUser ©   (2005-06-01 15:55) [13]

> Может и баян но у меня (1..10) не компилируется.(Скобки
лишние).

А set of написал?


 
ferr ©   (2005-06-01 15:57) [14]

Рискну исправить [5]
type
TMySet = set of 1..10;

var
 a:TMySet;
 b: Word;
 i:integer;
begin
 a:=[1,2,10];
 b := PWord(@a)^;
 for i := 1 to 10 do
 begin
   b := b shr 1;
   if (b and 1) = 1 then
     writeln(i);
 end;


 
ferr ©   (2005-06-01 16:02) [15]


> А set of написал?

Это смешно? :(

type
 TMyType1 = 1..10;
 TMyType2 = (1..10); - тут ругается

Говорит что цифра тут не к месту. Ясно что в скобках подразумевается перечесление, а тут цифра на первом месте.


 
begin...end ©   (2005-06-01 16:10) [16]

> ferr ©   (01.06.05 15:57) [14]

> if (b and 1) = 1 then

В данном случае можно так: if Odd(b) then.
Если не ошибаюсь, так будет немного оптимальнее.


 
Digitman ©   (2005-06-01 16:16) [17]


> ferr ©   (01.06.05 15:57) [14]


угу, конечно же Word !


> Германн ©   (01.06.05 15:45) [11]
> Кроме того, если не ошибаюсь, и младший бит младшего байта
> в описанном случае не будет иметь никакого отношения к множеству.


да, важное замечание.

поправлюсь:

type
TMySet = set of 1..10;

var
a:TMySet;
b: Word;
i:integer;
begin
a:=[1,2,10];
b := PWord(@a)^;
for i := 1 to 10 do
begin
  if (b and (1 shl i)) <> 0 then
    writeln(i);
end;


 
ferr ©   (2005-06-01 16:24) [18]

if (b and 1) = 1 then  inc(e);
cmp dx,$01

if  ODD(b and 1) then inc(e);
test dl,$01



>В данном случае можно так: if Odd(b) then.
> Если не ошибаюсь, так будет немного оптимальнее.

До 3 раз. Проверено © Раптор


 
begin...end ©   (2005-06-01 16:34) [19]

> ferr ©   (01.06.05 16:24) [18]

> if  ODD(b and 1)

В смысле, Odd(b)? :-)


 
towik   (2005-06-01 16:45) [20]

А как наоборот тип String переделать в TMySet? Если понадобится взять элемент с Edit и внести в TMySet?


 
evvcom ©   (2005-06-01 16:56) [21]


> if (b and 1) = 1 then  inc(e);
> cmp dx,$01

пропустил, вероятно: and dx,$01


 
ferr ©   (2005-06-01 17:00) [22]


> В смысле, Odd(b)? :-)

Ошибочка закралась.
Я в результатах ещё соврал. ~20% вроде бы по последним данным.
P.S. Не судите строга, у меня экзамен сегодня. :)


 
ferr ©   (2005-06-01 17:09) [23]


> towik   (01.06.05 16:45) [20][Ответить]

a:=a+[StrToInt("5")];


 
evvcom ©   (2005-06-01 17:12) [24]

Include(a, TMySet(StrToInt("5")));


 
ferr ©   (2005-06-01 17:18) [25]


> evvcom ©   (01.06.05 17:12) [24] [Новое
> сообщение][Ответить]

TMyType=1..10;
TMySet = set of TMyType;
Include(a, TMyType(StrToInt("5")));
:))



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.038 c
4-1112515772
ssmaxx
2005-04-03 12:09
2005.06.29
Рисование на панели


1-1117510543
Сергей Ю.
2005-05-31 07:35
2005.06.29
Как отловить Error reading XXXXXXXX?


14-1117844669
Белолипский Александр
2005-06-04 04:24
2005.06.29
Я увлекаюся спортивною рыбалкой!


3-1116476386
dreamse
2005-05-19 08:19
2005.06.29
Какой коммандой удалить базу из SQL сервера ?


14-1117675849
Dyakon_Frost
2005-06-02 05:30
2005.06.29
Геометрия на плоскости





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский