Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Embarcadero RAD Studio XE4

Автор: deks
Дата сообщения: 21.06.2013 11:01
valgreesh


Цитата:
Динамически подгружать библиотеки на этих платформах можно?

На iOS нельзя. Только статическая линковка. Динамическая линковка - только к фреймворкам самой iOS. Также запрещена всякая подгрука "кода" из интернета. Также запрещена или очень сильно ограничена JIT-компиляция (чтобы вы исходник не загрузили и не откомпилировали его на устройстве). В общем, любой код должен проходить через проверку в AppStore. Отсюда почти полное отсутсвие вирусов/малвари.


Цитата:
Повторите - интересно
TVirtualInterface


Как я понял - это немного не то. TVirtualInterface - это способ все вызовы методов через интерфейсную переменную направить в "центральзованный" класс-обработчик. А уже обработчик (его метод DoInvoke) направит их к нужной реализации. Да, так можно привязать интерфейс к классу, но нужно руками написать дополнительный класс и весь "маршрутизирующий" метод DoInvoke. Согласитесь, это немного сложнее чем простой каст.

П.С. Если в буржуйском инете кто то что то хорошее про интерфейсы написал, то это Nick Hodges
Автор: delover
Дата сообщения: 21.06.2013 11:36

Цитата:
Потому что нативный мир сильно неоднороден. А дельфя обеспечивает взаимодействие не только внутри своей закрытой песочницы (как это делают жаба с дотнетом), но и с внешним миром тоже.

Это очень хорошо потому как я могу использовать другие библиотеки, например тот же интеропт ExitProcess и тогда, пожалуйста, я могу выйти там где происходит вызов внутри Halt, но это не всем удобно.
Автор: valgreesh
Дата сообщения: 21.06.2013 11:37
deks

Цитата:
На iOS нельзя. Только статическая линковка. Динамическая линковка - только к фреймворкам самой iOS.

Убогая политика iOS еще не повод отказываться от интерфейсов вообще. Дельфя, слава яйцам, не iOS only.


Цитата:
Как я понял - это немного не то.

Это отправная точка для реализации подобного функционала.


Цитата:
Да, так можно привязать интерфейс к классу, но нужно руками написать дополнительный класс и весь "маршрутизирующий" метод DoInvoke. Согласитесь, это немного сложнее чем простой каст

Это должен быть библиотечный код. После чего прикладной не будет отличаться от простого каста:

Код:
Duck<TAnyInterface>(Obj).SomeMethod();
Автор: deks
Дата сообщения: 21.06.2013 12:54
valgreesh

Да, вот это уже оч похоже, спасибо))

http://arcana.sivv.com/blog/2012/2/17/duck-duck-delphi-release-3.html

Только там так:
Код:
obj.asA<ISomeInterface>.SomeMethod();
Автор: Drionn
Дата сообщения: 21.06.2013 13:51
Товарищи, конечно Ваша дискуссия увлекательна, но кто может прояснить разницу:
Два компонента на форме FM - 2D - TImage and TPaintBox

Команда:
image1.Bitmap.Canvas.FillText( ARect, 'GFDSA', false, 0.1,    [TFillTextFlag.ftRightToLeft],
TTextAlign.taTrailing, TTextAlign.taLeading );
рисует буковки без учета прозрачности (хотя явно указано - 0.1) + корябает шрифт.
Чувство, что выводит дважды со смещением.
И, если кнопкой выводить повторно в то же самое место, то толщина линий увеличивается (конечно визуально).


А вот Команда:
PaintBox1.Canvas.FillText( ARect, 'GFDSA', false, 0.1,    [TFillTextFlag.ftRightToLeft],
TTextAlign.taTrailing, TTextAlign.taLeading );
рисует буковки как надо.

Почему?

Ещё. Как делать Repaint формы или PaintBox без скрытия/раскрытия руками?
Принудительный вызов метода onpaint не даёт эффекта.

PS. Извиняйте, пример не могу выложить, тут на форуме нельзя аттач файлы
Автор: Frodo_Torbins
Дата сообщения: 21.06.2013 15:00

