Одномерные массивы в среде Delphi. Удаление элемента из одномерного массива, вставка элемента в заданную позицию. Использование компонента Stringgrid.



Работаем с массивами в Delphi

Очень был удивлен когда к нам поступила просьба рассказать о массивах и о их сортировке в Delphi. Но раз уж поступила просьба, а сайт наш призван помочь в освоении Delphi, то я решил написать эту статью, в которой расскажу Вам о возможных действиях с массивами в Delphi. При этом мы напишем несколько пользовательских функций, которые будут помогать нам в дальнейшем при работе с массивами.

Ввод массива

Для того чтобы работать с массивом, его надо с начала получить от пользователя. Попробуем осуществить ввод одномерного массива всего в одно поле редактирования. Каждый элемент массива будет отделяться от предыдущего разделителем. После щелчка на кнопке программа выделит из строки, содержащей массив, первую подстроку, затем выделит вторую подстроку и т.д.

Давайте сейчас этим и займемся. Поставьте на Вашу форму кнопку Button и поле редактирования Edit.

Заголовок нашей функции будет такой:

function GetSubStr(st:string; expl:string; n:integer):string;

где

st - строка, содержащая массив expl - строка разделитель n - номер подстроки

function TForm1.GetSubStr(st:string; expl:string ;n:integer):string;

Var p,i:integer;

Begin

 for i:= 1 to n-1 do

 begin

p:=pos(expl,st);

st:=copy(st,p+1,Length(st)-p);

while (pos(expl,st)=1) and (length(st)>0) do

delete(st,1,1);

 end;

p:=pos(expl,st);

if p<>0 then result:=copy(st,1,p-1)

else result:=st;

End;

Для получения n-ой подстроки (элемента массива) из полученной в качестве аргумента строки функция сначала удаляет предшествующую ей n-1 подстроку (цикл for), затем находит разделитель, который обозначает конец нужной подстроки, выделяет подстроку и возвращает ее в качестве значения функции (через свое имя).Не забудьте добавить заголовок нашей функции в раздел Public модуля программы.Теперь для проверки работы нашей функции напишем обработчик события OnClick, для нашей кнопки. В начале мы с помощью нашей функции получим массив из Edit1, а потом выведем его:

procedure TForm1.Button1Click(Sender: TObject);

var i:integer;

a:array[1..10] of string[10];

st:string;

begin

for i:=1 to 10 do

a[i]:=GetSubStr(Edit1.text,' ',i);//используем пробел в

качестве разделителя

for i:=1 to 10 do

st:=st+IntTostr(i)+' '+a[i]+#13;

ShowMessage(st);

end;

Поиск минимального (максимального) элемента массива

Будем искать минимальный элемент в целочисленном массиве. Для этого немного изменим обработчик события OnClick для кнопки:

procedure TForm1.Button1Click(Sender: TObject);

var i:integer;//номер элемента, сравниваемого с минимальным

a:array[1..10] of integer;

min:integer;//номер минимального элемента

 

begin

//Введем массив

for i:=1 to 10 do

//Преобразуем полученные подстроки в числа

 a[i]:=StrToInt(GetSubStr(Edit1.text,' ',i));//используем пробел в качестве разделителя

//Найдем минимальный элемент

min:=1; //пусть номер минимального элемента = 1

for i:= 2 to 10 do // начнем искать со следующего

 if a[i] < a[min] then min:=i;

Form1.caption:=IntToStr(a[min]); // выводим в заголовок

формы минимальный элемент

end;

В этом примере a[min] минимальный элемент массива, а min - номер минимального элемента. Алгоритм очень простой: сравниваем каждый следующий элемент с минимальным, если он меньше минимального, то запоминаем его номер в переменной min, и продолжаем сравнивать уже с ним.

Чтобы найти максимальный элемент, нужно изменить всего одну строку:

if a[i] < a[min] then min:=i;

Надо заменить на:

 if a[i] > a[min] then min:=i;

Только теперь a[min] - максимальный элемент, а min - номер максимального элемента.Поиск заданного элемента в массивеПоступим методом простого перебора. Для этого будем перебирать все элементы массива, пока не встретим искомый элемент, или пока не дойдем до конца массива.

 

Элемент, совпадение с которым нам надо найти будем хранить в текстовом поле Edit2. Обработчик события OnClick нашей кнопки будет иметь такой вид:

procedure TForm1.Button1Click(Sender: TObject);

var i:integer;

a:array[1..10] of integer;

n:integer;//образец

