Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про событие OnDrawCell стандартного StringGrid a   Найти похожие ветки 

 
KIR   (2003-01-05 14:24) [0]

Народ, что-то я никак не могу допереть, как это сделать. Задача следующая: требуется чтобы, если текст не влезает в одну строку, он разбивался на несколько и соответственно увеличивалась высота строки. Это-то ясно:

procedure TForm.StringGrid1DrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
var
al: UINT;
S: String;
hi: Integer;
R: TRect;
begin
S := StringGrid1.Cells[ACol,ARow];
StringGrid1.Canvas.FillRect(Rect);
R := Rect;
R.Right := R.Right-2;
R.Left := R.Left+2;
al := DT_CENTER or DT_END_ELLIPSIS or DT_NOPREFIX or DT_WORDBREAK;
hi := DrawTextEx(StringAlignGrid1.Canvas.Handle, PChar(S), Length(S), R, al or DT_CALCRECT, nil);
If StringAlignGrid1.RowHeights[ARow] < hi then
StringAlignGrid1.RowHeights[ARow] := hi+2;
DrawTextEx(StringAlignGrid1.Canvas.Handle, PChar(S),-1,R,al,nil);
end;

Но при этом требуется выровнять этот текст по центру и по вертикали, и по горизонтали. Но DT_VCENTER совместно с DT_WORDBREAK не работает, как быть?
Мало того, если не требуется увеличения высоты строки (текст влезает в одну строку), то и DT_CENTER не хочет центрировать текст, а выводит его с левого края.


 
Calm   (2003-01-05 15:41) [1]

Наверное, подразумевается, что в подобных случаях разработчики пользуются объектом Canvas и его методами. Но тогда придется вычислять расположение текста вручную...

Хотя может можно и DrawTextEx, не знаю. Но Canvas.TextOut() точно прокатит.


 
KIR   (2003-01-05 16:32) [2]

Странно то, что мой случай не такой уж нетривиальный: ровнять текс значит можно как хочешь, вот только отцентрировать нельзя... Наверняка, ведь Excel центрирует с помощью DrawTextEx...


 
down   (2003-01-05 16:59) [3]

По поводу DT_VCENTER в хелпе написано:
DT_VCENTER Centers text vertically (single line only)

DT_CENTER + DT_WORDBREAK работпет нормально, проверь, влезает ли текст в прямоугольник по вертикали.



 
KIR   (2003-01-05 17:49) [4]

Из хелпа
DT_VCENTER Centers text vertically ( single line only).

Как может DT_SINGLELINE сочетаться с DT_WORDBREAK?


 
down   (2003-01-05 18:03) [5]

Никак, в этом-то и суть.


 
KIR   (2003-01-05 19:12) [6]

А все-таки, как отцентрировать по вертикали текст при помощи функции DrawTextEx, используя параметр DT_WORDBREAK? Неужили никак? Снова повторюсь, как же это делает Excel?


 
down   (2003-01-05 19:32) [7]


> А все-таки, как отцентрировать по вертикали текст при помощи
> функции DrawTextEx, используя параметр DT_WORDBREAK? Неужили
> никак?

Угу, никак.

> Снова повторюсь, как же это делает Excel?

Не знаю, но можно сделать так:
Вызываешь DrawText с DT_CALCRECT, полученный прямоугольник центрируешь в прямоугольнике ячейки и выводишь текст в него.


 
KIR   (2003-01-05 19:35) [8]

Ммм... как-то кривовато выходит...


 
down   (2003-01-05 19:54) [9]

Значит, неправильно выравниваешь.


 
Keymaster   (2003-01-05 20:09) [10]

Когда-то сам с этим столкнулся.
Решение нашёл в Сanvas.TextOut()


 
KIR   (2003-01-05 22:12) [11]

То есть все-таки надо рабртать конкретно со StringGrid.Canvas. А на какое событие это вешать? На OnDrawCell?



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.009 c
3-48951
Charlie
2002-12-22 22:29
2003.01.16
Проблема с полем типа Date&Time


3-48847
ВикторК
2002-12-09 15:24
2003.01.16
как вызвать запрос, сохраннный в файле Access ?


1-49090
ScableR
2003-01-03 02:56
2003.01.16
Помогите разобраться в вопросе с Delphi & MySQL


14-49253
jee
2002-12-26 15:35
2003.01.16
А кто выдает медали


1-49074
Тимохов
2003-01-08 15:03
2003.01.16
Инициализация локальных переменных.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский