И наконец, запрограммируем «маляра».
Выделим таблицу sgBidAsk и перейдем в инспекторе объектов на вкладку Events. Создадим реакцию на событие OnDrawCell. Проблема вся в том, что в StringGrid нет методов закрашивания отдельных ячеек и изменения цвета шрифта в этих ячейках, а посему будем все делать (раскрашивать) ручками, через объект Canvas (холст).
И начинаем писать…
void __fastcall TForm1::sgBidAskDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { // Если в ячеке пусто - выходим if (sgBidAsk->Cells[ACol][ARow].IsEmpty()) return; // Если ячейка фиксированная - выходим if (State.Contains(gdFixed)) return; // Если текст if (rgColor->ItemIndex == 1) { // Ask или Bid if (ACol == 1 || ACol == 2) { // Если новое значение ячеки больше или равно предыдущего // Тогда цвет шрифта синий // в противном случае красный if (TextToDouble(sgBidAsk->Cells[ACol][ARow]) >= PrevQuote[ACol - 1][ARow - 1]) sgBidAsk->Canvas->Font->Color = clBlue; else sgBidAsk->Canvas->Font->Color = clRed; // Забираем текст из ячейки AnsiString s = sgBidAsk->Cells[ACol][ARow]; // и переривовываем его новым цветом sgBidAsk->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2, s); } } // Если ячейка if (rgColor->ItemIndex == 2) { // Ask или Bid if (ACol == 1 || ACol == 2) { // Если новое значение ячеки больше или равно предыдущего // Тогда цвет киски светлозеленый // в противном случае красный if (TextToDouble(sgBidAsk->Cells[ACol][ARow]) >= PrevQuote[ACol - 1][ARow - 1]) sgBidAsk->Canvas->Brush->Color = clLime; else sgBidAsk->Canvas->Brush->Color = clRed; // Копируем текст AnsiString s = sgBidAsk->Cells[ACol][ARow]; // Заливаем регион sgBidAsk->Canvas->FillRect(Rect); // Пишем текст sgBidAsk->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2, s); } } // Во всех остальных случаях по умолчанию }Вообще-то говоря, можно было сравнивать значения только одного типа (bid или ask) - в большинстве случаев спред у ДЦ фиксированный, но мы оставим так как есть, на случай работы с брокером, у которого плавающий спред. Чем больше возможностей у программы, тем шире спектр применения.
И еще пару украшательств…
Изменим шрифт в нашей таблице – сделаем его жирным и увеличим размер:
И наконец. Добавим событие onclick для нашего группового переключателя rgColor.
void __fastcall TForm1::rgColorClick(TObject *Sender) { sgBidAsk->Invalidate(); }Вызов этого метода перерисует нашу таблицу, когда мы будем переключаться между режимами. Без него, придется ждать перерисовки таблицы до появления новой котировки.
F9, смотрим…
Самостоятельно:
- как обычно, делаем для других валютных пар.