Цитата:
И, если кнопкой выводить повторно в то же самое место, то толщина линий увеличивается (конечно визуально).
Нормальное поведение для TImage, ведь он не предназначен для рисования.


Цитата:
Ещё. Как делать Repaint формы или PaintBox без скрытия/раскрытия руками?
А у них разве нету соответствующего метода? В VCL он так и называется - Repaint.
Автор: Drionn
Дата сообщения: 21.06.2013 15:51
"Нормальное поведение для TImage, ведь он не предназначен для рисования."
Ну, да. А как тогда рисовать? В ex4 и на чём (я графики хочу)?
Только этот компонент тут держит repaint. Остальные его не имеют (как я пока понимаю и успел поюзать чего) и довольствуются onpaint, который программно не вызывается с эффектом исполнения.
У меня версия с рутраккерорг сампонмаиете.
Автор: Eternal_Shield
Дата сообщения: 21.06.2013 17:06
Drionn

Цитата:
Ну, да. А как тогда рисовать? В ex4 и на чём (я графики хочу)?

TPaintBox обычно юзают для этого или TPanel .... кому как.
Автор: deks
Дата сообщения: 21.06.2013 17:29
Drionn

_http://docwiki.embarcadero.com/Libraries/XE4/en/FMX.Controls.TControl.PaintTo

Не оно?
Автор: Drionn
Дата сообщения: 21.06.2013 17:30
Не могу повторный тест с TPanel. Выходной, а дома ех4 нет. Но полууверен, что в нём нет repaint or refresh. И нет возможности вызвать онпаинт с ожидаемым результатом. В лоб, понятно, ничего не выводится.
Автор: Eternal_Shield
Дата сообщения: 21.06.2013 17:38
Drionn

Цитата:
Не могу повторный тест с TPanel.

Пардон, тупанул, от TPanel лучше наследоваться. Пробуйте лучше TPaintBox.


Цитата:
Но полууверен, что в нём нет repaint or refresh.

Методы Refresh и Repaint у TPanel, разумеется, есть. Куда без них, а вот OnPaint события нет.
Автор: Drionn
Дата сообщения: 21.06.2013 17:45
deks

Благодарю.

Оно, да оно, вероятно оно. Замыленный глаз видал его. Буду пытать его.
Однако не объясняет поведение ....bitmap.canvas. .....

Боль головы, а ещё нужно ето на плоттер. Ранее я рисовал на канве монитора, а для вывода 1:1 на канве printer.

Удачных и счастливых всем выходных.

Добавлено:
Eternal_Shield

Я уж в растерянности. TPaintBox уже пытал. И нет там Repaint!
Вероятно пятница. Мозги пухнут +32, а вечер.

Замутил я Вас. За мной долг за Ваше внимание, отпишусь по результатам в конце пн..

Автор: sergionn
Дата сообщения: 21.06.2013 19:01
Drionn
1) canvas.filltext заменено на, через TTextLayout
2) В PaintBox тебе дают главную канву с настроенной матрицей, и когда ты рисуешь на событиях OnPaint-Onpainting то сцена открыта, и нужно быть аккуратней с границами отсечения и матрицей канвы, т.к. можно будет испортить всю глобальную картинку,
а при рисование в битмап, без событий, - новая канва, открывай-закрывай сцену BeginScene-Endscene, затем делай активными изменения.
3) Все что наследуется от tcontol имеет метод repaint - он вызывает события онпаинт и перерисовывает нужную цепочку в сцене.
да, не забывай очищать канву и задавать границу отсечения если нужно, рисование в битмап по такой схеме:

pCanvasState := Canvas.SaveState;
Canvas.BeginScene;
Canvas.IntersectClipRect(fPaintRect);
Canvas.ClearRect(fPaintRect, 0);
********рисуем
Canvas.EndScene;
Canvas.RestoreState(pCanvasState);

