C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Текст в StringGrid1, сделать bold
Лена
Отправлено: 01.12.2005, 14:04


Мастер участка

Группа: Участник
Сообщений: 501



Подскажите, как сделать текст жирным в первой строке. Код ниже не дает этого эффекта:
CODE

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
     int ARow, TRect &Rect, TGridDrawState State)
{

  StringGrid1->Canvas->Brush->Color = clWhite;
  StringGrid1->Canvas->FillRect(Rect);

 if( ARow == 1 )
  {
  StringGrid1->Canvas->Font->Color = clRed;
  StringGrid1->Canvas->Font->Style <<  fsBold;//ничего не дает
  StringGrid1->Canvas->TextOut(Rect.Left+5, Rect.Top+5,StringGrid1->Cells[ACol][ARow]);
  }
else
  {
  StringGrid1->Canvas->Font->Color = clBlack;
  StringGrid1->Canvas->TextOut(Rect.Left+5, Rect.Top+5, StringGrid1->Cells[ACol][ARow]);
  }

}

Asher
Отправлено: 01.12.2005, 14:22


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
а так
CODE
StringGrid1->Canvas->Font->Style = StringGrid1->Canvas->Font->Style <<  fsBold;
Лена
Отправлено: 01.12.2005, 14:32


Мастер участка

Группа: Участник
Сообщений: 501



М-да, ларчик просто открывается. smile.gif
Большое спасибо!
Лена
Отправлено: 01.12.2005, 14:53


Мастер участка

Группа: Участник
Сообщений: 501



Попутно еще вопрос. Почему-то мой код не воздействует на самую первую строку? Ошибки вроде нет. Пытаюсь установить ширину столбцов в зависимости от ширины текста.
CODE

int maxWidth = 0;
int maxWidth2 = 0;
for (int i=0; i<=Form1->StringGrid1->RowCount; i++)
{
if( Form1->StringGrid1->Canvas->TextWidth( Form1->StringGrid1->Cells[0][i] ) > maxWidth )
maxWidth = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[0][i]);
if( Form1->StringGrid1->Canvas->TextWidth( Form1->StringGrid1->Cells[1][i] ) > maxWidth2 )
maxWidth2 = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[1][i]);

}
Form1->StringGrid1->ColWidths[0]= maxWidth+10;
Form1->StringGrid1->ColWidths[1]= maxWidth2+10;

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

Отредактировано Лена — 01/12/2005, 14:57
Лена
Отправлено: 01.12.2005, 15:40


Мастер участка

Группа: Участник
Сообщений: 501



Обратила внимание, когда остается одна строка в StringGrid (там где красный цвет), текст не помещается в колонках, но если еще раз принудительно вызвать код написанный выше, выравнивание происходит.
Asher
Отправлено: 01.12.2005, 16:55


Мастер участка

Группа: Модератор
Сообщений: 550



Привет снова.
QUOTE
В первой строке находиться красный текст bold и если он длиннее текста ниже, то он обрезается. Получается, что регулируется ширина колонок начиная со второй строки.

А без bold'а он тоже длинее?
И хотелось-бы увидеть, схематично, порядок применения параметров текста и определения длин.
Лена
Отправлено: 01.12.2005, 18:01


Мастер участка

Группа: Участник
Сообщений: 501



Наверно трудно в переписке описать суть проблемы, но я попробую. smile.gif
Я формирую TreeView1. Щелкая по названию узлов я получаю StringGrid1 с нужным кол-вом строк. (см.рисунок).
Сформировав нужное кол-во строк я в обработчике TreeView1Changing заканчиваю кодом формирующим StringGrid1
CODE

void __fastcall TForm1::TreeView1Changing(TObject *Sender,
     TTreeNode *Node, bool &AllowChange)
{

Form1->StringGrid1->Visible=false;
Form1->StringGrid1->RowCount=1;
Form1->StringGrid1->Cells[0][0] = "Имя";
Form1->StringGrid1->Cells[1][0] = "Значение";


//тут много другого кода
//получив кол-во строк и значения в колонках, приступаю
//к формированию StringGrid


//прямо в обработчике формирую StringGrid
class TPublicGrid: public  TStringGrid
{
   public:
       using TStringGrid::DeleteRow;
};
for (int i = Form1->StringGrid1->RowCount; i--;)
{

   
       if(Form1->StringGrid1->Cells[1][i] == "0")//убираю если есть значения 0
       ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);
   
  }



int maxWidth = 0;
int maxWidth2 = 0;
for (int i=0; i<=Form1->StringGrid1->RowCount; i++)
{
  if( Form1->StringGrid1->Canvas->TextWidth( Form1->StringGrid1->Cells[0][i] ) > maxWidth )
    maxWidth = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[0][i]);
  if( Form1->StringGrid1->Canvas->TextWidth( Form1->StringGrid1->Cells[1][i] ) > maxWidth2 )
    maxWidth2 = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[1][i]);

}
Form1->StringGrid1->ColWidths[0]= maxWidth+10;
Form1->StringGrid1->ColWidths[1]= maxWidth2+10;

Form1->StringGrid1->Visible = true;


}

