Вернуться назад

Программирование.
Часть 1.

1. Вызов редактора кода

Итак, Delhi уже заготовила каркас будущего приложения. Теперь нужно ввести программный код, который может быть выполнен только самим программистом.

1. Щелкните на панели Delphi на кнопке Toggle Form/Unit. При этом форма и редактор кодов поменяются местами (форма спрячется под редактор, а редактор всплывет наверх и станет доступным).

2. Для удобства растяните окно редактора так, чтобы оно заняло всё пространство справа от Object Inspector и под панелью Delphi.

2. Описание глобальных констант, типов и переменных

Теперь необходимо описать глобальные константы, типы и переменные модуля main.pas.

Сразу перед словом implementation введите с клавиатуры текст, показанный на рис. 3. Обратите внимание, что часть этого текста - описание формы - уже сгенерировала сама Delphi.

Есть другой более быстрый способ ввода текста - из этого документа в редактор кодов:
1.2. Выделите мышью в таблице требуемый фрагмент текста.
1.3. Клавишами Ctrl+Insert скопируйте его в буфер обмена.
1.4. Перейдите в редактор кодов Delphi, установите курсор в требуемое место и нажмите Shift+Insert для вставки текста из буфера обмена.

Const
df = 'Datas.txt'; // файл исходных данных

Type // описание типов динамических массивов
TArr1 = array of Real; // одномерный
TArr2 = array of TArr1; // двумерный

Var
fMain: TfMain; // эту строку уже вставила Delphi
a: TArr2;
u: TArr1;
n,m: Integer;

Рис. 3. Описание глобальных констант, типов и переменных

Оператором Const описана текстовая константа df, которой присвоено значение 'Datas.txt'. Это имя файла, в котором будем хранить исходные данные - элементы матрицы А.

В операторе Type описаны два динамических массива вещественного типа (Real).

В операторе Var кроме описанной формы fMain, описан двумерный массив a, одномерный массив u и две целочисленные переменные n, m.

3. Описание вспомогательных функций общего назначения

Для ввода/вывода данных нам потребуется ряд функций общего назначения, которые приведены ниже на рис. 4. Вставьте их сразу за опцией {$R *.DFM}, расположенной после слова imlementation.

{$R *.DFM}

Function RealToStr(r: Real; p: byte): String;
{Конвертирует Real в строку, p - символов в дробной части}
BEGIN
Str(r:30:p,Result); // конвертация real - string
Result:=Trim(Result); // отбрасывание пробелов слева и справа
END;

Function LPad(s: String; d: Word): String;
{вставляет слева от строки пробелы, добирая ее до длины d}
BEGIN
Result:=Format('%*s',[d,s]);
END;

Function RealToStr2(R: Real; All,p: byte): String;
// конвертация real в строку длины All,
// p - цифр в дробной части
BEGIN
Result:=LPad(RealToStr(R,p),All);
END;

Function DaNet(S: String): boolean;
{Задает вопрос, требует ответа в виде Да/Нет}
BEGIN
DaNet:=MessageDlg(S, mtConfirmation, [mbYes, mbNo], 0) = mrYes;
Screen.ActiveForm.Refresh; // удаление следов окна вопроса
END;

Рис. 4. Вспомогательные функции общего назначения

Функция RealToStr2 конвертирует вещественное число в строку, логическая функция DaNet потребуется для уточнения намерений пользователя выполнить ответственную операцию.

4. Описание подпрограмм для работы с компонентом Memo

Ниже этих строк добавьте строки из нижепривеженной таблицы рис. 5. Эти подрограммы предназначены для обработки ввода/вывода при ипользовании в нашем приложении компонентов Memo.  

procedure ToMemo2(s: String);
// добавляет строку s в Memo2, слева вставляется пробел
begin
fMain.Memo2.Lines.Add(' '+s);
end;

function FromMemoToDinArray

  (Me: TMemo; var a: TArr1; var n: Integer): boolean;
// читает числа из Memo и автоматически создает
// одномерный массив А длины n (нумерация от 0)
Label Fin;
var i,j,Code: Integer; s,q: String; r: Real;
begin
n:=0; Result:=true;
With Me, Me.Lines do
if Count>0 then
for i:=0 to Count-1 do
  begin
   s:= Trim(Lines[i]);
   if s <> '' then
    repeat
     j:=Pos(' ',s);
    Case j>0 of
    true : begin
            q:= Copy(s,1,j-1);
            s:=Trim(Copy(s,j+1,Length(s)));
           end;
    false: begin
            q:= Trim(s);
            s:='';
           end;
    end; // Case
    Val(q,r,Code);
    Case Code = 0 of
    true: begin
           Inc(n);
           SetLength(a,n);
           a[n-1]:=r;
          end;
    false: begin
            ShowMessage('Ошибка в данных: '+q);
            Result:= false;
            Goto Fin;
           end;
     end; // Case
  until s = '';
end;
Fin: end;

function FormVspomArrToA: boolean;
// из Memo1 читает числа во вспомогательный массив V,
// затем из него - в массив А.
// возвращает TRUE, если нет ошибок
var v: TArr1; k,i,j: Integer;
begin
Result:=false;
if FromMemoToDinArray(fMain.Memo1,v,k) then
  if (k < n*m) then
   ShowMessage('Недостаточно данных')
  else
  begin
   k:=0; Result:=true;
   SetLength(a,n+1,m+1);
   for i:= 1 to n do
   for j:= 1 to m do
   begin
     a[i,j]:=v[k];
     Inc(k);
   end;
   end;
v:= Nil;
end;

procedure OutStr(Title: String);
// в Memo2 выводит пустую строку, затем строку s
begin
ToMemo2(' ');
ToMemo2(Title);
end;

procedure OutArr1(a: TArr1; d,p: Integer);
// выводит одномерный массив A в Memo2,
// каждое число длины d, в дробной части p символов
var i: Integer; s: String;
begin
s:= '';
for i:= 1 to High(a) do s:=s+RealToStr2(a[i],d,p);
ToMemo2(s);
end;

procedure OutArr2(a: TArr2; d,p: Integer);
// выводит двумерный массив A в Memo2,
// каждое число длины d, в дробной части p символов
var i: Integer;
begin
for i:= 1 to High(a) do OutArr1(a[i],d,p);
end;

Рис. 5. Подрограммы для работы с компонентами Memo

Теперь можно приступать к непосредственному программированию ядра приложения - операций сортировки.

 

</body> </html>