Нахождение оптимального плана транспортной задачи распределительным методом

 

Министерство образования и науки Российской Федерации

Уральский государственный колледж им. И.И. Ползунова

КП.230105.08. ПЗ










НАХОЖДЕНИЕ ОПТИМАЛЬНОГО ПЛАНА ТРАНСПОРТНОЙ ЗАДАЧИ РАСПРЕДЕЛИТЕЛЬНЫМ МЕТОДОМ

Пояснительная записка





Руководитель /Е.В. Щанова/

Разработал /Е.А. Ищенко/








Екатеринбург 2011

Содержание


Введение

1. Постановка задачи

2. Этапы решения задачи

2.1 Математическая модель

2.2 Разработка алгоритма

2.3 Описание программы

2.4 Тестирование программы

2.5 Анализ полученных результатов

Заключение

Список использованных источников

Приложение А


Введение


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

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

Цель курсового проекта: решение транспортной задачи распределительным методом.

Задачи курсового проекта:

построение математической модели;

разработка алгоритма задачи;

создание программы для решения транспортной задачи распределительным методом в программной среде Borland Delphi7;

решить задачу созданной программой;

проанализировать результат.

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

1. Постановка задачи


От каждого i-го производителя произведенный им ресурс Ai может перемещаться к j-му потребителю ресурса в объеме, не превышающие Bi. Таким образом, xij будет означать перемещение некоторого числа единиц ресурса от i-го производителя к j-му потребителю.

Сформулируем условие задачи для частного случая, которое в дальнейшем будем использовать для тестирования задачи.

Составить оптимальный план перевозок ресурсов от производителя к потребителю с минимальными затратами. Исходные данные указаны в таблице 1.


Таблица 1 - Исходные данные

Матрица стоимостиА1А2А3А4ПроизводителиВ1658714В2364212В391368Потребители1014642. Этапы решения задачи


2.1 Математическая модель


При решении транспортной задачи необходимо:

а)обеспечить всех потребителей ресурсами;

б)распределить все произведенные ресурсы;

в)переместить ресурсы от производителей к потребителям с наименьшими затратами.

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

Транспортная задача всегда разрешима и имеет:

а)единственное решение;

б)несколько допустимых решений, одно из которых оптимально;

в)несколько допустимых решений и все оптимальны.

Через Сij обозначим стоимость перемещения единицы ресурса, от i-го производителя к j-му потребителю. Тогда матрица X={xij} называется матрицей перевозок или планом перевозок, а матрица C={cij} - матрица стоимости.

Строим математическую модель


транспортная задача распределительный метод

, (1)


где F (x) - целевая функция;

cij - коэффициенты матрицы стоимости;

xij - коэффициенты матрицы перевозок.


(x) i j0, i=, j=


2.2 Разработка алгоритма


1)Задать количество производителей и потребителей;

2)Произвести ввод данных, данные берутся из таблицы 1;

)следующим шагом строится опорный план для задачи. В программе рассмотрено построение опорного плана методом "северо-западного" угла и методом минимальных элементов;

)выбирается первый незаполненный элемент опорного плана;

)от выбранного элемента строится кратчайший прямоугольный замкнутый контур, остальные вершины проходит через заполненные элементы опорного плана. Поворот осуществляется только на 900 и только в заполненных элементах;

)каждой вершине контура присваивается коэффициент равный соответствующему значение элементу из С={cij};

)каждому коэффициенту в вершине контура строго поочередно присваивается знак "+" или "-" начиная с пустой клетки;

)выполняется алгебраическое суммирование коэффициентов по всему контуру;

)пункт 4-8 выполняется для каждого пустого элемента опорного плана;

)проверяются результаты суммирования по всем контурам на оптимальность;

)если план перевозок не оптимальный то выполняется перераспределение ресурсов и возвращаемся к пункту 4.

Если при решении транспортной задачи целевая функция стремится к min, то алгебраические суммы по всем контурам должны быть положительными или равными нулю.

