Форум: "Основная";
Текущий архив: 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