//теперь обработчик StringGrid1DrawCell рисующий текс и 5 пикселей отступа

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
     int ARow, TRect &Rect, TGridDrawState State)
{

StringGrid1->Canvas->Brush->Color = clWhite;
  StringGrid1->Canvas->FillRect(Rect);

 if( ARow == 0 )
  {
  StringGrid1->Canvas->Font->Color = clRed;
  StringGrid1->Canvas->Font->Size = 10;
  StringGrid1->Canvas->Font->Style = StringGrid1->Canvas->Font->Style << fsBold;
  StringGrid1->Canvas->TextOut(Rect.Left+5, Rect.Top+5,StringGrid1->Cells[ACol][ARow]);
  }
else
  {
  StringGrid1->Canvas->Font->Color = clBlack;
  StringGrid1->Canvas->TextOut(Rect.Left+5, Rect.Top+5, StringGrid1->Cells[ACol][ARow]);
  }




}



Присоединить изображение

Присоединить изображение

Лена
Отправлено: 01.12.2005, 18:06


Мастер участка

Группа: Участник
Сообщений: 501



С 5-ю пикселями не совсем правильно описала. Имеется ввиду, что первая колонка на втором рисунке должна быть меньше, по длинне самого широкого текста — Слово "Name" плюс 10 пикселей а не пять.
Asher
Отправлено: 01.12.2005, 18:23


Мастер участка

Группа: Модератор
Сообщений: 550



Привет снова.
Вообще по определению ширины алгоритм должен быть такой
1. устанавливаете параметры шрифта в требуемые
CODE
 StringGrid1->Canvas->Font->Size = 10;
 StringGrid1->Canvas->Font->Style = StringGrid1->Canvas->Font->Style << fsBold;

2. Определяете ширину
CODE

int maxWidth = Form1->StringGrid1->Canvas->TextWidth( Form1->StringGrid1->Cells[0][0];
int maxWidth2 = Form1->StringGrid1->Canvas->TextWidth( Form1->StringGrid1->Cells[1]0];

3. Возвращаете параметры шрифта к первоначальным
CODE
 StringGrid1->Canvas->Font->Style = StringGrid1->Canvas->Font->Style >> fsBold;

4. Ищите максимальную ширину в цикле начиная с 1-ой строки.
CODE
for (int i=1; i<=Form1->StringGrid1->RowCount — 1; ++i)

а лучше с последней (чтобы RowCount только один раз спрашивать.)
и так как считаем с 0 индекс последеней будет RowCount — 1
CODE
for (int i=Form1->StringGrid1->RowCount — 1; i > 0; --i)

Если не пройдет, то потом будем думать про размеры.
Лена
Отправлено: 01.12.2005, 19:15


Мастер участка

Группа: Участник
Сообщений: 501



Заработало! smile.gif Спасибо!
Но я не поняла, почему for (int i=0; i<=Form1->StringGrid1->RowCount-1; ++i) в коде ниже.
Я попробовала for (int i=0; i<=Form1->StringGrid1->RowCount; ++i) тоже работает. Поэтому не понимаю, почему минус единица и почему работает и в том и другом случае?

CODE

StringGrid1->Canvas->Font->Size = 10;
StringGrid1->Canvas->Font->Style = StringGrid1->Canvas->Font->Style << fsBold;
int maxWidth = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[0][0]);
int maxWidth2 = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[1][0]);
StringGrid1->Canvas->Font->Size = 8;
StringGrid1->Canvas->Font->Style = StringGrid1->Canvas->Font->Style >> fsBold;
for (int i=0; i<=Form1->StringGrid1->RowCount-1; ++i)
{
  if( Form1->StringGrid1->Canvas->TextWidth( Form1->StringGrid1->Cells[0][i] ) > maxWidth )
    maxWidth = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[0][i]);
  if( Form1->StringGrid1->Canvas->TextWidth( Form1->StringGrid1->Cells[1][i] ) > maxWidth2 )
    maxWidth2 = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[1][i]);

}
Form1->StringGrid1->ColWidths[0]= maxWidth+10;
Form1->StringGrid1->ColWidths[1]= maxWidth2+10;

Form1->StringGrid1->Visible = true;
Asher
Отправлено: 02.12.2005, 10:30


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
1. Делать цикл с 0 смысла нет, т.к. 0-ую строку обработали до цикла.
2. RowCount это количество строк. И так как строки нумеруются с 0, то индекс последеней будет RowCount — 1
и цикл должен выглядеть как
CODE
for (int i=1; i < Form1->StringGrid1->RowCount; ++i)

Почему у Вас работает с i <= Form1->StringGrid1->RowCount я не знаю, VCL давно не пользовался wink.gif

P.S. Хорошо бы сделать
CODE
 if( Form1->StringGrid1->Canvas->TextWidth( Form1->StringGrid1->Cells[0][i] ) > maxWidth )
   maxWidth = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[0][i]);

через промежуточную переменную, а то два раза приходится
CODE
Form1->StringGrid1->Canvas->TextWidth( Form1->StringGrid1->Cells[0][i] )
делать, а это очень НЕБЫСТРАЯ функция

Вернуться в Вопросы программирования в C++Builder