Если целевая функция стремится к max, то алгебраические суммы по всем контурам должны быть отрицательными или равными нулю.

Если план перевозок не оптимальный, то перераспределение выполняется следующим образом:

а)выбирается контур, для которого нарушено условие оптимальности, если целевая функция стремится к min, то выбирается отрицательный контур. Если таких контуров несколько, то выбирается тот, который больше по модулю;

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

в)проверяется сбалансированность перевозок по столбцам и строкам;

г)заново рассчитывается алгебраические суммы (по стоимости) для всех контуров;

д)проверяется условие оптимальности.


2.3 Описание программы


Код программы был написан в программной среде Borland Delphi7.

Программа состоит из трех окон.

Для запуска программу нужно два раза кликнуть левой кнопкой мыши по файлу "transportnaya zadacha. exe". При запуске программы открывается главное окно "Решение транспортной задачи распределительным методом =)", в котором необходимо выбрать количество потребителей и количество производителей, метод нахождения опорного плана, после этого ввести данные и нажать на кнопку "Рассчитать". Главное окно программы представлено на рисунке 1.

При нажатии кнопки "Рассчитать" происходит вычисление оптимального плана поставленной задачи распределительным методом.


. Таблица для ввода данных

. Об исполнителе работы

. Кнопка "Рассчитать"

. Выбор опорного плана

. Количество столбцов

. Количество строк

Рисунок 1 - Главное окно программы


На рисунке 2 изображено окно на вкладке "Опорный план", а на рисунке 3 - окно на вкладке "Оптимальный план"


. Значение целевой функции опорного плана

. Опорный план

. Вкладка "Оптимальный план"

Рисунок 2 - Окно вывода информации, вкладка "Опорный план"


. Значение целевой функции оптимального плана

. Оптимальный план

. Вкладка "Опорный план"

Рисунок 3 - Окно вывода информации, вкладка "Оптимальный план"


На рисунке 4 представлено окно программы "Info"


Рисунок 4 - Info


2.4 Тестирование программы


После нажатия на кнопку "Рассчитать" программа составит опорный план, на ваш выбор, высчитает значение целевой функции и на основе опорного плана построит оптимальный план и найдет оптимальное значение целевой функции.

В программе предусмотрена защита на ввод, т.е. нельзя ввести буквы, символы, какие-то знаки, так как программа предназначена для работы с целыми и неотрицательными числами.

Если не заполнить матрицу или заполнить ее не до конца, а также заполнить нулями, то программа выдаст сообщение "Заполните пустые клетки или уберите нули", рисунок 5.


Рисунок 5 - Заполните пустые клетки или уберите нули


Если введенная задача не сбалансирована, то выдаст сообщение "Задача не сбалансирована, приведите ее к сбалансированному виду", рисунок 6.


Рисунок 6 - Задача не сбалансирована, приведите ее к сбалансированному виду


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


2.5 Анализ полученных результатов


Результаты решения задачи программно и вручную совпадают. Ниже представлены решения.

Решение, которое было произведено вручную:

Опорный план был рассчитан методом "Минимальных элементов".


Таблица 2 - Опорный план методом "Минимальных элементов"

26614841288101464

Теперь найдем пустые клети в опорном плане.

Пустые клетки:

a14; a22; a23; a31; a33; a34.

Строим контуры для всех пустых клеток

Контур a14:

,4; 2,4; 2,1; 1,1

Контур a22:

,2; 2,1; 1,1; 1,2

Контур a23:

,3; 2,1; 1,1; 1,3

Контур a31:

,1; 1,1; 1,2; 3,2

Контур a33:

,3; 3,2; 1,2; 3,2

Контур a34:

,4; 3,2; 1,2; 1,1; 2,1; 2,4

Вершинам построенных контуров присвоим значение матрицы данных, чередуя знаки.

Проведем оценку контуров.


Контур a14: С1=7+ (-2) +3+ (-6) =2

Контур a22: С2=6+ (-3) +6+ (-5) =4

