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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.003 c
4-1265154894
Vincent
2010-02-03 02:54
2013.05.26
Может ли EnumProcessModules не находить всех подключенных DLL?


15-1358454602
Юрий
2013-01-18 00:30
2013.05.26
С днем рождения ! 18 января 2013 пятница


2-1351601419
HEND
2012-10-30 16:50
2013.05.26
DBMemo Вопрос


15-1358354365
alexdn
2013-01-16 20:39
2013.05.26
Windows 32/64


15-1358697508
QAZ10
2013-01-20 19:58
2013.05.26
Перехват системного исключения





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский