Я не стал решать первую задачу, но две реализации конвертора Арабских в Римские нарисовал (на HiAsm'e и IC для интереса). Предлагаю воткнуть в штатный конвертор этот метод. Надо, нарисую обратный метод (а iarspider, хитер  )
Add(MainForm,280613,98,84) { Left=20 Top=105 Width=221 Height=125 Caption="DecimalToRoman" Position=1 } Add(IntegerArray,5682974,294,77) { IntArray=['M'=1000,'CM'=900,'D'=500,'CD'=400,'C'=100,'XC'=90,'L'=50,'Xl'=40,'X'=10,'IX'=9,'V'=5,'IV'=4,'I'=1] FileFormat=1 } Add(Memory,237103,448,126) { Default=String() } Add(Hub,12748134,147,133) { OutCount=3 link(onEvent1,237103:doClear,[]) link(onEvent2,13350876:doEnum,[]) link(onEvent3,4243737:Convert,[(194,153)(194,391)]) } Add(StrCat,3358455,448,294) { link(onStrCat,237103:doValue,[(492,300)(492,216)(436,216)(436,132)]) link(Str1,237103:Value,[]) link(Str2,13350876:Item,[(461,233)(209,233)]) } Add(Memory,1401807,287,203) { } Add(Repeat,13396544,287,287) { Type=4 link(onRepeat,16756407:doOperation,[]) link(Op1,7377394:Var2,[]) link(Op2,16082805:Var2,[]) } Add(Math,16756407,343,287) { OpType=1 ResultType=0 link(onResult,16357683:doEvent1,[]) link(Op1,7377394:Var3,[(349,247)]) link(Op2,16082805:Var3,[(356,261)]) } Add(ArrayRW,8141205,294,140) { link(onRead,13396544:doRepeat,[(338,146)(338,220)(255,220)(255,293)]) link(Array,5682974:Array,[]) link(Index,13350876:Index,[(307,128)(261,128)(261,184)(216,184)]) } Add(Edit,6388985,98,203) { Left=20 Top=10 Width=85 Text="" DataType=1 link(onChange,8569447:doWork2,[]) } Add(Edit,2067103,448,343) { Left=110 Top=10 Width=85 Text="" link(Str,3358455:Result,[]) } Add(Button,1396319,98,133) { Left=80 Top=65 Caption="Convert" link(onClick,12748134:doEvent1,[]) } Add(StrList,6645552,189,63) { Strings=#1:M|2:CM|1:D|2:CD|1:C|2:XC|1:L|2:XL|1:X|2:IX|1:V|2:IV|1:I| } Add(ArrayEnum,13350876,203,140) { link(onItem,8141205:doRead,[]) link(onEndEnum,2067103:doText,[(369,153)(369,349)]) link(Array,6645552:Array,[]) } Add(GetDataEx,7377394,280,238) { link(Data,1401807:Value,[]) } Add(GetDataEx,16082805,287,252) { link(Data,8141205:Item,[]) } Add(HubEx,8569447,259,196) { link(onEvent,1401807:doValue,[]) } Add(Hub,16357683,392,287) { link(onEvent1,8569447:doWork3,[(436,293)(436,253)(263,253)]) link(onEvent2,3358455:doStrCat,[]) } Add(InlineCode,4243737,231,385) { WorkPoints=#7:Convert| EventPoints=#6:Result| DataPoints=#6:Number| Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|24: Number :THI_event;|24: Result :THI_event;|53: procedure Convert(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|30:procedure THiAsmClass.Convert;|115:const Romans: Array[1..13] of String = ( 'I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M' );|97: Arabics: Array[1..13] of Integer = ( 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);|15:var i: Integer;|16: str: String;|21: Decimal: integer;|5:begin|42: Decimal := ReadInteger(_Data, Number);|14: str := '';|27: for i := 13 downto 1 do|47: while ( Decimal >= Arabics[i] ) do begin|42: Decimal := Decimal - Arabics[i];|33: str := str + Romans[i];|11: end;|29: _hi_onEvent(Result, str);|4:end;|0:|4:end.| link(Result,1824510:doText,[]) link(Number,6388985:Text,[(237,310)(104,310)]) } Add(Edit,1824510,448,385) { Left=110 Top=35 Width=85 Text="" }
|