Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

В гриде - посередине вместо числа [D6]


MsGuns ©   (2003-10-08 17:06:00) 

В гриде и в репорте с ентого грида надо чтоб если сумма в поле отсутствует рисовать "-" в центреячейки. Я понимаю, что это идеотизм - именно в центре, но ТАК НАДАдля тетеньки. Я обычно выствавляю за такие выкрутасы или астрономические счета (чтоб не выеживались, блин) или вежливо посылаю. Но этот заказчие особый, а тетенька - жена дира. Короче, бьюсь, но не получается. Интуитивно чувствую, что элементарно, но не получается ;(((
Знаю, что по OnGetText или по OnDrawColumnCell, но отцентровать не получается !
Прошу прощение за ламерство, но снизойдите, мастера !


ZrenBy   (2003-10-08 20:11:00) [1]

Давно уже все придумано

Windows.DrawText(Grid.Canvas.Handle,...,DT_CENTER or DT_SINGLELINE)


Arm79   (2003-10-08 19:00:00) [2]

Стараемся помаленьку ;-)


MsGuns   (2003-10-08 18:57:00) [3]

>Arm79 © (08.10.03 18:46) [15]

Ну ты, блин, даешь ! Прям черту и рисуешь !!! А я обойдусь символом "подчеркивание". Перебьется ;)))


Arm79   (2003-10-08 18:49:00) [4]

Вместо длины в 6 можно использовать > DBGrid1.Canvas.TextWidth("-")


Arm79   (2003-10-08 18:46:00) [5]

В общем, что-то вроде этого.
Я не проводил анализ содержимого поля, поэтому черточки везде.

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
R:TRECT;
begin
R:=Rect;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
DBGrid1.Canvas.Pen.Color:=clblack;
DBGrid1.Canvas.Pen.Width:=1;
DBGrid1.Canvas.MoveTo(R.Left+round((R.Right-R.Left)/2-3), round(R.Top+(R.Bottom-R.Top)/2));
DBGrid1.Canvas.LineTo(R.Left+round((R.Right-R.Left)/2+3), round(R.Top+(R.Bottom-R.Top)/2));
end;


MsGuns   (2003-10-08 18:42:00) [6]

Значицца так:

procedure TForm1.grReportDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
emptnum: string = "---";
begin
if Column.FieldName<>"C10OUTQTT" then exit;
if (Column.Field.AsString="") or
(Column.Field.AsString="0") then
with Sender as TDBGrid do
Canvas.TextOut(Rect.Left+((Rect.Right-Rect.Left-Canvas.TextWidth(emptnum)) div 2),Rect.Top,emptnum);
end;

procedure TForm1.cdsRep8C10OUTQTTGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
begin
if (Sender.AsString="") or (Sender.AsString="0") then Text := ""
else Text := Sender.AsString;
end;


Осталось прикутить второй обработчик нужным филдам, а в первый всобачить перебор имен ентих филдов и усе заработает.
Но как-то все некрасиво, кустарно как-то ;((

А как мастера робят ?


MsGuns   (2003-10-08 18:01:00) [7]

С генератором (QReport) я сам разобрался (BeforePrint детального бэнда), а с гридом чего-то не получается...
Щас еще попробую с канвой, если не получится, выкину код.

ЗЫ. Классно получилось ! "Выкину" в смысле покажу в посте. Хотя может и выкинуть бы надо ;)))

ЗЗЫ. Что-то седни у меня ручки шалят не по-детски ;)))


Anatoly Podgoretsky   (2003-10-08 17:54:00) [8]

Указал юы какой генератор отчета


Delirium^.Tremens   (2003-10-08 17:52:00) [9]

Пушки, воробьи...
Она что, штангенциркулем будет измерять? :-)

Добавь примерное количество пробелов и на боковую :-)
"- "


MsGuns   (2003-10-08 17:51:00) [10]

A_N_D © (08.10.03 17:44) [6]
Как можно определять ширину рисуемого текста вообще для грида, если фонты в ячейках (столбцах) могут отличаться ?

>Arm79 © (08.10.03 17:44) [7]
>Такой опытный программер 8-0))),

Если б я был такой опытный, я б не лазал по форумам и вообще был бы щас не здесь...
Если не трудно, приведи, пожалуйста


Johnmen   (2003-10-08 17:46:00) [11]

Ну как в гриде - понятно. Вычисляем ширину символа, ширину ячейки и далее позицию отображения символа.
А какой генератор отчетов ?
Если QR, то просто в BeforePrint"е бенда выставляешь нужное выравнивание , а в OnPrint"e - значение. Если компонент отображения типа TQRLabel, то значение можно и в бефорепринте...

>определить ширину в пикселах самой черточки

TextWidth канваса


Romkin   (2003-10-08 17:44:00) [12]

Canvas.TextWidth
А на OnDrawColumnCell делай TextOut :) Никаких пробелов, там по точкам


Arm79   (2003-10-08 17:44:00) [13]

Такой опытный программер 8-0))), и просит код? Вовсе не обязательно при OnDrawColumnCell вставлять символ "-". Можно ведь его нарисовать (LineTo). Так код приводить или уже и так понятно?


A_N_D   (2003-10-08 17:44:00) [14]

DBGrid1.Canvas.TextWidth("-")


MsGuns   (2003-10-08 17:40:00) [15]

>Arm79 © (08.10.03 17:34) [3]
>Анализируй ширину рисуемого столбца

Надо ж во-первых, определить ширину в пикселах самой черточки, а потом уж ее дополнять справа пробелами пока не выйдет ширина=половине столбца. Но вот не соображу как енто сделать (т.е определить ширину текста). Если можно, маленький кодик...;))


Arm79   (2003-10-08 17:36:00) [16]

Или создай вычисляемое поле, в которое пихай в строковом выражении числа. Если нет числа, то "-". А столбец выровняй по центру


Arm79   (2003-10-08 17:34:00) [17]


> OnDrawColumnCell

Анализируй ширину рисуемого столбца


Delirium^.Tremens   (2003-10-08 17:10:00) [18]

Если мне память не изменяет (а скорее всего изменяет), делал я такое в OnGetText для филда.
Делфи нет под рукой посмотреть :-)


MsGuns   (2003-10-08 17:07:00) [19]

Пардон, забыл малюсенькую деталь: сами числа и в гриде, и в репорте выровнены к правой границе.


Наверх

Титульная страница Поиск, карта сайта Написать письмо