Turbo Pascal 5.5 не умер. Он остается самым удобным компилятором для XT, особенно без жесткого диска, так как не имеет оверлеев. А таких машин у нас в стране много. Между прочим, Borland это прекрасно понимает и версия 5.5 у нас сейчас продается. Но, увы, все библиотеки сейчас как правило ориентированы на версии 6 и 7. Особенно это обидно в отношении модуля OBJECTS из Turbo Vision, который содержит такие полезные объекты, как TRect, TCollection, TStream. Увы, модуль OBJECTS, имеющийся среди примеров к версии 5.5 его не заменяет. Однако, по возможностям Pascal 5.5 практически не уступает 6.0 - удобства только меньше. Например вместо встроенного ассемблера придется пользоваться внешним. А достаточно простой и легко алгоритмизируемый способ перевода текстов c Turbo Pascal 6.0 на Turbo Pascal 5.5 существует. В исходных текстах Turbo Vision никогда не используется оператор asm, а только процедуры и функции с модификатором assembler. Их нужно выделить в отдельный файл и слегка адаптировать синтаксис, чтобы откомпилировать ассемблером. Кроме того, нужно удалить из всех описаний объектов ключевое слово private если оно есть и переместить все private поля к остальным, чтобы они располагались перед первым методом. И последнее - все типизированные константы-указатели, не равные Nil объявить как переменные (или как nil, если они компоненты какой то структуры)и в начало раздела инициализации вписать присваивание им нужных значений. Все это можно легко реализовать программно, хотя ради одного модуля objects автору было лень это делать. Если же кто соберется писать такую программу, то не исключено, что она найдет своих пользователей, тем более, если сделать ее универсальной (7.0 -> 6.0, 6.0 ->5.5 , 7.0 ->5.5) Подробности переноса ассемблерных процедур 1. замените в заголовке процедуры assembler на external 2. создайте ассемблернй файл, содержащий в начале MODEL TPASCAL LOCALS @ Описания всех структур, компоненты которых используются процедурой и всех глобальных переменных (как EXTRN) Описание как EXTRN всех процедур и функций, которые вызываются данной процедурой (если это статические методы, то точку замените на "@") 3. Скопируйте (переместите) туда тело функции. 4. Удалите asm в начале 5. Замените END; в конце на RET ENDP 6. Создайте заголовок и описание локальных переменных в соответствии с синтаксисом Turbo Assembler 7. Если в процедуре есть нетипизированные константы, то оставьте их описание как есть, убрав слово const 8. Если есть типизированные константы, придется сделать их глобальными для модуля и в ассемблерном файле описать как EXTRN 10. замените все конструкции AnyVariable.Word[N] и AnyVariable.Byte[N] на WORD PTR AnyVariable[N] и BYTE PTR AnyVariable[N] (AnyVariable может быть полем записи или конструкцией види ES:[DI].TView.Size.X 11.допишите в конец ассемблерного файла слово END Особый случай возникает с конструкторами/деструкторами на ассемблере, так как Turbo Assembler не генерирует автоматически кода для размещения объекта в памяти. Я вышел из положения так: Constructor TDOSStream.Init(AFileName:String,AMOde:Word);assembler; asm .... end; заменяется на Procedure TDOSStreamInit(AFileName:String,AMOde:Word,Self:TDosStream);assembler; asm .... end; Constructor TDOSStream.Init(AFileName:String,AMOde:Word); begin TDOSStreamInit(AFileName,AMode,Self); end; после чего получившаяся глобальная ассемблерная функция выделяется в отдельный файл по по общим правилам. Примечание для особых эстетов, собирающихся писать такой конвертер Оператор ASM неплохо конвертировать в Inline вызывая, например TASM или DOS-овский DEBUG для ассебмлирования и получения листинга. А если вам просто нужен модуль OBJECTS в формате 5.5, пишите мне VITUS Origin: Св. Видикон Катодский, храни нас!