Контур a23: С3=4+ (-3) +6+ (-8) =-1

Контур a31: С4=9+ (-6) +5+ (-1) =7

Контур a33: С5=3+ (-1) +5+ (-8) =-1

Контур a34: С6=6+ (-1) +5+ (-6) +3+ (-2) =5


Следующим шагом выбираем максимальный отрицательный элемент по модулю. Так как у нас |-1|=|-1| то выбираем контур a23.

Берем опорный план и присваиваем элементам в контуре a23 знаки чередуя их, начиная с a23 (Таблица 3)


Таблица 3 - Опорный план с расставленными знаками

26-614-841288101464

Теперь из отрицательных чисел мы выбираем минимальное по модулю, в данном случае это (-6). (-6) алгебраически вычтем из всех вершин и получим следующий опорный план (Таблица 4)


Таблица 4 - Опорный план после распределения

86142641288101464

Нам нужно сейчас снова найти пустые клетки

Это a13; a14; a22; a31; a33; a34

Найдем контур для каждого пустого элемента:

Контур a13:

,3; 2,3; 2,1; 1,1

Контур a14:

,4; 2,4; 2,1; 1,1

Контур a22:

,2; 2,1; 1,1; 1,2

Контур a31:

,1; 1,1; 1,2; 3,2

Контур a33:

,3; 3,2; 1,2; 1,1; 2,1; 2,3

Контур a34:

,4; 3,2; 1,2; 1,1; 2,1; 2,4

Проведем оценку контуров.


Контур a13: С1=8+ (-4) +3+ (-6) =1

Контур a14: С2=7+ (-2) +3+ (-6) =2

Контур a22: С3=6+ (-3) +6+ (-5) =4

Контур a31: С4=7

Контур a33: С5=0

Контур a34: С6=6+ (-1) +5+ (-6) +3+ (-2) =5


Оценка контуров положительна, значит решение законченно и оптимальный план найден (Таблица 5).

Таблица 5 - Оптимальный план

86142641288101464

Решение произведенное в программе:


Рисунок 7 - Ввод данных


Рисунок 8 - Опорный план


Рисунок 9 - Оптимальный план


Было протестировано еще множество примеров, решения которых также совпадали с решениями в ручную. Также было решено эту задачу с опорным планом "Северо-западного" угла, решение представлено на рисунке 10 и 11.


Рисунок 10 - Опорный план "Северо-западным" методом


Рисунок 11 - Оптимальный план на основе опорного плана методом "Северо-западного угла"

Заключение


Цель курсовой работы заключалась в составление оптимального плана транспортной задачи распределительным методом.

Все цели которые были поставлены в курсовом проекте были выполнены.

Была построена математическая модель транспортной задачи, после чего разработан алгоритм решения. На основе выше перечисленных целей была создана программа для решения транспортной задачи распределительным методом. В итоге были решены множество задач программой, ответ которой совпадал с заранее подготовленным решением.

Таким образом, цель курсового проекта была полностью достигнута, а сам курсовой проект выполнен.

Список использованных источников


1.#"center">Приложение А


Код программы

unit Unit1;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, Grids, ComCtrls, Buttons, Spin;= array [1.100,1.100] of integer;= class (TForm): TStringGrid;: TGroupBox;: TLabel;: TLabel;: TLabel;: TComboBox;: TButton;: TSpinEdit;: TSpinEdit;: TButton;Button1Click (Sender: TObject);ComboBox1KeyPress (Sender: TObject; var Key: Char);FormCreate (Sender: TObject);StringGrid1DrawCell (Sender: TObject; ACol, ARow: Integer;: TRect; State: TGridDrawState);StringGrid1KeyPress (Sender: TObject; var Key: Char);StringGrid1GetEditText (Sender: TObject; ACol, ARow: Integer;Value: String);SpinEdit1Change (Sender: TObject);SpinEdit2Change (Sender: TObject);SpinEdit1KeyPress (Sender: TObject; var Key: Char);SpinEdit2KeyPress (Sender: TObject; var Key: Char);Button2Click (Sender: TObject);opor_plan (ColCount,RowCount: integer); // опорный план

