Главная страница
    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.064 c
14-1117171979
MBo
2005-05-27 09:32
2005.06.29
Пятничные головоломные задачки


1-1117969354
Starcom
2005-06-05 15:02
2005.06.29
В какую библиотеку входят компоненты:


1-1118091583
Karnak
2005-06-07 00:59
2005.06.29
Путь папки windows


3-1116321269
_Max
2005-05-17 13:14
2005.06.29
DBGrid - строки разной высоты


1-1117918546
Pasha L
2005-06-05 00:55
2005.06.29
findFirst и findNext





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