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

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

Как можно вывести тип Множество на форму? [D7, WinXP]


Страницы:   1 2

towik ©   (2005-06-01 15:18:00) 

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


ferr   (2005-06-01 17:18:00) [1]


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

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


evvcom   (2005-06-01 17:12:00) [2]

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


ferr   (2005-06-01 17:09:00) [3]


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

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


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


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

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


evvcom   (2005-06-01 16:56:00) [5]


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

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


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

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


begin...end   (2005-06-01 16:34:00) [7]

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

> if  ODD(b and 1)

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


ferr   (2005-06-01 16:24:00) [8]

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 раз. Проверено © Раптор


Digitman   (2005-06-01 16:16:00) [9]


> 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;


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

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

> if (b and 1) = 1 then

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


ferr   (2005-06-01 16:02:00) [11]


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

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

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

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


ferr   (2005-06-01 15:57:00) [12]

Рискну исправить [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;


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

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

А set ofнаписал?


ferr   (2005-06-01 15:52:00) [14]

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


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

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

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

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


evvcom   (2005-06-01 15:42:00) [16]


> -=XP=- ©

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


-=XP=-   (2005-06-01 15:39:00) [17]

Упс... 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;


-=XP=-   (2005-06-01 15:36:00) [18]

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

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;


begin...end   (2005-06-01 15:35:00) [19]

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

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


MBo   (2005-06-01 15:30:00) [20]

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;


Страницы:   1 2

Наверх

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