procedure raspred_metod (mas12: arr); // органазация распределительного метода

function sum_pot (StringGrid: TStringGrid): integer; // сумма потребителейsum_proiz (StringGrid: TStringGrid): integer; // сумма производителейFindPath (i,j: integer); // нахождение путиLookHorizontaly (u, v, u1, v1: integer): boolean; // проверяем есть ли в строке ячейка которую можно взять в контурAddElement (u,v: integer); // добавляем индексы элемента в путь контура LookVerticaly (u, v, u1, v1: integer): boolean; // проверяем есть ли в столбце ячейка которую можно взять в контурproced (); // процедура для нахождение отрицательного значения по сумме контураpereraspred (i: integer); // осуществляется построение следующего опорного плана

{ Private declarations }

{ Public declarations };n=100;: TForm1;,koef2,mas: arr; // массивы коэффициентов размерностью 100x100: integer; // большое чилсо: array of integer; // массив пути: array of array of integer; // массив контура,qwe,kp: integer;: string;Unit2;

{$R *. dfm}TForm1. Button1Click (Sender: TObject);,j,rc,cc: integer;: bool;: =false;: =StringGrid1. RowCount-1; // строки: =StringGrid1. ColCount-1; // столбцы

// проверка таблицы стоимостиi: =1 to cc do

for j: =1 to rc do(StringGrid1. Cells [i,j] ='') or (StringGrid1. Cells [i,j] ='0') then k: =true;

// проверка на сбалансированность программыk<>true then

beginsum_pot (StringGrid1) =sum_proiz (StringGrid1) then_plan (StringGrid1. ColCount,StringGrid1. RowCount)ShowMessage ('Задача не сбалансирована, приведите ее к сбалансированному виду');ShowMessage (Заполните пустые клетки или уберите нули);

end;TForm1.comboBox1KeyPress (Sender: TObject; var Key: Char);: =#0;;TForm1. FormCreate (Sender: TObject);: integer;: =999999;. Cells [0,0]: ='Матрица';. ColCount: =SpinEdit1. Value+2; // задаем количество столбцов = 2. RowCount: =SpinEdit2. Value+2; // задаем количество строк = 2i: =1 to StringGrid1. ColCount-2 do

StringGrid1. Cells [i,0]: ='A'+IntToStr (i);

for i: =1 to StringGrid1. RowCount-2 do

StringGrid1. Cells [0, i]: ='B'+IntToStr (i);

StringGrid1. Cells [StringGrid1. ColCount-1,0]: ='Производители';. Cells [0,StringGrid1. RowCount-1]: ='Потребители';. Cells [StringGrid1. ColCount-1,StringGrid1. RowCount-1]: ='A';;TForm1. AddElement (u, v: integer); // добавляем индексы элемента в путь контура

begin: =kp+1;[qwe]: =u;: =qwe+1;[kp]: =v;;TForm1. FindPath (i, j: integer); // нахождение пути: =-1;: =0;(i,j);not LookHorizontaly (i, j, i, j) then('Невозможно найти контур для: '+IntToStr (i) +' '+IntToStr (j));;TForm1. LookHorizontaly (u, v, u1, v1: integer): boolean; // проверяем // есть ли в строке ячейка которую можно взять в контур,cc: integer;: =false;: =StringGrid1. colCount;i: =0 to cc do(i<>v) and (mas [u, i] <>0) theni=v1 then(u, i); // добавление элементов: =true; // возвращаем true;LookVerticaly (u, i, u1, v1) then(u, i);: =True;;;;TForm1. LookVerticaly (u, v, u1, v1: integer): boolean; // проверяем // есть ли в стобце ячейка которую можно взять в контур

var,rc: integer;: =false;: =StringGrid1. rowCount;i: =0 to rc do(i<>u) and (mas [i,v] <>0) thenLookHorizontaly (i, v, u1, v1) then(i,v);: =True;;;TForm1. opor_plan (ColCount, RowCount: integer); // опорный план,l, q, i, j, sum, rc, cc,min,k,p,x: integer;, fund: array [1. n] of integer; // массивы потребителей и производителей: arr;: =0;: =0;: =StringGrid1. RowCount-2; // строки: =StringGrid1. ColCount-2; // стобцыi: =1 to rc doj: =1 to cc do[i,j]: =StrToIntDef (StringGrid1. Cells [j, i],0); // коэффициенты[i,j]: =StrToIntDef (StringGrid1. Cells [j, i],0); // копия коэффициентов[i,j]: =0; // обнуляем массив;i: =1 to cc do[i]: =StrToIntDef (StringGrid1. Cells [i,rc+1],0); // коэффициенты при "потребитель"i: =1 to rc do[i]: =StrToIntDef (StringGrid1. Cells [cc+1, i],0); // коэффициенты при "производитель"(ComboBox1. Text='Минимального элемента') then

begin(min<>999999) do: =999999;i: =1 to rc doj: =1 to cc do(koef2 [i,j] <>0) and (koef2 [i,j] < min) then: =koef2 [i,j]; // min элемент = koef2 [i,j]

k: =i; // первый индекс минимального элемента: =j; // второй индекс минимального элемента;;[k,p]: =0; // в массиве коэффициенты минимальному элементу присваиваем 0 чтоб программа не брала его снова

if (fund [k] <> 0) and (need [p] <> 0) and (min<>999999) then

if fund [k] >= need [p] then // количество производителей >= количества потребителей

begin[k,p]: =need [p];[k]: =fund [k] - need [p];[p]: =0;i: =k to rc doj: =p to p do[i,j]: =0;fund [k] =need [p] theno: =k to k dol: =p to cc do

koef2 [o,l]: =0;;// количество производителей < количества потребителей

if min<>999999 then[k,p]: =fund [k];[p]: =need [p] - fund [k];[k]: =0;i: =k to k doj: =p to cc do[i,j]: =0;mas123 [k,p]: =0;;i: =1 to rc doj: =1 to cc do(fund [i] <> 0) and (need [j] <> 0) thenfund [i] >= need [j] then[i,j]: =need [j];[i]: =fund [i] - need [j];[j]: =0;[i,j]: =fund [i];[j]: =need [j] - fund [i];[i]: =0;mas123 [i,j]: =0;;: =0;. StringGrid1. ColCount: =cc+2;. StringGrid1. RowCount: =rc+2;. StringGrid2. ColCount: =cc+2;. StringGrid2. RowCount: =rc+2;i: =1 to rc doj: =1 to cc domas123 [i,j] =0 then Form2. StringGrid1. Cells [j, i]: =''Form2. StringGrid1. Cells [j, i]: =IntToStr (mas123 [i,j]);: =sum+mas123 [i,j] *koef [i,j];;2. Edit1. Text: =IntToStr (sum); // выводим значение целевой функции в Edit

raspred_metod (mas123);. Show;

end;TForm1. pereraspred (i: integer); // осуществляется построение следующего опорного плана

var,e,w,rc,cc,min: integer;

mas2: arr;: =Form2. StringGrid1. RowCount-2;: =Form2. StringGrid1. ColCount-2;q: =1 to rc dow: =1 to cc do[q,w]: =mas [q,w]; // копия опорного плана

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

