Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
8 / 8 / 2
Регистрация: 01.12.2015
Сообщений: 195
1

Вертикальная ориентация текста

30.09.2017, 14:02. Показов 3048. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день Уважаемые форумчане! Прошу Вашей помощи для доработки кода, представленного ниже:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure TForm4.strngrd1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
LFont: TLogFont;
hOldFont, hNewFont: HFont;
begin
if (ACol>0) and (ARow=0) then
  begin
    strngrd1.Canvas.FillRect(Rect);
    GetObject(strngrd1.Canvas.Font.Handle,SizeOf(LFont),Addr(LFont));
    LFont.lfEscapement := 900;
    LFont.lfheight := 15;
    LFont.lfwidth := 6;
    LFont.lfweight := 900;
    LFont.lfcharset := 1;
    LFont.lfoutprecision := out_tt_precis;
    LFont.lfquality := draft_quality;
    LFont.lfpitchandfamily := FF_Modern;
    hNewFont := CreateFontIndirect(LFont);
    hOldFont := SelectObject(strngrd1.Canvas.Handle,hNewFont);
//    SetTextColor(strngrd1.Canvas.Handle,clBlack);
    strngrd1.Canvas.TextOut(Rect.Left+2,Rect.Top+295,strngrd1.Cells[ACol,ARow]);
    hNewFont := SelectObject(strngrd1.Canvas.Handle,hOldFont);
    DeleteObject(hNewFont);
  end;
end;
Как видно из скриншота, результат вертикально ориентированного текста на лицо, но не могу избавиться от горизонтально прописанного. Как его уничтожить? Заранее благодарен за помощь!
Миниатюры
Вертикальная ориентация текста  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2017, 14:02
Ответы с готовыми решениями:

Ориентация ScrollBar
Я установил вертикальную ориентацию ScrollBar, но ползунок в верхнем положении выдаёт наименьшее...

Вертикальная полоса в StringGrid
Добрый вечер. Скажите пожалуста как сделать, чтобы в StringGrid вертикальная полоса прокрутки...

TPageControl вертикальная прокрутка TabSheets выровненых по левому краю
Собственно сабж: Имеется в наличии sPageControl на котором размещена куча станиц, закладки страниц...

Вертикальная ориентация текста
Доброго всем времени суток. Может кто-то знает, какими шаманскими способами можно повернуть...

8
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
30.09.2017, 14:57 2
Цитата Сообщение от ВасильевСА Посмотреть сообщение
strngrd1.Canvas.FillRect(Rect);
это правильно. но сработает только если стиль кисти равен bsSolid. лучше на всякий случай уставить кисть в этот ржим

а еще лучше отключить у таблицы DefaultDrawing и все рисовать самому - фиксированные ячейки, обычные, выделенные. при DefaultDrawing и собственной отрисовке ипроисходит двойное рисование - сначала система рисует ячейку, затем обработчик drawcell
0
8 / 8 / 2
Регистрация: 01.12.2015
Сообщений: 195
30.09.2017, 15:22  [ТС] 3
при DefaultDrawing и собственной отрисовке и происходит двойное рисование - сначала система рисует ячейку, затем обработчик drawcell.

??? Можно ли тогда перед тем, как обработчик drawcell возьмется за свою работу, удалить рисунок ячейки, начертанный системой?

