TStringGrid, выравнивание текста в ячейках

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

TStringGrid, выравнивание текста в ячейках

Сообщение GAMER »

Проблема стара как мир. Есть решения через канву.
Типа:

Код: Выделить всё

Создай обработчик события OnDrawCell
Определи в нем переменную XAlign
XAlign := ( Rect.Right - Rect.Left ) - TStringGrid( Sender ).Canvas.TextWidth( ST )
где ST - твоя строка
Далее:
TStringGrid( Sender ).Canvas.TextOut( Rect.Left + XAlign, Rect.Top, ST ) ;

Есть ли уже решения по-проще?
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

Может быть это?

Код: Выделить всё

procedure TForm1.StringGridDrawCell(Sender: TObject; aCol,
  aRow: Integer; aRect: TRect; aState: TGridDrawState);
begin
TStringGrid(Sender).Canvas.TextStyle.Alignment:=taRightJustify;// еще есть taRightJustify, taCenter
end;
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Вот такая ошибка возникает:
UFrmViddorders.pas(378,39) Error: Argument can't be assigned to
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

Странно. У меня работает, правда, я пишу не TStringGrid(Sender), а просто StringGrid1.
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Climber писал(а):Странно. У меня работает, правда, я пишу не TStringGrid(Sender), а просто StringGrid1.


Та же ошибка. Действительно странно, посколько через автоподстановку Лазарус дает написать такую строку.
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

Вообще-то ошибка "Argument can't be assigned to" появляется, когда пытаешься присвоить значение свойству только для чтения (если я не путаю), так что автоподстановка тут ни при чем. А вот с каких пор это свойство стало "только для чтения" - большой вопрос...
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Лазарус - последние обновления по свн. Согласен, что автоподстановка ни при чем, имел в виду, что синтаксис правильно писал :)
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Оказалось, что уже все сделано :)
Есть решение: StringGrid1.Columns...
Там настройки и заголовка и выравнивания.
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Опыты показали, что

Код: Выделить всё

TStringGrid(Sender).Canvas.TextStyle.Alignment:=taRightJustify;


действительно не работает (хотя в Graphics написано: property TextStyle: TTextStyle read FTextStyle write FTextStyle;)

Но вот такой вот код работает на ура:

Код: Выделить всё

var
  xStyle: TTextStyle;
...
xStyle.Alignment:=taRightJustify;
Canvas.TextStyle:=xStyle;



Что касается StringGrid1.Columns, то с ним в некторых случаях много гемора (особенно в уже существующих проектах, где работа с Grig'ом ведётся через RowCount и ColCount).

Добавлено спустя 2 часа 37 минут 5 секунд:
Вообще-то ошибка "Argument can't be assigned to" появляется, когда пытаешься присвоить значение свойству только для чтения (если я не путаю), так что автоподстановка тут ни при чем. А вот с каких пор это свойство стало "только для чтения" - большой вопрос...


Разработчики утверждают, что это не баг, а фича:

Jesus Reyes (developer)
This is a compiler feature, for more information see: http://wiki.lazarus.freepascal.org/User_Changes_2.4.0
.

Правда, в чём там фишка я так и не понял...
Ответить