for q: =0 to k-1 do: =0;: =2;w<=rc*cc*2-3 do(q<=k-1) and (contur [i,w] <>0) and (contur [i,w+1] <>0) thene mod 2<>0 then[contur [i,w],contur [i,w+1]]: =mas [contur [i,w],contur [i,w+1]] * (-1)mas2 [contur [i,w],contur [i,w+1]]: =mas [contur [i,w],contur [i,w+1]];: =w+2;: =e+1;;;: =0;: =99999;w<=rc*cc*2-3 do(contur [i,w] <>0) and (contur [i,w+1] <>0) then(abs (mas2 [contur [i,w],contur [i,w+1]]) <>mas2 [contur [i,w],contur [i,w+1]]) and (abs (min) >abs (mas2 [contur [i,w],contur [i,w+1]])) then: =mas2 [contur [i,w],contur [i,w+1]];: =w+2;;: =0;w<=rc*cc*2-3 do(contur [i,w] <>0) and (contur [i,w+1] <>0) then[contur [i,w],contur [i,w+1]]: =abs (mas2 [contur [i,w],contur [i,w+1]] - min);: =w+2;;q: =0 to Length (contur) - 1 dow: =0 to rc*cc*2-1 do[q,w]: =0; // онуляем контур_metod (mas2);

end;TForm1. proced; // процедура для нахождения отрицательного значения по сумме контура

var,j,max,nom_max,rc,cc,sum1: integer;: array of integer;: boolean;: =false;: =Form2. StringGrid1. RowCount-2;: =Form2. StringGrid1. ColCount-2;(massiv,k);: =-1;i: =0 to k-1 do: =j+1;abs (contur [i,rc*cc*2-1]) <>contur [i,rc*cc*2-1] then: =true;[j]: =i; // номер контура

end;;flag=false then // если flag=false тогда программа прекращает расчет и выводит оптимальный план и значение ЦФ

begin: =0;i: =1 to rc doj: =1 to cc domas [i,j] =0 then Form2. StringGrid2. Cells [j, i]: =''Form2. StringGrid2. Cells [j, i]: =IntToStr (mas [i,j]);: =sum1+mas [i,j] *koef [i,j];;. Edit2. Text: =IntToStr (sum1);: =0;_max: =0;i: =0 to k-1 domassiv [i] <>0 thenabs (max) <abs (contur [massiv [i],rc*cc*2-1]) then

begin_max: =massiv [i]; // номер максимального по модулю контура с нуля

max: =contur [massiv [i],rc*cc*2-1];

end;;(nom_max);;TForm1. raspred_metod (mas12: arr);

var,j,q,w,rc,cc: integer; // переменные для массива

begin: =Form2. StringGrid1. RowCount-2;: =Form2. StringGrid1. ColCount-2;i: =1 to rc doj: =1 to cc do[i,j]: =mas12 [i,j];i: =1 to rc doj: =1 to cc domas [i,j] =0 then: =k+1;(contur,k,rc*cc*2);(aPath,rc*cc*2);q: =0 to Length (aPath) - 1 do aPath [q]: =0; (i,j); // находим контур

// Form2. Memo1. Lines. Add ('Контур '+ IntToStr (i) +' '+ IntToStr (j));

// Form2. Memo1. Lines. Add ('Ячейки: ');q: =k-1 to k-1 do: ='';w: =0 to rc*cc*2-1 doaPath [w] <>0 then[q,w]: = aPath [w];: =s+IntTostr (contur [q,w]) +' ';;

// Form2. Memo1. Lines. Add (s);;;;: =-1;i<=k-1 do: =i+1;: =0;: =2;j<=rc*cc*2-3 do(i<=k-1) and (contur [i,j] <>0) and (contur [i,j+1] <>0) thenq mod 2<>0 then koef2 [contur [i,j],contur [i,j+1]]: =koef [contur [i,j],contur [i,j+1]] * (-1)koef2 [contur [i,j],contur [i,j+1]]: =koef [contur [i,j],contur [i,j+1]];[i,rc*cc*2-1]: =contur [i,rc*cc*2-1] +koef2 [contur [i,j],contur [i,j+1]];;: =j+2;: =q+1;;;();;TForm1. sum_pot (StringGrid: TStringGrid): integer;,j: integer;: =0;i: =StringGrid. ColCount-1 to StringGrid. ColCount-1 doj: =1 to StringGrid1. RowCount-1 do: =result+StrToIntDef (StringGrid. Cells [i,j],0);;TForm1. sum_proiz (StringGrid: TStringGrid): integer;,j: integer;: =0;i: =1 to StringGrid. ColCount-1 doj: =StringGrid1. RowCount-1 to StringGrid1. RowCount-1 do: =result+StrToIntDef (StringGrid. Cells [i,j],0);;TForm1. StringGrid1DrawCell (Sender: TObject; ACol, ARow: Integer;: TRect; State: TGridDrawState);

