Курсовая работа: Багатокритеріальна задача лінійного програмування
невід'ємності. Тобто вони не повинні бути менше нуля.}
Var CurGrid:TStringGrid; CurCol, CurRow: Integer;
MouseCoordsInGrid:TPoint;
Begin
If Sender=Nil then Exit;
{Якщо до вмикання форматування був якийсь обробник події, запускаємо його:}
If @Self. OldOnDblClick<>Nil then Self. OldOnDblClick(Sender);
If Sender is TStringGrid then
Begin
CurGrid:=TStringGrid(Sender);
{Пробуємо узнати, на яку комірку двічі натиснула миша:}
MouseCoordsInGrid:=CurGrid. ScreenToClient (Mouse. CursorPos);
CurCol:=-1; CurRow:=-1;
CurGrid. MouseToCell (MouseCoordsInGrid.X, MouseCoordsInGrid.Y, CurCol, CurRow);
{Якщо натиснуто на комірку-заголовок стовпця коефіцієнтів при змінній, то:}
If ((CurCol>=(Self.CHeadColNum+bc_LTaskColsBeforeVars)) and
(CurCol<(CurGrid. ColCount-bc_LTaskColsAfterVars))) and
(CurRow=Self.CHeadRowNum) then
Begin
{Змінюємо ознаку залежності відповідної змінної:}
If CurHeadRow [CurCol – Self.CHeadColNum-
bc_LTaskColsBeforeVars].ElmType=bc_IndependentVar then
CurHeadRow [CurCol – Self.CHeadColNum-
bc_LTaskColsBeforeVars].ElmType:=bc_DependentVar
Else
CurHeadRow [CurCol – Self.CHeadColNum-
bc_LTaskColsBeforeVars].ElmType:=bc_IndependentVar;
{Задаємо перемалювання комірок, щоб відобразилася зміна позначки
для змінної:}
CurGrid. Invalidate;
End;
End;
End;
Procedure TGridFormattingProcs. InitGridPopupMenu (SGrid:TStringGrid);
{Процедура перевіряє наявність об'єкта TPopupMenu. Якщо його немає
(SGrid. PopupMenu=Nil), то створює новий.
Видаляє усі пунтки (елементи, теми) з меню.}
Begin
If SGrid. PopupMenu=Nil then
Begin
SGrid. PopupMenu:=TPopupMenu. Create(Application);
End;
SGrid. PopupMenu. AutoPopup:=False;
SGrid. PopupMenu. Items. Clear;
End;
Procedure TGridFormattingProcs. ProcOnCellTypeSelInMenu (Sender: TObject);
{Обробник вибору пункту в меню типів для комірки
рядка – чи стовпця-заголовка.}
Const sc_CurProcName='ProcOnCellTypeSelInMenu';
Procedure ReportUnsupportedCell;
Begin
{Відображає координати комірки з повідомленням про те, що вона
не підтримується:}
If Self. CurOutConsole<>Nil then
Begin
Self. CurOutConsole. Lines. Add (sc_CurProcName + sc_NoCellOrNotSupported+
' ['+IntToStr (Self. CurGridSolveCol)+';'+IntToStr (Self. CurGridSolveRow)+
']… ');
End;
End;
Var CurMenuItem:TMenuItem; TypeForCell:THeadLineElmType;
Begin
If (Sender=Nil) or (Not (Sender is TMenuItem)) then
Begin
If Self. MemoForOutput<>Nil then
Self. MemoForOutput. Lines. Add (sc_CurProcName + sc_CantDetMenuItem);
Exit;
End;
{Читаємо тип, що обраний для комірки:}
CurMenuItem:=TMenuItem(Sender);
TypeForCell:=THeadLineElmType (CurMenuItem. Tag);
If (Self. CurGridSolveCol<0) and (Self. CurGridSolveRow<0) then
Begin {якщо комірка вище чи лівіше заголовків таблиці:}
ReportUnsupportedCell; Exit;
End;
{Перевіряємо координати комірки і змінюємо її тип:}
{координати комірки мають бути записані у CurGridSolveRow і CurGridSolveCol:}
If Self. CurGridSolveRow=-bc_LTaskRowsBeforeVars then
Begin {якщо це комірка рядка-заголовка:}
If Length (Self. CurHeadRow)>Self. CurGridSolveCol then {якщо комірка існує:}
Begin {задаємо тип комірки:}
Self. CurHeadRow [Self. CurGridSolveCol].ElmType:=TypeForCell;
End
Else {якщо в рядку-заголовку немає такої комірки:}
Begin
ReportUnsupportedCell; Exit;
End;
End
Else if Self. CurGridSolveCol=-bc_LTaskColsBeforeVars then
Begin {якщо це комірка стовпця-заголовка:}
If Length (Self. CurHeadCol)>Self. CurGridSolveRow then {якщо комірка існує:}
Begin {задаємо тип комірки:}
Self. CurHeadCol [Self. CurGridSolveRow].ElmType:=TypeForCell;
End
Else {якщо в стовпці-заголовку немає такої комірки:}
Begin
ReportUnsupportedCell; Exit;
End;
End
Else {якщо комірка у таблиці коефіцієнтів або правіше чи нижче неї:}
Begin
ReportUnsupportedCell; Exit;
End;
{Якщо тип комірки змінено, то перемальовуємо екранну таблицю для
відображення нового типу комірки:}
If Self. CurGrid<>Nil then Self. CurGrid. Invalidate;
End;
Procedure TGridFormattingProcs. AddCellTypeItemToMenu (SMenu:TPopupMenu;
SCaption: String; IsCurrentItem: Boolean; SAssocType:THeadLineElmType;
ToSetReactOnClick: Boolean=True);
{Додає пункт меню для вибору типу комірки в таблиці з заданим
написом SCaption і кругом того кольору, що асоційований з даним
типом SAssocType. Для нового пункту меню настроює виклик процедури обробки
комірки для задавання їй обраного типу SAssocType. Значення SAssocType
записує у поле Tag об'єкта пункту меню.
Вхідні дані:
SMenu – контекстне меню для комірки, що формується;
SCaption – підпис для пункту меню (назва типу комірки);
IsCurrentItem – ознака того, що даний пункт меню має бути поточним
(ввімкненим, відміченим) – що це поточний тип комірки;
SAssocType – тип комірки, що прив'язаний до цього пункта меню, і буде
присвоєний комірці при виборі цього пункту;
ToSetReactOnClick – вмикач настройки виклику процедури задавання нового
типу комірки (при виборі елемента меню). При ToSetReactOnClick=False
це не виконується, і натискання елемента меню не викликає ніяких дій.}
Var CurMenuItem:TMenuItem;
SAssocColor:TColor;
Begin
If SMenu=Nil then Exit; {якщо меню не задано – елемент не додаємо в нього}
{Створюємо новий тункт меню:}
CurMenuItem:=TMenuItem. Create(Application);
{Отримуємо колір для даного типу комірки:}
SAssocColor:=Self. GetColorByElmType(SAssocType);
{Біля тексту малюємо круг такого кольору, який асоційований
з типом комірки, і буде присвоєний їй у разі вибору цього пунтку
меню:}
CurMenuItem. Bitmap. Height:=bc_MenuItemColorCircleDiameter;
CurMenuItem. Bitmap. Width:=bc_MenuItemColorCircleDiameter;
CurMenuItem. Bitmap. Canvas. Pen. Color:=SAssocColor;
CurMenuItem. Bitmap. Canvas. Brush. Color:=SAssocColor;
CurMenuItem. Bitmap. Canvas. Ellipse (CurMenuItem. Bitmap. Canvas. ClipRect);
{0 – картинка задана у самому об'єкті, а не в SMenu. Images:}
CurMenuItem. ImageIndex:=0;
CurMenuItem. RadioItem:=True; {промальовувати перемикач, якщо не буде картинки}
{Текст пункту меню:}
CurMenuItem. Caption:=SCaption;
CurMenuItem. Checked:=IsCurrentItem;
If ToSetReactOnClick then {якщо обробка вибору елемента меню ввімкнена}
Begin
{Тип для комірки у випадку вибору цього пунтку меню:}
CurMenuItem. Tag:=Integer(SAssocType);
{Процедура-обробник вибору пункта меню:}
CurMenuItem. OnClick:=Self. ProcOnCellTypeSelInMenu;
CurMenuItem. AutoCheck:=True;
End;
SMenu. Items. Add(CurMenuItem);
End;
(* {Ідентифікатор для типу елемента масиву чисел та імен змінних.
Типи змінних: залежні, незалежні, функції (умови-нерівності).
Залежні змінні – це змінні, для яких діє умова невід'ємності:}
THeadLineElmType=(bc_IndependentVar, bc_DependentVar, bc_FuncVal, bc_Number,
bc_DestFuncToMax);} *)
procedure TGridFormattingProcs. EdLineTaskOnMouseUp (Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
{Процедура реагує на відпускання правої кнопки миші на
комірках рядка-заголовка та стовпця-заголовка таблиці.
Формує та відкриває контекстне меню для вибору типу комірки із можливих
типів для цієї комірки.}
Const sc_CurProcName='EdLineTaskOnMouseUp';
Var CurCol, CurRow, ArrayRow, ArrayCol: Integer; CurElmType:THeadLineElmType;
MouseScrCoords:TPoint;
Begin
{Якщо до вмикання форматування був якийсь обробник події, запускаємо його:}
If @Self. OldOnMouseUp<>Nil then Self. OldOnMouseUp (Sender, Button, Shift, X, Y);
If Sender=Nil then Exit;
{Якщо задано екранну таблицю даного об'єкта TGridFormattingProcs:}
If Sender = Self. CurGrid then
Begin
If Button=mbRight then {якщо була відпущена права кнопка миші}
Begin
{Пробуємо узнати, на яку комірку натиснула миша:}
CurCol:=-1; CurRow:=-1;
Self. CurGrid. MouseToCell (X, Y, CurCol, CurRow);
MouseScrCoords:=Self. CurGrid. ClientToScreen (Point(X, Y));
{Координати комірки у масивах таблиці і її заголовків:}
ArrayRow:=CurRow-Self.CHeadRowNum-bc_LTaskRowsBeforeVars;
ArrayCol:=CurCol-Self.CHeadColNum-bc_LTaskColsBeforeVars;
{Якщо натиснуто на комірку рядка-заголовка:}
If (CurRow=Self.CHeadRowNum) and (ArrayCol>=0) and
(ArrayCol<Length (Self. CurHeadRow)) then
Begin {очищаємо меню перед заповненням:}
Self. InitGridPopupMenu (Self. CurGrid);
{Якщо в екранній таблиці були зміни з часу останнього її читання,
то читаємо комірку, для якої треба сформувати меню:}
If Self. CurGridModified then Self. ReadHeadRowCell(ArrayCol);
{Читаємо поточний тип комірки:}
CurElmType:=Self. CurHeadRow[ArrayCol].ElmType;
{Додаємо пункти меню:}
{Якщо в комірці число-то тип комірки може бути тільки числовий:}
If CurElmType=bc_Number then
Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu,
sc_ValInHeadColOrRow, True, CurElmType)
Else {якщо в комірці не число:}
Begin
{незалежна змінна:}
Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu,
sc_IndependentVar,
CurElmType = bc_IndependentVar, bc_IndependentVar);
{залежна змінна:}
Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu,
sc_DependentVar,
CurElmType = bc_DependentVar, bc_DependentVar);
End;
End
Else If (CurCol=Self.CHeadColNum) and (ArrayRow>=0) and
(ArrayRow<Length (Self. CurHeadCol)) then
Begin {якщо натиснуто на комірку стовпця-заголовка:}
Self. InitGridPopupMenu (Self. CurGrid);
{Якщо в екранній таблиці були зміни з часу останнього її читання,
то читаємо комірку, для якої треба сформувати меню:}
If Self. CurGridModified then Self. ReadHeadColCell(ArrayRow);
{Читаємо поточний тип комірки:}
CurElmType:=Self. CurHeadCol[ArrayRow].ElmType;
{Додаємо пункти меню:}
{Якщо в комірці число-то тип комірки може бути тільки числовий:}
If CurElmType=bc_Number then
Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu,
sc_ValInHeadColOrRow, True, CurElmType)
Else {якщо в комірці не число:}
Begin
{назва фінкції – рядка нерівності:}
Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu,
sc_InequalFuncName, CurElmType = bc_FuncVal, bc_FuncVal);
{назва функції мети, що максимізується:}
Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu,
sc_DestFuncToMaxName, CurElmType = bc_DestFuncToMax,
bc_DestFuncToMax);
{назва функції мети, що мінімізується:}
Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu,
sc_DestFuncToMinName, CurElmType = bc_DestFuncToMin,
bc_DestFuncToMin);
End;
End
Else {якщо для даної комірки вибір типу не передбачено}
Begin {ставимо в меню координати комірки
(щоб користувач взагалі помітив, що меню є…)}
Self. InitGridPopupMenu (Self. CurGrid);
Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu,
sc_Row+sc_DoubleSpot+sc_Space+IntToStr (ArrayRow+1)+sc_KrKm+
sc_Space+sc_Col+sc_DoubleSpot+sc_Space+IntToStr (ArrayCol+1),
True, bc_OtherType);
End;
{Записуємо координати комірки для обробника вибору типу з меню:}
Self. CurGridSolveCol:=ArrayCol;
Self. CurGridSolveRow:=ArrayRow;
{Відображаємо меню:}
Self. CurGrid. PopupMenu. Popup (MouseScrCoords.X, MouseScrCoords.Y);
End; {If Button=mbRight then…}
End {If Sender = Self. CurGrid then…}
Else {якщо обробник викликала «чужа» таблиця або невідомий об'єкт:}
Begin
If Self. CurOutConsole<>Nil then
Self. CurOutConsole. Lines. Add (sc_CurProcName+sc_UnknownObjectCall+
sc_DoubleQuot+Sender. ClassName+sc_DoubleQuot);
End;
End;
procedure TGridFormattingProcs. ReactOnSetEditText (Sender: TObject; ACol,
ARow: Longint; const Value: string);
{Процедура для реагування на редагування вмісту комірок
під час редагування вхідних даних. Встановлює прапорець
CurGridModified:=True про те, що екранна таблиця має зміни.}
Begin
{Старий обробник теж викликаємо, якщо він є:}
If @Self. OldOnSetEditText<>Nil then
Self. OldOnSetEditText (Sender, ACol, ARow, Value);
Self. CurGridModified:=True;
End;
Procedure TGridFormattingProcs. SetNewState (Value:TTableFormatState);
Const sc_CurProcName='SetNewState';
Var StateSafe:TTableFormatState;
OldHColPos, OldHRowPos: Integer;
{Процедура для зміни режиму форматування GrowingStringGrid}
Procedure GoSolveLTask;
Begin {Вирішування задачі ЛП симплекс-методом:}
CurGrid. ColCount:=bc_FixedCols+1;
CurGrid. RowCount:=bc_FixedRows+1;
CurGrid. FixedRows:=bc_FixedRows;
CurGrid. FixedCols:=bc_FixedCols;
If Not (Self. PrepareToSolveLTask) then
Begin {Якщо не вдається підготувати таблицю до вирішування задачі:}
StateSafe:=Self. CurFormatState;
{Перемикаємо на режим fs_NoFormatting, і назад у поточний,
щоб встановити усі настройки цього режиму (повернутися до них):}
Self. TableFormatState:=fs_NoFormatting;
Self. TableFormatState:=StateSafe;
Exit;
End;
CurGrid. OnNewCol:=NumerationOnNewCol;
CurGrid. OnNewRow:=NumerationOnNewRow;
CurGrid. OnDrawCell:=EdLineTaskOnDrawCell;
CurGrid. OnDblClick:=OldOnDblClick;
CurGrid. OnMouseUp:=OldOnMouseUp;
CurGrid. OnSetEditText:=OldOnSetEditText;
{Вимикаємо редагування екранної таблиці:}
CurGrid. Options:=CurGrid. Options – [goEditing];
End;
Begin
If InSolving then
Begin
If Self. CurOutConsole<>Nil then
Self. CurOutConsole. Lines. Add (sc_CurProcName+sc_CantChangeStateInSolving);
Exit;
End;
If Self. CurGrid=Nil then {Якщо екранну таблицю не задано:}
Begin {запам'ятовуємо поточний режим, і більше нічого не робимо тут:}
Self. CurFormatState:=Value; Exit;
End;
{Якщо задано новий режим:}
If Self. CurFormatState<>Value then
Begin {Якщо форматування було вимкнене:}
If Self. CurFormatState=fs_NoFormatting then
Begin {Запам'ятовуємо обробники подій, які замінимо на свої
форматувальники:}
OldOnNewCol:=CurGrid. OnNewCol;
OldOnNewRow:=CurGrid. OnNewRow;
OldOnDrawCell:=CurGrid. OnDrawCell;
OldOnDblClick:=CurGrid. OnDblClick;
OldOnSetEditText:=CurGrid. OnSetEditText;
OldOnMouseUp:=CurGrid. OnMouseUp;
End;
{Якщо таблиця редагована, то приймаємо останні зміни перед
зміною режиму:}
If Self. CurGridModified then Self. Refresh;
Case Value of
fs_EnteringEqs: {редагування таблиці системи лінійних рівнянь:}
Begin
{Встановлюємо потрібну кількість рядків і стовпців екранної
таблиці для фіксованих заголовків («тільки для читання»).
Для цього забезпечуємо щоб кількість рядків і стовпців не була
меншою за потрібну кількість фіксованих, плюс хоч один
стовпець / рядок (хоч одна комірка) для редагування:}
If CurGrid. ColCount<bc_FixedCols+1 then
CurGrid. ColCount:=bc_FixedCols+1;
If CurGrid. RowCount<bc_FixedRows+1 then
CurGrid. RowCount:=bc_FixedRows+1;
CurGrid. FixedRows:=bc_FixedRows;
CurGrid. FixedCols:=bc_FixedCols;
{Позиціювання таблиці до зміни режиму:}
OldHColPos:=Self.CHeadColNum; OldHRowPos:=Self.CHeadRowNum;
{Позиціювання відображення таблиці у даному режимі редагування:}
Self.CHeadColNum:=CurGrid. FixedCols-1;
Self.CHeadRowNum:=CurGrid. FixedRows-1;
{Якщо позиціювання змінилося, то відображаємо таблицю
в новому місці:}
If (OldHColPos<>Self.CHeadColNum) or
(OldHRowPos<>Self.CHeadRowNum) then Self. Refresh;
CurGrid. OnNewCol:=EditLineEqsOnNewCol;
CurGrid. OnNewRow:=EditLineEqsOnNewRow;
CurGrid. OnDrawCell:=EditLineEqsOnDrawCell;
CurGrid. OnDblClick:=OldOnDblClick;
CurGrid. OnMouseUp:=OldOnMouseUp;
{Вмикаємо можливість редагування:}
CurGrid. Options:=CurGrid. Options+[goEditing];
CurGrid. OnSetEditText:=ReactOnSetEditText;
InSolving:=False;
End;
fs_EnteringLTask:
Begin {Редагування таблиці задачі ЛП (максимізації/мінімізації):}
{Встановлюємо потрібну кількість рядків і стовпців екранної
таблиці для фіксованих заголовків («тільки для читання»).
Для цього забезпечуємо щоб кількість рядків і стовпців не була
меншою за потрібну кількість фіксованих, плюс хоч один
стовпець / рядок (хоч одна комірка) для редагування:}
If CurGrid. ColCount<bc_FixedCols+1 then
CurGrid. ColCount:=bc_FixedCols+1;
If CurGrid. RowCount<bc_FixedRows+1 then
CurGrid. RowCount:=bc_FixedRows+1;
CurGrid. FixedRows:=bc_FixedRows;
CurGrid. FixedCols:=bc_FixedCols;
{Позиціювання таблиці до зміни режиму:}
OldHColPos:=Self.CHeadColNum; OldHRowPos:=Self.CHeadRowNum;
{Позиціювання відображення таблиці у даному режимі редагування:}
Self.CHeadColNum:=CurGrid. FixedCols-1 + bc_LTaskColsBeforeVars;
Self.CHeadRowNum:=CurGrid. FixedRows-1;
{Якщо позиціювання змінилося, то відображаємо таблицю
в новому місці:}
If (OldHColPos<>Self.CHeadColNum) or
(OldHRowPos<>Self.CHeadRowNum) then Self. Refresh;
CurGrid. OnNewCol:=EdLineTaskOnNewCol;
CurGrid. OnNewRow:=EdLineTaskOnNewRow;
CurGrid. OnDrawCell:=EdLineTaskOnDrawCell;
CurGrid. OnDblClick:=EdLineTaskOnDblClick;
CurGrid. OnMouseUp:=EdLineTaskOnMouseUp;
{Вмикаємо можливість редагування:}
CurGrid. Options:=CurGrid. Options+[goEditing];
CurGrid. OnSetEditText:=ReactOnSetEditText;
InSolving:=False;
End;
fs_SolvingEqsM1: {вирішування системи лінійних рівнянь способом 1:}
Begin
CurGrid. ColCount:=bc_FixedCols+1;
CurGrid. RowCount:=bc_FixedRows+1;
CurGrid. FixedRows:=bc_FixedRows;
CurGrid. FixedCols:=bc_FixedCols;
{Пробуємо підготувати таблицю до вирішування. Якщо не
вдається, то залишаємось у режимі, який був до спроби його
змінити:}
If Not (Self. PrepareToSolveEqsWithM1) then
Begin
StateSafe:=Self. CurFormatState;
{Перемикаємо на режим fs_NoFormatting, і назад у поточний,
щоб встановити усі настройки цього режиму:}
Self. TableFormatState:=fs_NoFormatting;
Self. TableFormatState:=StateSafe;
Exit;
End;
CurGrid. OnNewCol:=NumerationOnNewCol;
CurGrid. OnNewRow:=NumerationOnNewRow;
CurGrid. OnDrawCell:=SolveLineEqsM1OrM2OnDrawCell;
CurGrid. OnDblClick:=OldOnDblClick;
CurGrid. OnMouseUp:=OldOnMouseUp;
{Вимикаємо редагування екранної таблиці:}
CurGrid. Options:=CurGrid. Options – [goEditing];
CurGrid. OnSetEditText:=OldOnSetEditText;
End;
fs_SolvingEqsM2: {вирішування системи лінійних рівнянь способом 2:}
Begin
CurGrid. ColCount:=bc_FixedCols+1;
CurGrid. RowCount:=bc_FixedRows+1;
CurGrid. FixedRows:=bc_FixedRows;
CurGrid. FixedCols:=bc_FixedCols;
{Пробуємо підготувати таблицю до вирішування. Якщо не
вдається, то залишаємось у режимі, який був до спроби його
змінити:}
If Not (Self. PrepareToSolveEqsWithM2) then
Begin
StateSafe:=Self. CurFormatState;
{Перемикаємо на режим fs_NoFormatting, і назад у поточний,
щоб встановити усі настройки цього режиму:}
Self. TableFormatState:=fs_NoFormatting;
Self. TableFormatState:=StateSafe;
Exit;
End;
CurGrid. OnNewCol:=NumerationOnNewCol;
CurGrid. OnNewRow:=NumerationOnNewRow;
CurGrid. OnDrawCell:=SolveLineEqsM1OrM2OnDrawCell;
CurGrid. OnDblClick:=OldOnDblClick;
CurGrid. OnMouseUp:=OldOnMouseUp;
CurGrid. OnSetEditText:=OldOnSetEditText;
{Вимикаємо редагування екранної таблиці:}
CurGrid. Options:=CurGrid. Options – [goEditing];
End;
fs_SolvingLTask: GoSolveLTask;
fs_FreeEdit: {Режим вільного редагування таблиці:}
Begin
CurGrid. OnNewCol:=OldOnNewCol;
CurGrid. OnNewRow:=OldOnNewRow;
CurGrid. OnDrawCell:=OldOnDrawCell;
CurGrid. OnDblClick:=OldOnDblClick;
CurGrid. OnMouseUp:=OldOnMouseUp;
{Вмикаємо редагування екранної таблиці:}
CurGrid. Options:=CurGrid. Options+[goEditing];
{Вмикаємо стеження за змінами в екнанній таблиці:}
CurGrid. OnSetEditText:=ReactOnSetEditText;
InSolving:=False;
End;
Else {Без форматування (fs_NoFormatting), або невідомий режим:}
Begin
CurGrid. OnNewCol:=OldOnNewCol;
CurGrid. OnNewRow:=OldOnNewRow;
CurGrid. OnDrawCell:=OldOnDrawCell;
CurGrid. OnDblClick:=OldOnDblClick;
CurGrid. OnMouseUp:=OldOnMouseUp;
CurGrid. OnSetEditText:=OldOnSetEditText;
InSolving:=False;
End;
End;
CurGrid. Invalidate; {перемальовуємо таблицю з новими форматувальниками}
Self. CurFormatState:=Value; {запам'ятовуємо новий режим форматування}
End;
End;
Procedure TGridFormattingProcs. SetNewGrid (Value:TGrowingStringGrid);
Var SafeFormatState:TTableFormatState;
Begin
If Self. CurGrid<>Value then {якщо задано новий об'єкт таблиці:}
Begin
SafeFormatState:=Self. TableFormatState;
{Знімаємо усі процедури-форматувальники, перемальовуємо таблицю
(якщо вона була) перед заміною її на задану:}
Self. TableFormatState:=fs_NoFormatting;
Self. CurGrid:=Value; {запам'ятовуємо вказівник на новий об'єкт таблиці}
{Застосовуємо форматування для нової таблиці (якщо вона не відсутня,
вказівник на неї не рівний Nil):}
Self. TableFormatState:=SafeFormatState;
Self. Refresh;
End;
End;
Procedure TGridFormattingProcs. SetHeadColNum (Value: Integer);
Begin
If Self. CurFormatState=fs_FreeEdit then
Begin
If Value<0 then Value:=0;
Self.CHeadColNum:=Value;
End;
End;
Procedure TGridFormattingProcs. SetHeadRowNum (Value: Integer);
Begin
If Self. CurFormatState=fs_FreeEdit then
Begin
If Value<0 then Value:=0;
Self.CHeadRowNum:=Value;
End;
End;
Procedure TGridFormattingProcs. SetNewMemo (Value:TMemo);
Begin
If Self. CurOutConsole<>Nil then
Self. CurOutConsole. Lines. Add (Self. ClassName+': повідомлення вимкнені.');
Self. CurOutConsole:=Value;
If Self. CurOutConsole<>Nil then
Self. CurOutConsole. Lines. Add (Self. ClassName+': повідомлення ввімкнені.');
End;
end.
лінійний програмування компромісний розв'язок
Хоч кожній залежній змінній одної задачі відповідає функція-умова (нерівність) двоїстої, і кожній функції-умові відповідає залежна змінна, ці пари величин приймають різні значення у розв’язку пари задач.
Компромісний розв’язок багатокритеріальної задачі ЛП зручно застосовувати для об’єктів управління з такими вихідними параметрами (функціями мети), які є практично рівноправними (мають однаковий пріоритет до оптимізації, або їх пріоритети складно оцінити). За допомогою нього можна отримати розв’язок з мінімальним сумарним програшем оптимізації параметрів.
1. Левин С.В., Александрова В.В.: «БАГАТОКРИТЕРІАЛЬНА ОПТИМІЗАЦІЯ З ВИКОРИСТАННЯМ ТЕОРЕТИКО-ІГРОВОГО ПІДХОДУ»: методичні вказівки до виконання курсової роботи з курсу «Математичні методи дослідження операцій» – Харків, Національний аерокосмічний університет ім. М.Є. Жуковського «Харківський авіаційний інститут», 2008 р.
2. Довідка з Borland Delphi 6.