Курсовая работа: Багатокритеріальна задача лінійного програмування
Фарбуємо їх у блакитний колір (окрім комірок заголовків):}
If Not (gdFixed in State) then {якщо комірка не у заголовках StringGrid}
Begin
If ACol>=(CurGrid. ColCount-bc_LTaskColsAfterVars) then {останні стовпці:}
Begin
{Якщо це комірка значення цільової функції – для неї свій колір:}
Case Self. CurHeadCol[ArrRowNum].ElmType of
bc_DestFuncToMax: CurColor:=lwc_DestFuncValColor;
bc_DestFuncToMin: CurColor:=lwc_DestFuncValColor;
Else CurColor:=lwc_RightSideColColor;
End;
End
Else if ACol<(Self.CHeadColNum+bc_LTaskColsBeforeVars) then
Begin {Якщо перші стовпці (стовпець-заголовок):}
{Якщо для цієї комірки задано елемент у масиві стовпця-заголовка,
то фарбуємо її залежно від типу цього елемента:}
If Length (Self. CurHeadCol)>
(ARow – (Self.CHeadRowNum + bc_LTaskRowsBeforeVars)) then
Begin {Тип елемента у комірці:}
CurVarColState:=Self. CurHeadCol [ARow – (Self.CHeadRowNum+
bc_LTaskRowsBeforeVars)].ElmType;
CurColor:=GetColorByElmType(CurVarColState); {колір за типом}
End
Else {Якщо масив стовпця-заголовка не визначено для комірки –
фарбуємо за змовчуванням – як назву функції умови-нерівності:}
CurColor:=lwc_HeadColColor;
End {Якщо рядок коефіцієнтів при змінних цільової функції:}
Else if (Self. CurHeadCol[ArrRowNum].ElmType=bc_DestFuncToMax) or
(Self. CurHeadCol[ArrRowNum].ElmType=bc_DestFuncToMin) then
Begin
{Якщо рядок функції виділений, то виділяємо кольором:}
If InSolving and (Self. CurGridSolveRow=ARow) then
CurColor:=lwc_SolveRowColor
Else CurColor:=lwc_FuncRowColor; {інакше – колір рядка функції мети}
End {Якщо це розв'язувальна комірка, чи рядок або стовпець з такою
коміркою, і треба відображати хід вирішування задачі:}
Else if InSolving then
Begin
If Self. CurGridSolveCol=ACol then {якщо це розв'язувальний стовпець:}
Begin
If Self. CurGridSolveRow=ARow then {якщо це розв'язувальна комірка:}
CurColor:=lwc_SolveCellColor
Else CurColor:=lwc_SolveColColor;
End {Якщо це розв'язувальний рядок (але не розв'язувальна комірка):}
Else if Self. CurGridSolveRow=ARow then CurColor:=lwc_SolveRowColor;
End;
End;
{Зафарбовуємо комірки-заголовки стовпців коефіцієнтів при змінних
відповідно до масиву поміток про залежність:}
If (ARow=Self.CHeadRowNum) and
(Not (ACol<(Self.CHeadColNum+bc_LTaskColsBeforeVars))) then
Begin
CurVarColState:=Self. CurHeadRow [ACol – Self.CHeadColNum-
bc_LTaskColsBeforeVars].ElmType;
CurColor:=GetColorByElmType(CurVarColState)
End;
If CurColor<>bc_NotColored then {якщо комірку треба пофарбувати:}
Begin {Малюємо текст на фоні з кольором CurColor:}
CurGrid. Canvas. Brush. Color:=CurColor;
CurGrid. Canvas. TextRect (Rect, Rect. Left, Rect. Top,
CurGrid. Cells [ACol, ARow]);
End;
CurGrid. Canvas. Brush. Color:=SafeBrushColor;
End;
End;
procedure TGridFormattingProcs. EdLineTaskOnDblClick (Sender: TObject);
{Процедура реагує на подвійне натискання лівою кнопкою миші на
комірки рядка-заголовка таблиці (другий рядок StringGrid).
Редагує масив позначок про обрані стовпці (SipmlexVarsDependencyRec)
залежних змінних. Залежні змінні – це змінні, для яких є умова
невід'ємності. Тобто вони не повинні бути менше нуля.}
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
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24