Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.05.26;
Скачать: CL | DM;

Вниз

DrawGrid   Найти похожие ветки 

 
Ghost del vonte ©   (2012-10-29 18:07) [0]

Здравствуйте!

Вообщем, пишу компонент, на основе TDrawGrid...
И столкнулся с такой проблемой...

У компонента есть поле, в котором указывается колличество клеток,
при изменении которого происходит заполнение компонента клетками...
Суть в том, что заполнение то происходит, но последние клетки видны наполовину... а надо их полностью вместить, ведь изначально неизвестно,
какие будут размеры у грида, и клетки должны быть полностью видны...
У меня неполучается... посоветуйте, как исправить это?

Вот код который я пишу, код из временного проекта, в котором я пытаюсь
найти выход из положения:


// se1 это SpinEdit

 DrawGrid1.ColCount := se1.Value;
 DrawGrid1.RowCount := se1.Value;
 X:= (DrawGrid1.ClientWidth div se1.Value);
 Y:= (DrawGrid1.ClientHeight div se1.Value);
 DrawGrid1.DefaultColWidth := X;
 DrawGrid1.DefaultRowHeight := Y;


Вот с этим пытаюсь бороться http://content.foto.mail.ru/mail/ghostdelvonte/244/i-245.jpg


 
Германн ©   (2012-10-29 18:44) [1]

В расчетах ширины и высоты не учитываешь толщину линий сетки.


 
Ghost del vonte ©   (2012-10-29 19:56) [2]


> В расчетах ширины и высоты не учитываешь толщину линий сетки.


Я уже пробовал, все-равно не получается...
В этом случае, наоборот, остается пустое место...


DrawGrid1.DefaultColWidth := X-1;
DrawGrid1.DefaultRowHeight := Y-1;


Толщина линии по умолчанию = 1


 
Германн ©   (2012-10-29 20:16) [3]


> В этом случае, наоборот, остается пустое место...

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


 
Германн ©   (2012-10-29 20:28) [4]

Хотя насчет порядка вычислений я не прав. (((


 
Ghost del vonte ©   (2012-10-29 20:35) [5]

Спасибо Герман!

Все заработало, сделал так:


 DrawGrid1.ColCount := se1.Value;
 DrawGrid1.RowCount := se1.Value;

 X:= (DrawGrid1.ClientWidth div se1.Value);
 Y:= (DrawGrid1.ClientHeight div se1.Value);

 DrawGrid1.ClientWidth := (X*se1.Value)+se1.Value;
 DrawGrid1.ClientHeight := (Y*se1.Value)+se1.Value;


Грид стал подгонятся и все клеточки хорошо видны!
Жаль что размеры грида не получилось оставить фиксированными...
Мне пока не хватает знаний для этого! :)


 
Ghost del vonte ©   (2012-10-29 20:39) [6]


> Все заработало


http://content.foto.mail.ru/mail/ghostdelvonte/244/i-246.jpg


 
Inovet ©   (2012-10-29 21:10) [7]

> [5] Ghost del vonte ©   (29.10.12 20:35)
> Жаль что размеры грида не получилось оставить фиксированными...
> Мне пока не хватает знаний для этого! :)

Не расстраивайся, это невозиожно.:)


 
sniknik ©   (2012-10-29 23:43) [8]

> Мне пока не хватает знаний для этого! :)
тебе не хватает пикселя с плавающей запятой... ;) "для этого". а знаний для того чтобы понять...
для наглядности выпиши в столбик результаты от div, и рядом "восстановленное"/умноженное значение, сравни с исходным, константной (например 240 как в примере). сходится?


 
Ghost del vonte ©   (2012-10-30 00:28) [9]


> результаты от div


Summary - и есть результат, тоесть, ширина и высота клеток, еще + 20 (линии, ширина линии 1, тоесть 20 линий),
и получается 260, как на рисунке... ну и грид стал тоже 260...

Да это в целом не проблема, можно компонент кинуть на панель,
потом, установить колличество клеток, подогнать грид, и центрировать компонент на панельке)) Хотя... фиксированный был бы лучше...


 
sniknik ©   (2012-10-30 01:39) [10]

> Summary - и есть результат
одно значение не наглядно, ты смотри списком(столбиком).

> фиксированный был бы лучше...
> это невозиожно.:)
ну... пока дробные пиксели не изобретут.


 
Германн ©   (2012-10-30 01:44) [11]


> ну... пока дробные пиксели не изобретут.

Или "плавающие по монитору" :)


 
Ghost del vonte ©   (2012-10-30 02:09) [12]


> sniknik ©


Я не могу уловить ход ваших мыслей... уже запутался:)

