Лена |
Отправлено: 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
|
М-да, ларчик просто открывается.
Большое спасибо!
|
|
Лена |
Отправлено: 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
|
Наверно трудно в переписке описать суть проблемы, но я попробую.
Я формирую 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
|
Заработало! Спасибо!
Но я не поняла, почему 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 давно не пользовался
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] ) | делать, а это очень НЕБЫСТРАЯ функция
|
|