это все можно запихать в событие OnPaint, и вызывать сам процесс рисования через Image.Repaint
но можно рисовать и извне, а затем вызывать repaint, но в первом случае изображение всегда будет перерисовываться если будут внешние воздейтвия т.е. всегда актуально
Автор: delover
Дата сообщения: 22.06.2013 06:41

Цитата:
Попробуй заменить на IUnknown

Странно, раньше на интерлоке декремент какой то ругался, сейчас не ругается.

Автор: Arioch1
Дата сообщения: 22.06.2013 16:40

Цитата:
Exactly! Мы один неявный каст делаем ( из TFileList в IFileList ), а двойной каст (сначала в IFileList, потом в IList) не хотим!


Это неудобно, конечно... Но вот представим у нас есть типы (с неявным преобразованием)
T1 -> TA -> T2 и T1 -> TB -> T2
Причем, преобразования через TA и TB работают заметно по разному.

И вот мы где-то сделали "по простому" var:T2 := expression:T1;

И вот в зависимости от очередности модулей в uses, наличия свежих dcu, фазы луны и еще бог весть чего эта строчка в одних местах программы будет трактоваться так, а в других - иначе. Как-то это настораживает...

тоже, кстати, проклятый ромб напоминает


Цитата:
Принцип полиморфизма. Интерфейсы разные, но связаны наследованием.

Наследуется поведение. У интерфейса поведения нет.
Автор: delover
Дата сообщения: 22.06.2013 22:15
Нет, в смысле да, такое часто. Например, если бы изначально ставилась задача писать IFileList, возможно всё бы получилось минуя преобразования. Зачастую необходимость выделить интерфейс возникает позже, хотя мне понятно почему IFileList удобнее без IFileListItem, кажется он удобнее даже без методов IList.
Автор: delover
Дата сообщения: 23.06.2013 10:06
Нашёл пример, где от списка файлов надо было только IsMask.

Код: [no]
WHILE (@@FETCH_STATUS = 0)
BEGIN
EXEC @hr = sp_OAMethod @object, 'IsMask', NULL, @filename, @mask, @retcode OUTPUT
IF @hr <> 0
BEGIN
SET @ErrBuf = 'Ошибка IsMask() , код ошибки ' + CONVERT(varchar(32), @hr)
EXEC [dbo].[p_message] @msg = @ErrBuf
EXEC sp_OADestroy @object -- no retcode here
END
IF @retcode = 1
INSERT INTO @ret VALUES (@filename)
FETCH NEXT FROM CrsMaskTables INTO @ff_id, @filename
END[/no]
Автор: Drionn
Дата сообщения: 24.06.2013 09:03
sergionn

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


Вот это и существенно в моём случае. Рисую графики 5-10 линий по 50-100 тыс. точек каждая. Перерисовка на каждый чих утомительна. (понятно, что разрешение экрана много меньше, но данные те с приборов, и могут быть пропущены пики, если уменьшать размерность. на самом деле получаются не линии, а полосы с выбросами). Поэтому обратился к image.bitmap.
Ваша подсказка не помогла. У меня код рисует текст без учета прозрачности и кривым шрифтом:
procedure TForm1.Button2Click(Sender: TObject);
var
ARect,fPaintRect:TRectF;
pCanvasState:TCanvasSaveState;
begin

fPaintRect.Create(0,0,image1.Bitmap.Canvas.Width,image1.Bitmap.Canvas.Height);
ARect.Create(10, 40, image1.Bitmap.Canvas.Width,image1.Bitmap.Canvas.Height);

pCanvasState := image1.Bitmap.Canvas.SaveState;
image1.Bitmap.Canvas.BeginScene;
image1.Bitmap.Canvas.IntersectClipRect(fPaintRect);
image1.Bitmap.Canvas.ClearRect(fPaintRect, 0);
image1.Bitmap.Canvas.Fill.Color:=claBlack;
image1.Bitmap.Canvas.Font.Size:=14;
image1.Bitmap.Canvas.FillText( ARect, 'GFDSA', false, 0.1,    [TFillTextFlag.ftRightToLeft], TTextAlign.taTrailing, TTextAlign.taLeading );
image1.Bitmap.Canvas.EndScene;
image1.Bitmap.Canvas.RestoreState(pCanvasState);