Сначала устанавливаю клиентскую область грида в 250на250...
затем, заполняю 20 клетками, результат деления клиентской области на
20 = 12...
меняю размеры клеток...
затем, 12 умножаю на 20, получаю = 240, прибавляю 20 (толщина линий),
получаю 260... подгоняю грид...

Что там еще высчитывать? :) Не пойму...(


 
Германн ©   (2012-10-30 03:05) [13]


> Ghost del vonte ©   (30.10.12 02:09) [12]
>
>
> > sniknik ©
>
>
> Я не могу уловить ход ваших мыслей... уже запутался:)
>

Это к тому, что как сказал Inovet ©   (29.10.12 21:10) [7]
"Не расстраивайся, это невозможно.:)"
При целочисленной арифметике получить точный результат деления можно только иногда. Когда делитель кратен делимому.
Извините за мой французский :)


 
Ghost del vonte ©   (2012-10-30 03:33) [14]

Хм...
О плавающей запятой ни разу не слышал, а о плавающей точке да...
Round?

Надо почитать книгу Краснова по OpenGL...
у него там много где это встречается...


 
Германн ©   (2012-10-30 03:47) [15]


> Ghost del vonte ©   (30.10.12 03:33) [14]
>
> Хм...
> О плавающей запятой ни разу не слышал

Сектанты-родители не пускали в школу?
:)


> Надо почитать книгу Краснова по OpenGL...
> у него там много где это встречается...

Лучше сначала что-то более простое и общее.


 
Ghost del vonte ©   (2012-10-30 03:58) [16]


> Германн ©


Я любитель, пишу для себя, ну нравится мне это...
А Краснова я уже читал, ничего правда не понял, но читал))

Может его книга научит точному делению...
Вы подали идею насчет грида, я ее и заюзаю... а читать буду для себя))

У меня 3 книги, 1 - перевод справки, 2 - Архангельский, 3 - краснов!
Инету не доверяю, пишут одно и тоже но по разному...
только этому сайту верю, мне тут не один раз помогали...

Спасибо всем!


 
Германн ©   (2012-10-30 04:27) [17]


> Ghost del vonte ©   (30.10.12 03:58) [16]
>
> У меня 3 книги,
1 - перевод справки - На помойку!
2 - Архангельский - пока что туда же.
3 - краснов. Уже лучше. Но это не по основам Дельфи.
> Инету не доверяю, пишут одно и тоже но по разному...
> только этому сайту верю, мне тут не один раз помогали...
> Спасибо всем!

Да не за что! Приходите ещё.


 
Inovet ©   (2012-10-30 05:34) [18]

> [12] Ghost del vonte ©   (30.10.12 02:09)
> затем, 12 умножаю на 20, получаю = 240, прибавляю 20 (толщина линий),

Во-первых
12*20+19
или
12*20+21

Во-вторых, как это подогнать к 250?


 
Ghost del vonte ©   (2012-10-30 06:32) [19]


> Inovet ©


Линий да, 21... но первая и последняя не видны, прячутся за края, поэтому 19...
250 / 21 = 11,9047619047619... вот что показал калькулятор...
А в программе 12...
теперь я понял что за плавающая запятая... завтра же за Краснова!


 
kilkennycat ©   (2012-10-30 07:25) [20]

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


 
Германн ©   (2012-10-30 12:39) [21]


> Inovet ©   (30.10.12 05:34) [18]
>
> > [12] Ghost del vonte ©   (30.10.12 02:09)
> > затем, 12 умножаю на 20, получаю = 240, прибавляю 20 (толщина
> линий),
>
> Во-первых
> 12*20+19
> или
> 12*20+21

Эээ. Не сбивай новичков с толку. Линий в сетке всегда ровно столько сколько столбцов и сколько строк. Так что +21 никогда не верно. А вот +19 вполне себе нормальный вариант чтобы правая и нижняя сторона грида выглядела бы точно так же как и левая и верхняя.


 
kilkennycat ©   (2012-10-30 18:49) [22]


> Линий в сетке всегда ровно столько сколько столбцов и сколько
> строк.

на одну меньше, вообще-то. если не считать периметр. а если считать, то на одну больше, и никогда ровно столько же.


 
Германн ©   (2012-10-30 19:53) [23]


> на одну меньше, вообще-то. если не считать периметр. а если
> считать, то на одну больше, и никогда ровно столько же.

У каждого столбца есть "своя" правая линия сетки и у каждой строки есть "своя" нижняя линия сетки. (Периметр не считаем, ибо это нечто другое). Итого - полное равенство. В чем я не прав?


 
квадрат   (2012-10-31 03:11) [24]

