Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.039 c
4-1114259443
Леший
2005-04-23 16:30
2005.06.29
Прозрачная область на форме


3-1116417314
juice
2005-05-18 15:55
2005.06.29
Отладка в IB Expert


3-1115971918
Delphi forever
2005-05-13 12:11
2005.06.29
Организация доступа к БД через Internet


14-1115242958
i-s-v
2005-05-05 01:42
2005.06.29
SMS


9-1111330545
MrAngel
2005-03-20 17:55
2005.06.29
Полноэкранный режим в Direct3D