end;

Спасибо за участие. Попытаю ещё PaintBox (мои "стоны" по нему кажется преувеличены, тогда сказалась пятница и жара).

Кстати, если выводить текст на TPaintBox с поворотом на -90, и длинный текст выходит
за верхнюю границу PaintBox, но над ним есть TButton, нажатием на который этот текст выводился, то текст продолжиться писаться по поверхности кнопки, буд-то она продолжение PaintBox
Автор: deks
Дата сообщения: 24.06.2013 10:41
Drionn

Данные на "каждый чих" перерисовывать не надо, надо кэшировать получающуюуся картинку, дополняя ее новыми данными.

А вы не пробовали взять готовый компонент с графиками? Типа _http://steema.com/teechart/vcl

Автор: Drionn
Дата сообщения: 24.06.2013 13:25
deks

Цитата:
Данные на "каждый чих" перерисовывать не надо, надо кэшировать получающуюуся картинку, дополняя ее новыми данными.

Как говорится - с этого места по подробней.
Чих у меня например - веду по графику визирку-курсор с окном типа THintWindow, в котором цифровые значения по линиям в текущем срезе. Так за этим расширенным курсором тянется вызов перерисовки всего окна графика. Идея была параллельно рисовать bitmap и с него восстанавливать след от наездов других окон. Чем-то кеш и есть. Ещё задумка - загружать свои Path в виде шейдеров.
Чуть помогло form1.FDoubleBuffered:=true;(vcl), но не так чтоб очень.


Цитата:
А вы не пробовали взять готовый компонент с графиками? Типа _http://steema.com/teechart/vcl

Нет, учитывая, что проекту более 15 лет, начинался с win311 and Delphi 2
Сейчас смотрю демы teechart. Впечатляет. Начинал б с нуля, то возможно купил бы.
Однако там ориентация на Презентацию, Диаграмму, Бизнес. А осуществить технический анализ, рассмотреть подробности графиков в сравнеии будет сложновато (хотя и можно). Не увидел ни одного примера с 4-6 осей по Y (которые кстати подписываются там не вертикально). Словом чарт он и есть чарт, а нужен специализированный промышленный graph. (оно уже есть, только перевожу с D7 на ЕХ4, впрочем уже перевел, а перевожу на FM с надеждой на красоту )

deks, Спасибо и Вам за потраченное время.
Автор: deks
Дата сообщения: 24.06.2013 14:40
Drionn

Ну у меня собственно и была мысль, что график можно рисовать в виде tiled bitmap. каждый tile представляет собой фрагмент графика. Текущие данные выводить в "текущий" tile. Можно запоминать "исходные" данные для графика, которые связаны с этим тайлом. Когда текущий тайл "кончается", создавать новый тайл. Все текущие тайлы (под viewport и немного вокруг) оставлять в кэше. Тайлы, которые "совсем старые" или далеко от viewport - можно из памяти складывать на диск. Сверху каждого тайла можно помнить координаты "ключевых" точек, по которым можно по клику вывести доп информацию или пояснения (hint). "Карту" ключевых точек можно также выгружать из активной памяти на диск в виде какого нибудь json/yaml/или кастомного stream. Аналогично "выгружаем" ненужные "исходные" данные.

Если меняете масштаб изображения, то пересоздаем тайлы в новом масштабе на основе сохраненных исходных данных.

Такая техника может быть гибко тюнингована для возможностей мобильного устройства (планшет) или десктопа. Для десктопа можно делать очень большой кэш, чтобы с диском не связываться.