found:boolean;

begin

//Введем массив

for i:=1 to 10 do

//Преобразуем полученные подстроки в числа

 a[i]:=StrToInt(GetSubStr(Edit1.text,' ',i));//используем пробел в качестве разделителя

n:=StrToInt(Edit2.text);

found:=false;

i:=1;

REPEAT

if a[i] = n then found:=true

 else i:=i+1;

UNTIL (i > 10) or (found = true);

if found then showmessage('Совпадение с элементом номер '+IntToStr(i));

end;

 

Компонент StringGrid

находится на странице Additional палитры компонентов. Там находятся "дополнительные" компоненты, но StringGrid Delphi, на мой взгляд, достоин большего уважения, лично я разместил бы его на странице Standart!

 StringGrid - компонент для отображения различных данных в табличной форме. Как следует из названия, ячейки компонента StringGrid Delphi могут содержать данные, имеющие тип String, а также отображать графику.

Таблица StringGrid состоит из выделенных серым FixedCols и FixedRows - зафиксированных ячеек-заголовков, и обычных, белых ячеек. Содержимое Fixed ячеек недоступно редактированию, и меняется только программно. За возможность редактирования обычных ячеек отвечает одно из значений свойства Options.

Итак, компонент StringGrid имеет возможность адресации каждой отдельной ячейки по номеру столбца и строки. Содержимое ячейки (i, j), где где i - номер столбца, j - номер строки, имеет вид

StringGrid1.Cells[i, j]

и доступно как для чтения, так и для записи. Здесь, как и всегда, номера столбцов ( i ) и строк ( j ) отсчитываются от 0.

 Выделенная ячейка таблицы имеет номер столбца:    StringGrid1.Col

номер строки: StringGrid1.Row

поэтому содержимое выделенной ячейки будет адресоваться так:

S:=StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row];

За многие свойства компонента Delphi StringGrid отвечает свойство Options. В Инспекторе Объектов Options - это раскрывающийся список, представляющий собой элементы данного множества. Если значение элемента равно True, то он присутствует в множестве, если False - то нет.

 Количество строк в Delphi StringGrid равно StringGrid1.RowCount.

 Количество столбцов в Delphi StringGrid равно StringGrid1.ColCount.

Если ячейки не помещаются в таблице, появляются полосы прокрутки. При прокручивании

StringGrid1.LeftCol       Номер столбца, видимого самым левым

StringGrid1.TopRow     Номер строки, видимой самой верхней

StringGrid1.VisibleColCount      Количество столбцов, видимых в рамках таблицы

StringGrid1.VisibleRowCount     Количество строк, видимых в рамках таблицы

У таблицы StringGrid также есть свойство и для управления размером ячеек.Для всех ячеек

DefaultRowHeight - высота строк по умолчанию

DefaultColWidth - ширина столбцов по умолчанию

Эти значения ширины и высоты принимают все новые ячейки. При необходимости индивидуально установить ширину и высоту столбцов и строк соответственно, пользуемся свойствами

RowHeights[i] - массив, содержащий высоты строк с номером i

ColWidths[i] - массив, содержащий ширины столбцов с номером i

Все эти свойства настраиваем в обработчике события OnCreate Формы, так же как и надписи заголовков, располагающиеся в строках и столбцах "фиксированной" зоны таблицы. В результате таблица появляется уже в "настроенном" виде!Отдельно требуется осветить вопрос очистки содержимого таблицы StringGrid. Так как таблица StringGrid, в отличие от, например, компонента Memo, не имеет метода для очистки содержимого сразу всех ячеек, то для удаления внесённых в таблицу ранее данных приходится очищать каждую ячейку отдельно. Делается это двумя вложенными циклами for, пробегающими по столбцам и строкам:

var i, j: Integer;

begin

with StringGRid1 do

for i:=1 to RowCount-1 do //Заголовки строк не трогаем

for j:=1 to ColCount-1 do //Заголовки столбцов не трогаем

Cells[j, i]:='';

end;

 

Хотя, оказывается, есть метод для очищения содержимого целого столбца или строки:

StringGrid1.Cols[i].Clear; //Очищается столбец с номером i

StringGrid1.Rows[i].Clear; //Очищается строка с номером i

Таблица StringGrid Delphi обладает также и графическими возможностями. Ячейки таблицы можно раскрашивать в произвольные цвета, выводить рисунки, размещать не только однострочный, но и многострочный текст.


Дата добавления: 2018-05-12; просмотров: 1082; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!