Форум: "Начинающим";
Текущий архив: 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.53 MB
Время: 0.004 c