-
Постов
19 -
Зарегистрирован
-
Посещение
-
Победитель дней
3
Сообщения, опубликованные willi
-
-
Заменил одну кривую графика на функцию синуса:
Код: вместо линейной функции точек:
Lx:=-20; Ly:=0;
for i :=0 to 300 do
begin
Larea.Curves.Last.Points.Add(TcvPoint.Create(i,Lx,Ly));
Lx:=Lx+2; Ly:=120+50*Sin(Lx*0.04);
end;Видно, что для этой данной кривой выводятся не все значения точек, а только указанные...
-
Видимо, пример слишком простой -- Вы правы, между точками интерполяция идет прямыми линиями, но если задать в исходных Y=Func(X) синусоиду или случайный процесс - как назвать график, который получится в итоге - обычно называют "кривой"... Выводить в показ маркеров можно не все значения точек, а выборочно...
-
Написал в XE10.1 простой модуль для вывода кривых на TImage в виде графика - есть возможность вывода столбцов для диаграмм, меток с надписями и прочей мелочи.
В виде компонента не оформлял... Смысл: вводим массив точек - график сам подбирает область вывода чтобы влезли надписи и выводит с указанными параметрами и стилем кривые (имею в виду зависимости Y от X).
Есть комментарии в коде - есть пример для тестов - см. проект https://github.com/willi-spb/arTrassingжелательно тестирование, возможно я что-то упустил - сам модуль: https://github.com/willi-spb/arTrassing/blob/master/FMX.arCurveClasses.pas
-
Работает - главное, не вызывать нигде LBM.Free;
-
Ага! - оказалось, по умолчанию - при отключенных опциях - линии просто выключены - позабыл я еще попробовать Kind=Solid В общем - пока у меня локальный вывод: при рисовании ячеек в TGrid очень желательно выставлять полностью всё перед началом вывода на Canvas: включая также Padding=0.
-
2. В отношении разделительных линий:
Я отключил прорисовку линий в Options TGrid - при этом прямоугольник заполняется полностью - границ нет, однако, в этом режиме (таблица без линий) есть другая особенность: любые команды типа Canvas.DrawRect Canvas.DrawLine Canvas.Draw... ничего на канву не выводят - т.е. границу так не нарисовать. Это - если кто-то столкнется со странностями при прорисовке каких-то контуров в ячейках...
Vitaldj см. пункт 1 в моем первом сообщении этой темы
-
procedure TForm18.Grid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates); /// var LB:TGraphicField; LBM:FMX.Graphics.TBitmap; begin if Column.Index=1 then begin try Canvas.BeginScene; CoLumn.Padding.Rect:=rectF(0,0,0,0); Canvas.Fill.Color:=TAlphaColorRec.Green; Canvas.FillRect(Bounds,0,0,[],1); Canvas.Stroke.Color:=TAlphaColorRec.red; Canvas.DrawRect(Bounds,0,0,[],1); if (Value.IsEmpty=false) and (Value.IsObject=true) then begin LB:=TGraphicField(Value.AsObject); LBM:=FMX.Graphics.TBitmap.Create; try LBM.Assign(LB); Canvas.DrawBitmap(LBM,RectF(0,0,LBM.Width,LBM.Height),Bounds,1); finally LBM.Free; end; end; finally Canvas.EndScene; end; end; end;
Спасибо Сергею Рощину - получилось. Действительно, нужно обязательно указать тип поля ftGraphic в свойстве BlobType у полей таблицы TFDMemTable - Причем, мне пришлось заново перезацепить LiveBinding для таблицы и чуть подправить код события - см. выше -у меня в старом моем варианте для поля ftGraphic выдавалась AV на чтение потока (позже посмотрю - почему).
-
А вот какой эффект получается при добавлении в событие:
Padding=0 -->
CoLumn.Padding.Rect:=rectF(0,0,0,0);
Canvas.Fill.Color:=TAlphaColorRec.Green;
Canvas.FillRect(Bounds,0,0,[],1);
Canvas.Stroke.Color:=TAlphaColorRec.red;
Canvas.DrawRect(Bounds,0,0,[],1);
Как видно -- все равно остается некоторое пространство вокруг ячеек -
-
Вот пример с блобами - как видно есть по умолчанию отступ и не работает перерисовка по событию - OnDrawColumnCell - я привожу вариант этого обработчика как в ХЕ8 - но Value - в данном случае - это не объект - и видно только закрашенный прямоугольник... Вверху над таблицей я добавил TImageControl - у него при проходе по таблице поле отображается корректно (привязка LIveBinding)
(Кстати - если не использовать обработчик - выводятся пустые ячейки столбца с блобом)
-
Спасибо за информацию - я скачал демку - но там особенность в том, что картинки хранятся в TImageList - а в качестве переменной для столбца TGrid - индекс этого списка,как я понял... --- меня же интересовала ситуация с Blob-картинками в полях - например, как в старых примерах с рыбками - в XE8 та же табличка у меня с Blob работала - я постараюсь сделать отдельный воспроизводимый пример...
-
При переходе на Delphi 10.1 Berlin (FMX) с XE8 возникает много "интересных" нюансов с TGrid:
1. У меня все(!) внутренние ячейки выводятся с отступом в 3px (я перерисовываю их в событии OnDrawColumnCell) от всех сторон - при этом внутри уже по умолчанию используется отсечка по области рисования (т.е. если задать большую область для, к примеру, FillRect - всё равно будет заполняться только с отступом 3px) - мое решение - локально создать
var L_Rects:TClipRects; и var L_Bounds:TRectF;
---------> L_Bounds:=Bounds;
L_Bounds.Inflate(3,3); // ! - компенсировать отступ
SetLength(L_Rects,1);
L_Rects[0]:=L_Bounds;
/// - далее
with aGrid do
try
Canvas.BeginScene(@L_Rects); // !!..... рисуем на Canvas
finally Canvas.EndScene; SetLength(L_Rects,0);
end;2. Из Published исчезло событие OnApplyStyleLookup - приходится вызывать его где-то при показе таблицы вручную...
3. Также исчезли события OnMouseUp и OnMousDown - похоже на прокол разработчиков - они есть в Public - их нужно прицеплять в коде выставляя их на свои методы формы (параметры методов такие же как и в XE8).
4. LiveBinding у меня не работает для полей с Blob - картинками - при вызове OnDrawColumnCell - для такого вида привязки параметр const Value: TValue или пустой, или (в зависимости от стиля столбца) содержит строку "(Object)" - как показать в таблице blob-поле - картинку в XE10 с помощью Livebinding я так и не понял...
5. Непонятно зачем нужно событие OnDrawColumnBackground - по-моему, оно никогда не срабатывает - совместимость со старыми версиями?
____________Напишите, если кто-нибудь сталкивался с этими моментами и нашел какой-то другой ответ - хотелось бы использовать LiveBinding как в XE8 и ранних версиях...
-
учти тот момент, что эффекты и анимация одновременно для одного объекта не работают (в XE8)
-
Вот исходники под XE8 - хотя, там позориться больше - замысел был, как часто бывает, хороший, но поскольку этот проект не оплачивается, пришлось отложить пока...
-
Еще можно, просматривать выбранный элемент в виде xml и править его вручную (немного проще получается, чем лазить по всему файлу стиля)
-
Там всё сделано, по сути, через процедуру декодировки - планировалось дальнейшее развитие и приведение в человеческий вид... Сейчас, к примеру, не так, как хотелось бы, сохраняется дерево вложенных объектов (вернее вообще никак)... Но для копирования - удаления, очистки набора стилей и некоторых вещей мне лично хватает.
Очистка, кстати, позволяет хранить отдельно, например, стили кнопок или прогрессбара и втыкать их в свои наборы стилей по необходимости -
-
Модуль функций для создания копий контролов
в Компоненты
Опубликовано
Исторически сложилась практика использования свойства Tag в контролах (например, для поиска в списке владельца).
Наиболее часто встречается ситуация "ПОЛОС" в приложении - в дизайне создаю панель или TLayout - в ней размешаю набор контролов - это панель-образец, тут-то и используются тэги.
При запуске динамически создаю набор из панелей-TLayout - и в них, в каждую, копирую все контролы из образца с установленными в образце свойствами.
При работе затем нужно находить контролы по их панели-полосе для заполнения и отслеживания информации.
Давным-давно был создан набор функций по "клонированию" контролов, копированию значений некоторых нужных свойств, отысканию по Tag - причем, сделано было "в лоб", там же добавлен ряд функций для корректировки контролов - убрать линию заголовка TGroupBox, подровнять радиокнопки, назначить события из образца...
Если кому-то нужно, - привожу ссылку на github https://github.com/willi-spb/Common/blob/master/FMX.FormFuncs.pas
Интересует реализация подобных вещей - у кого есть готовые хорошие аналоги?
Оговорюсь сразу - хранения информации в словарях TModel.Data в приведенном модуле нет - для этого есть другой, однако, если кто-то использует и такие варианты, тоже хотелось бы посмотреть.
Мне кажется, в разработке подобные вещи могут пригодится...