Паскал в ДВА броя!

1)В:>Как да възстановя източниците на Pascal от .exe/.tpu?

1) О: Няма начин! Въпреки че, ако има желание да страдате, тогава. Пакетът Turbo Analyst 7.0 има помощна програма, която може да възстанови интерфейсната част на компилирания модул, както и да сглоби частта за изпълнение.

2)В:>Как да използвам TPU за 6-та версия на TP в 7-ма версия? 2)A: Ако няма източници, тогава няма начин!

3)В: >Искам Pascal под DOS, но в защитен режим! 32-битова защита! Под Win32! Под OS/2! 3)A: В Borland Pascal 7.0 може да се използва само_ 16-битов защитен режим, известен още като DPMI. (Turbo Pascal е само лека версия на BP, която работи само в реален режим, така че стартирайте BP.exe и ще научите много (поне вижте възможностите на клаузата TARGET при компилиране). Има други компилатори за 32-битов защитен режим:

4)В:>Защо закъсненията, определени от процедурата Delay(), са различни на различните машини? 4)A: CRT модулът е написан зле.

5)В:>Какво тогава да правите с фиксирано забавяне, вместо Delay()? 5)A: Ако точността от 1 тик (1/18 от секундата) е достатъчна, тогава това: Изчакайте - в *микро*секунди, но резолюцията все още е точна до

976 микросекунди (приблизително 1 милисекунда), т.е. просто е безсмислено да задавате по-малко от 1024.

6)В:>Как мога да премахна курсора в текстов режим? 6)A: процедура CursorOff; асемблер;

7)В:>Как мога да го включа отново? 7)A:

8)В:>Възможно ли е курсорът да се вижда, но да не мига? 8)A: Не. Просто нарисувайте '_' (долна черта) на правилното място.

10)В:>Защо процедурите за побитово преместване shl, shr са бъгове, когато се прилагат към LongInt? 10)A: Известен бъг. Можете да поставите корекцияBP7.0 -> BP7.01 или използвайте свои собствени процедури. Ето един пример (работа на 386+):

11)В:>Защо при умножаване на 2 числа резултатът е грешен: В l се оказва. 44318, а не 699678, както трябва да бъде. Това бъг ли е? 11)A: Не, това е функция. Типът на израза се определя само от типа на променливите, които съдържа, а не от типа на променливата, в която е записан резултатът. Ако има опасност от препълване, трябва изрично да конвертирате типа: l:=LongInt(a)*b;

12)В:>Как мога да стартирам друга програма от моята програма? 12)A: Използване на процедурата Exec:

13)В:>Защо моята външна програма не работи? 13)О: А кой ще даде паметта на външната програма? По подразбиране всичките 640Kb се дават на вашата програма. Можете да коригирате това или чрез Options/Memory Sizes../High heap limit, или с директива за компилатор: Тук първата цифра е паметта за стека (локалните променливи на всяка извикана процедура/функция се поставят в стека), втората е долната граница на паметта, третата е горната. В този пример 10 000 байта са дадени на вашата програма, а останалите са дадени на външна програма.

14)В:>Ами ако аз самият имам нужда от паметта? 14)A: Използвайте библиотеката за суапинг (разтоварване от паметта) към XMS/EMS/Disk - преди да стартирате външната програма, вашата програма, заедно с всички данни, се копира в XMS/EMS или на винта и след като външната програма приключи, се възстановява. Можете да използвате например модула SPAWNO от Ralph Brown или модула OpExec от ObjectProf от TurboPower.

15)В:>Как да направя процедура с нефиксиран брой параметри, като writeln? 15)A: Вграден BP - Няма начин. WriteLn изобщо не е процедура, това е макрос, създаден за удобство.

16)В:>Как да се справите с него (направете такъвпроцедура)? 16)A: Предайте указател към блок с параметри и някакъв флаг, според който вътре в процедурата вие сами ще се справите с този блок с параметри. Например: procedure aaa(var param; flag: byte);

17)В:>Как мога да разбера ErrorLevel, зададен от програма, стартирана чрез Exec()? 17)A: Използване на DosExitCode:

18)В:>Да предположим, че стартирате моя EXE. > Как да разбера от програмата в коя директория се намира, > и беше ли преименуван? 18)A: Функцията ParamStr(0) връща пълното име на изпълнявания exe файл, например 'c:\exe\work.exe'. Когато стартирате програмата под >

19)В:>Как да разбера какви параметри се предават на моя EXE при извикване от командния ред? 19)A: Функцията ParamStr(i) връща i-тия параметър като низ. Отделен параметър е комбинация от знаци, която не съдържа интервали. Функцията ParamCount връща общия брой параметри, предадени на програмата. 19)A2: Ако трябва да извършите някои разширени операции на предадения команден ред - например, получавате параметри, съдържащи интервали и затворени в кавички - следният източник ще ви помогне, копирайки целия команден ред в оригиналната му форма в низова променлива:

20)В:>Възможно ли е да напишете ред с произволна дължина в средата на текстов файл, но да оставите останалите редове така, както са били, или да изтриете един ред от средата? 20)A: Точно така - не. Има две възможности. Лесно: отворете втори файл, прочетете редове от първия, напишете редове във втория, пропуснете това, което не е необходимо, или добавете на правилните места. Сложно: отворете файл като двоичен файл, направете списък с дължини на низове и копирайте частите от файла в друг с помощта на BlockRead/BlockWrite.

21)В:>Как да преминете през всички директории надиск? 21)A: Използване на процедурите FindFirst, FindNext. Описанието им е в помощта. Накратко – във функцията за преминаване, ние обикаляме всички срещания в директорията и проверяваме всяка от тях – ако е директория, тогава влизаме в нея и рекурсивно извикваме функцията за преминаване на директория.

22)В:>Защо Borland Pascal не може да отвори повече от 14 файла едновременно? 22)A: Използвайте този модул във вашата програма. Можете да отворите до 255 файла.

23)В:>1) Как да отворите файл с атрибута read/only? псува. > 2) Как мога да изтрия r/o файла? 23)A: Трябва да премахнете r/o атрибута от файла и след това да правите каквото искате с него.

24)В:>Търся всички поддиректории в тази директория с помощта на процедурата FindFirst('*.*',Directory,Search) и тя намира не само поддиректории, но и всички файлове. Какво не е наред? 24)A: Проблем с MS-DOS. А именно прекъсване на функциите 4E 21. След всяко използване на FindFirst/FindNext, трябва да проверите дали сте намерили директория: ако Search.Attr и (Directory <> 0) тогава започнете [. ]край;

25)В:>Защо файлът не иска да бъде преименуван/изтрит? Направих това: Assign(f,'file'); нулиране (f); Erase(f) 25)A: Отворените файлове не могат да се преименуват/изтриват. Или го затворете с командата Close(f), преди да го изтриете, или изобщо не го отваряйте - направете Erase веднага след Assign. присвояване (f, 'файл'); Изтриване (f)