Совет по поводу "выгрузки" кэша на диск - выгружайте тайлы не "один за одним", а пачками: так быстрее в среднем получается: диск таки пока еще инетрная штука, не у всех ssd!
Автор: sergionn
Дата сообщения: 24.06.2013 14:55
Drionn
В чем проблема то, тебе нужно положить на форму Timage, обработчики не создавать,
создать TextLayout:
pTextLayout := TTextLayout.Create(канва от TImage или без канвы);
pTextLayout.BeginUpdate;
pTextLayout.Text := 'dsdfsfdfd';
pTextLayout.HorizontalAlign := TTextAlign.taCenter;
pTextLayout.VerticalAlign := TTextAlign.taCenter;
pTextLayout.Font.Size := Self.Size;
pTextLayout.Font.Family := Self.Family;
pTextLayout.Font.Style := [];
pTextLayout.EndUpdate;

pTextLayout.RenderLayout(Канва) => также можно также отрисовать на заданной канве,
выводить в него текст, а на tbitmap рисовать когда нужно как показал.
Затем Image.Repaint - для обновления вручную.
Форма будет сама обновлять картинку на форме, а в битмап рисуй по мере необходимости.
Если есть проблемы с канвой попробуй режим gdi+:
в заглавном файле проекта *.dpr
добавь uses FMX.Types;
добавь FMX.Types.GlobalUseDirect2D := False;
перед Application.Initialize;
все должно работать без проблем........

да, шейдеры тут вообще не причем - это совсем другая песня.........
а path рисуй также в теле begin...endscene
Автор: delover
Дата сообщения: 24.06.2013 18:24

Рисовал весь вечер, старался, правда XE3, есть подозрения и XE4
[more]
Код: [no]
unit Unit2;

interface

uses
Намеспаце.Наусмотрение;

type
TForm2 = class(TForm)
Button1: TButton;
PaintBox1: TPaintBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

type
TCaptionRec = packed record
public
fCaption: string;
class operator Implicit(const AValue: string): TCaptionRec;
class operator Implicit(const AValue: TCaptionRec): string;
//1) class operator Implicit(const ALeft: TCaptionRec;
// const ARight: TControl): TControl;
//2) class operator Implicit(const ALeft: TCaptionRec): TControl;
class operator Add(const ALeft: TControl;
const ARight: TCaptionRec): TControl;
end;

{ TCaptionRec }

class operator TCaptionRec.Implicit(const AValue: string): TCaptionRec;
begin
Result.fCaption := AValue;
end;

class operator TCaptionRec.Implicit(const AValue: TCaptionRec): string;
begin
Result := AValue.fCaption;
end;

(* 1)
class operator TCaptionRec.Implicit(const ALeft: TCaptionRec;
const ARight: TControl): TControl;
begin
Result := ARight;
Result.SetTextBuf('dfsdfsdf');
end;*)

(* 2)
class operator TCaptionRec.Implicit(const ALeft: TCaptionRec): TControl;
begin
Result.SetTextBuf('sadsadasdasdsad');
end;*)

class operator TCaptionRec.Add(const ALeft: TControl;
const ARight: TCaptionRec): TControl;
var
w: WideString;
s: string;
begin
SetLength(w, 2000);
Result := ALeft;
Result.GetTextBuf(PWideChar(w), 1990);
SetLength(w, Length(PWideChar(w)));
s := w;
if s <> ARight.fCaption then
Result.SetTextBuf(PWideChar(s));
end;

procedure TForm2.Button1Click(Sender: TObject);
var
n: TCaptionRec;
begin
n := 'fdgdfgdfgdf';
ShowMessage(n);
n := 'Form2';
// 2) TControl(Self) := n;
// 3) Inc(TControl(Self), n);
TControl(Self) := TControl(Self) + n;
end;

end.
[/no]
Автор: Drionn
Дата сообщения: 25.06.2013 06:59
sergionn

Цитата:
создать TextLayout:

TTextLayout содержит абстрактный метод DoRenderLayout, поэтому pTextLayout.EndUpdate; вызывает ошибку.
К несчастью я таки не понял, чем отличается Ваш код от кода в штатной процедуре TCanvas.FillText...., кроме как в способе создании TextLayout.

