![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как можно вывести тип Множество на форму? [D7, WinXP]
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;