// окраска последнего столбца и последней строки StringGrid1 в оранжевый цветArow=StringGrid1. RowCount-1 then. Canvas. Brush. Color: =clHighlight; // цвет. Canvas. FillRect (Rect); // Закрашиваем задний фон. Canvas. TextOut (Rect. Left,Rect. Top,StringGrid1. Cells [Acol,Arow]); // закрашиваем текст, и выравнивание текста

end;ACol=StringGrid1. ColCount-1 then. Canvas. Brush. Color: =clHighlight;. Canvas. FillRect (Rect);. Canvas. TextOut (Rect. Left,Rect. Top,StringGrid1. Cells [Acol,Arow]);;;TForm1. StringGrid1KeyPress (Sender: TObject; var Key: Char);( (not (key in ['0'. '9'])) and (key<>#8)) then key: = #0;(StringGRid1. Col=StringGrid1. ColCount-1) and (StringGRid1. Row=StringGrid1. RowCount-1) then: =#0;;TForm1. StringGrid1GetEditText (Sender: TObject; ACol,: Integer; var Value: String);

var: HWND; // указатель на дескриптор окна// handle это индефикатор объекта 'указатель'

h: = GetTopWindow ( (Sender as TStringGrid). Handle); // h присваиваем handle компонента stringgridh <> 0 then(h). Perform (EM_SETLIMITTEXT, 5, 0); // находим handle и устанавливаем max количество символов 5

end;TForm1. SpinEdit1Change (Sender: TObject);,j,rc,cc: integer;: =StringGrid1. RowCount; // строки: =StringGrid1. ColCount; // столбцыi: =1 to cc doj: =1 to rc do. Cells [i,j]: =''; // очищаем таблицу

StringGrid1. ColCount: =SpinEdit1. Value+2; // увеличиваем количество столбцов

StringGrid1. Cells [StringGrid1. ColCount-2,0]: ='A'+IntToStr (StringGrid1. ColCount-2); // назначаем имя столбцу. Cells [StringGrid1. ColCount-1,0]: ='Производители'; // назначаем имя последнего столбца. Cells [StringGrid1. ColCount-1,StringGrid1. RowCount-1]: ='A'; // назначаем имя таблицы

end;

procedure TForm1. SpinEdit2Change (Sender: TObject);,j,rc,cc: integer;: =StringGrid1. RowCount; // строки: =StringGrid1. ColCount; // столбцыi: =1 to cc-1 doj: =1 to rc do. Cells [i,j]: =''; // очищаем таблицу

StringGrid1. RowCount: =SpinEdit2. Value+2; // увеличиваем количество строк

StringGrid1. Cells [0,StringGrid1. RowCount-2]: ='B'+IntToStr (StringGrid1. RowCount-2); // назначаем имя строки. Cells [0,StringGrid1. RowCount-1]: ='Потребители'; // назначаем имя последней строки. Cells [StringGrid1. ColCount-1,StringGrid1. RowCount-1]: ='A'; // назначаем имя таблицы

end;

procedure TForm1. SpinEdit1KeyPress (Sender: TObject; var Key: Char);: =#0;;TForm1. SpinEdit2KeyPress (Sender: TObject; var Key: Char);: =#0;;TForm1. Button2Click (Sender: TObject);('Автором этой программы являеться студент группы ПО-305'+ #13#10+ 'УГК имени И.И. Ползунова-- - Ищенко Евгений');

end;.


Министерство образования и науки Российской Федерации Уральский государственный колледж им. И.И. Ползунова КП.230105.08. ПЗ

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