Здравствуйте. Как и у всякого, начинающего работать с новой системой, возникает масса вопросов. Пытаюсь освоить BlackBox, но все больше получается методом "научного втыка", т.к. много непонятного. Итак, пишу программу, которая в общих чертах должна делать вот что: берет с определенного каталога список файлов, переименовывает их по установленным сверху правилам, архивирует, создает e-mail с прикрепленным архивом, удаляет теперь уже ненужные файлы. Вот собственно и все действия.
Но вот при кодировании возникают вопросы:
1. Как можно запустить внешнюю программу, но с ожиданием пока она отработает? WinExec похоже запускает прогу как отдельный процесс и сразу же возвращает управление ББ. Получается: архиватор еще работает, а Bat уже создает письмо с еще несуществующим архивом, ну и напоследок файлы удаляются, не успев обработаться. Лепить задержки наподобие REPEAT GetTime UNTIL (пройдет секунд 10-20), но это слишком сильно грузит процессор. К тому же неизвестно сколько времени может понадобиться архиватору (и почтовику) для обработки.
2. PROCEDURE WinExec (lpCmdLine: WinApi.PtrSTR; uCmdShow: INTEGER): INTEGER;
В интерфейсе WinApi нашел такую процедуру для запуска внешней программы, но откуда мне узнать, что такое 'uCmdShow'? Опять тыкаю наугад, сначала ноль, а затем - единичку...
3. PROCEDURE Exec (IN prog: ARRAY cmdLen OF SHORTCHAR);
VAR i: INTEGER;
p: WinApi.PtrSTR;
BEGIN
p := prog;
i := WinApi.WinExec(p, 1);
END Exec;
Переменная 'p' - указатель, а 'prog' - массив. Что в данном случае я присвоил: указателю адрес массива, или значение массива (но память под него не выделялась)?
4. Имеется ли средство перемещения файлов (move) в пределах одного диска без создания копии исходного файла?
5. Со строками тоже не все гладко:
PROCEDURE Test;
CONST a = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
VAR c: CHAR;
BEGIN
c := a[10]; (*indexed object is not a variable ???*)
END Test;
PROCEDURE Test1;
VAR a: ARRAY 40 OF CHAR;
c: CHAR;
BEGIN
a := '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
c := a[10];
END Test1;
Почему в первом случае компилятор выдает ошибку? Какая разница между CONST-массивом символов и присвоенным в переменную?
А также:
PROCEDURE Test;
VAR s: ARRAY 40 OF CHAR;
c: CHAR;
BEGIN
s := 'abcde';
s := c; (*incompatible operands of dyadic operator ???*)
END Test;
Почему невозможно добавить символ к строке, ведь это тоже массив из одного символа?
Надеюсь у Вас найдется пару минут, что бы просветить изучающего?