Если таблица состоит только из одной ячейки и что бы её начертить - нужны два горизонтальных и два вертикальных отрезка.


 
Германн ©   (2012-10-31 03:46) [25]


> квадрат   (31.10.12 03:11) [24]
>
> Если таблица состоит только из одной ячейки и что бы её
> начертить - нужны два горизонтальных и два вертикальных
> отрезка.

Если ты рисуешь "ячейку" на "чистом поле", то да. Но ни TStringGrid, ни TDrawGrid не рисуют свои ячейки на "чистом поле".  У них есть то, что Костя назвал "периметром". И вот от этого "периметра" идёт отсчет ширины, высоты и позиции.
Левую линию для первого столбца и верхнюю линию для первой строки не рисует никто!

Есть только нюансы при прорисовке фиксированных столбцов и строк. Но и там, если посмотреть в исходниках, процедура DrawEdge рисует левую и верхнюю границу за счёт "клиента", а правую и нижнюю - за счёт "заведения" :)


 
Inovet ©   (2012-10-31 14:36) [26]

> [25] Германн ©   (31.10.12 03:46)
> Левую линию для первого столбца и верхнюю линию для первой
> строки не рисует никто!

Это уже нюансы отображения, а автору надо именно вписать, и эти линии не нужны или нужны и первые, и последние.

> [19] Ghost del vonte ©   (30.10.12 06:32)
> 250 / 21 = 11,9047619047619... вот что показал калькулятор...
> А в программе 12...
> теперь я понял что за плавающая запятая...

Имхо не то ты понял. Даже, пусть, прорисованы те линии
250/20=12,5
12,5 целых яблок не бывает - это уже не целые, а огрызки.


 
kilkennycat ©   (2012-10-31 22:27) [27]

есть ОДНА клетка. периметр рисуем отдельно, а значит у нее НОЛЬ линий. чтобы получить ДВЕ клетки, нужно провести ОДНУ линию. т.е получаем формулу кол-во линий равно кол-во клеток минус 1.
Периметр не отдельно, тогда у ОДНОЙ клетки ДВЕ линии
первый вариант оптимальнее рисовать
кол-во клеток не равняется кол-ву линий


 
Германн ©   (2012-10-31 22:56) [28]


> kilkennycat ©   (31.10.12 22:27) [27]
>
> есть ОДНА клетка. периметр рисуем отдельно, а значит у нее
> НОЛЬ линий.

Для TString(Draw)Grid утверждение неверно. Если с гриде один столбец и одна строка, то у такой клетки 2 линии. Одна справа и одна снизу.


 
Германн ©   (2012-11-01 01:37) [29]


> Inovet ©   (31.10.12 14:36) [26]
>
> > [25] Германн ©   (31.10.12 03:46)
> > Левую линию для первого столбца и верхнюю линию для первой
> > строки не рисует никто!
>
> Это уже нюансы отображения, а автору надо именно вписать,
>  и эти линии не нужны или нужны и первые, и последние.

Именно про это я и говорил. Только ты не понял. Имхо либо не занимался подобным подбором ширины/высоты клиентской области TString(Draw)Grid, либо занимался, но очень давно.
Представь себе лист бумаги, на котором ты что-то пишешь. И слева хочешь сделать колонку для некоторых пометок. Сколько линий для этого нужно провести карандашом или ручкой?


 
Германн ©   (2012-11-01 01:55) [30]

После осознания вышесказанного осталось понять, что лист бумаги имеет строго заданную ширину и высоту. А TString(Draw)Grid может иметь любую заданную ширину и высоту своей клиентской области. Но в то же время он имеет заданный массив ColsWidth. Так как же ему визуально отобразить крайнюю правую и крайнюю нижнюю границу ячейки, кроме как нарисовать её карандашом с минимальной толщиной?


 
Inovet ©   (2012-11-01 08:48) [31]

> [30] Германн ©   (01.11.12 01:55)

Я это понял, но в данном случае нужны ножницы, поскольку необходимом точно разсчертить клиентский лист для различного количества ячеек, а на линейке нет делений меньше 1 мм.



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

Текущий архив: 2013.05.26;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.009 c
15-1358202621
alexdn
2013-01-15 02:30
2013.05.26
Вот интересно


2-1351605492
LDV
2012-10-30 17:58
2013.05.26
поставить Breakpoint


15-1358713803
Юрий
2013-01-21 00:30
2013.05.26
С днем рождения ! 21 января 2013 понедельник


2-1351505552
0xFFFFFFFF
2012-10-29 14:12
2013.05.26
расположение компонентов


15-1358417071
cmexx
2013-01-17 14:04
2013.05.26
adobe reader