Может кто-то объяснить? почему этот код:
procedure TForm1.Button3Click(Sender: TObject);
var ARect:TRectF;
begin
Image1.Bitmap.Create(Round(Image1.Width), Round(Image1.Height));
ARect.Create(10, 40, image1.Bitmap.Canvas.Width,image1.Bitmap.Canvas.Height);
image1.Bitmap.Canvas.BeginScene;
image1.Bitmap.Canvas.FillText( ARect, 'GFDSA', false, 0.2,    [TFillTextFlag.ftRightToLeft], TTextAlign.taTrailing, TTextAlign.taLeading );
image1.Bitmap.Canvas.EndScene;
end;

Визуальный результат на экране отличается от правильного:
{PB: TPaintBox;}
procedure TForm1.PBPaint(Sender: TObject; Canvas: TCanvas);
var ARect:TRectF;
begin
ARect.Create(10, 40, Canvas.Width,Canvas.Height);
Canvas.BeginScene;
Canvas.FillText( ARect, 'GFDSA', false, 0.2,    [TFillTextFlag.ftRightToLeft], TTextAlign.taTrailing, TTextAlign.taLeading );
Canvas.EndScene;
end;

Подозреваю, что дело в опциях фонта, но перепробовал все, как мне кажется, и безрезультатно.

deks
На самом деле вывод не так уж медлителен. Вполне устраивает скорость вывода просто bitmap целиком разрешения HD. А вот его прорисовка с вычислениями и масштабированием по 1 млн. точек на кривую (редко, но и такое бывает) существенный тормоз.
ЗЫ. Если кому интересно, то такой опыт: если перед тем как вывести точку проверить пиксель, в который будет вывод, и если он уже занят, то не выводить. Такая оптимизация, несмотря на дополнительные вычисления, дает прирост скорости в 5 раз (на моих данных).
Автор: delover
Дата сообщения: 25.06.2013 18:06

Цитата:
Рисовал весь вечер

Тото и оно Explicit не был использован в пользу примера, а не эффективного решения. Мысль сложная, даже для меня.

Добавлено:
Хочу выразить личное видение. Классовые операторы - это будущее. Это просто то что будет в каждой программе. А вот хелперы держатся не долго. Если начинать синтез операторов с ООП стоит попробовать сначала на хелперах. Для ООП достаточно что ООП незыблем.

Цитата:
чем отличается Ваш код

Не в мой пост, но ничем не отличается.

Добавлено:
Мне кажется это более интересно чем Ваша тема
http://forum.ru-board.com/topic.cgi?forum=33&topic=13743&start=20#lt
Автор: deks
Дата сообщения: 26.06.2013 09:39
delover

Я абсолютно точно уверен, что вас понимаю не вполне! )

"Кто ясно мыслит, тот ясно излагает" (ц)
Автор: delover
Дата сообщения: 26.06.2013 18:24
deks
Это да, иногда язык который проще русского сложнее чем разработка RAR и ZIP с нуля, выводы были в теме.

Добавлено:
Кзус. Вы там не читайте пожалуйста в теме. Для Вас пусто. Главное это очень хочется чтобы классовые операторы хэлперов были только в implementation.

Попробую объяснить.
myType := 'blabla'
Очень удобно, но это мой pas файлик. Что-то изменится - мой гемор, поправлю. А вот ктото будет чесать извилины, а почему в interface ошибка.
Автор: Drionn
Дата сообщения: 26.06.2013 19:35
deks
delover
Странно. Наверно мой немецкий ещё проще или там реальные практики или больше юзеров. На их форуме всё разрешилось. Мои вопросы закрылись там результативно.
Спасибо за желание помочь.
Автор: LGTeam
Дата сообщения: 26.06.2013 21:48
Drionn, расскажи к чему пришел
Автор: Frodo_Torbins
Дата сообщения: 27.06.2013 11:40
Drionn
Там однозначно больше пользователей айфонов и маков, а значит и тех, кто реально работал с FM тоже больше.

Страницы: 1234567891011121314151617181920212223242526

Предыдущая тема: cxDBPivotGrid выгрузка в excel


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.