при отключении DefaultDrawing, получается избавиться от горизонтальной надписи, при этом пропадают еще и названия строк, весь грид теряет окраску какая у всей формы, я понял что нужно все вручную отрисовывать (выше об этом сказано), но скажу честно я в этом (рисовании) очень слаб(((
Миниатюры
Вертикальная ориентация текста  
0
8 / 8 / 2
Регистрация: 01.12.2015
Сообщений: 195
30.09.2017, 19:48  [ТС] 4
еще: названия заголовков я создаю в обработчике TForm1.FormShow, может в этом моя ошибка? и нужно объявлять названия заголовков после того как произойдет событие drawcell?

Добавлено через 4 часа 13 минут
Наверное никто не сталкивался... но все равно спасибо!
0
пофигист широкого профиля
4735 / 3168 / 860
Регистрация: 15.07.2013
Сообщений: 18,255
01.10.2017, 01:15 5
Цитата Сообщение от ВасильевСА Посмотреть сообщение
при DefaultDrawing и собственной отрисовке и происходит двойное рисование
Цитата Сообщение от ВасильевСА Посмотреть сообщение
при отключении DefaultDrawing, получается избавиться от горизонтальной надписи, при этом пропадают еще и названия строк, весь грид теряет окраску какая у всей формы, я понял что нужно все вручную отрисовывать
А другого выхода и нет. TStringGrid очень сырой компонент. Так что либо DefaultDrawing = True и рисуешь всё сам, либо DefaultDrawing = False и VCL сначала рисует своё, потом ты "замазываешь мазилкой" то что она нарисовала, а затем уже рисуешь своё.
P.S. Кстати я сталкивался, но у меня была проблема только с рисованием фиксированных строк и столбцов.
1
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,160
Записей в блоге: 20
01.10.2017, 01:16 6
Dennik все написал правильно
Нужно просто заполнить Brush
Ну и решить что делать с DefaultDrawing
1
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
01.10.2017, 09:57 7
Цитата Сообщение от northener Посмотреть сообщение
либо DefaultDrawing = True и рисуешь всё сам, либо DefaultDrawing = False и VCL сначала рисует своё
true/false местами поменять

Добавлено через 8 минут
чтобы красиво и легко рисовать все ячейки при отключенном DefaultDrawing, нужно создать наследника грида с переопределенным методом рисования, т.к. иначе не получить доступа к необходимым методам. если никто не приведет пример, завтра напишу заготовку.
to be continued...
1
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
02.10.2017, 09:54 8
Лучший ответ Сообщение было отмечено ВасильевСА как решение

Решение

итак, создадим локального наследника TStringGrid с необходимым функционалом. Описываем класс в разделе type ПЕРЕД описанием формы (это важно).
Delphi
1
2
3
4
5
6
7
8
9
10
type
  TStringGrid = class (Vcl.Grids.TStringGrid)
  protected
    procedure DrawCell(ACol: Integer; ARow: Integer; ARect: TRect; AState: TGridDrawState); override;
  public
    constructor Create(AOwner: TComponent); override;
  end;
 
  TForm1 = class(TForm)
  ...
implementation конструктора. отключаем DefaultDrawing. на самом деле, это можно сделать и потом (программно или из инспектора)
Delphi
1
2
3
4
5
constructor TStringGrid.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  DefaultDrawing:= false;
end;
описываем обработчик рисования ячейки. потом, когда положишь на форму компонент TStringGrid, в его обработчике ничего рисовать не нужно. будет автоматически задействован этот обработчик.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
procedure TStringGrid.DrawCell(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState);
var
  LFont: TLogFont;
  hOldFont, hNewFont: HFONT;
begin
  Canvas.Font:= Font;                                      // читаем шрифт из настроек Грида
  // фиксированная ячейка
  if (gdFixed in AState) then
  begin
    DrawCellBackground(ARect,FixedColor,AState,ACol,ARow);   // рисуем фон
    if (ARow = 0) then                   // верхний ряд фиксированных ячеек, рисуем вертикально
    begin
      GetObject(Canvas.Font.Handle,SizeOf(LFont),Addr(LFont));
      LFont.lfEscapement:= 900;
      LFont.lfHeight:= 15;
      LFont.lfWidth:= 6;
      LFont.lfWeight:= 900;
      LFont.lfCharSet:= 1;
      LFont.lfOutPrecision:= OUT_TT_PRECIS;
      LFont.lfQuality:= DRAFT_QUALITY;
      LFont.lfPitchAndFamily:= FF_MODERN;
      hNewFont:= CreateFontIndirect(LFont);
      hOldFont:= SelectObject(Canvas.Handle,hNewFont);
      Canvas.TextOut(ARect.Left+2,ARect.Top+ARect.Height-3,Cells[ACol,ARow]);
      hNewFont:= SelectObject(Canvas.Handle,hOldFont);
      DeleteObject(hNewFont);
    end else
      Canvas.TextOut(ARect.Left+2,ARect.Top+2,Cells[ACol,ARow]);
  end else
  begin
    if (gdSelected in AState) then DrawCellHighlight(ARect,AState,ACol,ARow) // выделенная ячейка
    else DrawCellBackground(ARect,Color,AState,ACol,ARow);                   // обычная ячейка
    Canvas.TextOut(ARect.Left+2,ARect.Top+2,Cells[ACol,ARow]);
  end;
end;
теперь если, положить на форму TStringGrid, настроить его как душе угодно
Вертикальная ориентация текста

заполнить данными
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.FormCreate(Sender: TObject);
begin
  with StringGrid1 do
  begin
    RowHeights[0]:= 150;
    ColWidths[0]:= 150;
    Cells[1,0]:= 'Hello';
    Cells[2,0]:= 'World';
    Cells[0,1]:= 'Hello';
    Cells[0,2]:= 'World';
    Cells[1,1]:= 'H';
    Cells[2,2]:= 'W';
  end;
end;
на выходе получим результат
Вертикальная ориентация текста
1
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
02.10.2017, 10:15 9
поэкспериментировал. некоторые шрифты в вертикальном начертании выглядят ничего, а некоторые хуже, а некоторые вообще не ориентируют буквы на 90 градусов (Script)
Вертикальная ориентация текста
Вертикальная ориентация текста
Вертикальная ориентация текста
Вертикальная ориентация текста

Вертикальная ориентация текста
Вертикальная ориентация текста
Вертикальная ориентация текста
Вертикальная ориентация текста
1
02.10.2017, 10:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2017, 10:15
Помогаю со студенческими работами здесь

Вертикальная/горизонтальная ориентация мобильных устройств
Добрый день. Возможно ли отследить какая ориентация устройства? А так же запретить вертикальную...

WPF горизонтальная/вертикальная ориентация компонент окна с разделителем
Здравствуйте, форумчане. Не могу решить одну проблему. Есть две области в моем окне. Нужно чтобы...

Ориентация текста в ячейке
Довольно-таки ламерский вопрос с 1го взгляда, но бьюсь над ним довольно долго (и не только я). В...

Ориентация текста StringGrid
В свойствах шрифта есть пункт Font->Orientation. Методом тыка выяснил что, например, при значении...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru