Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Embarcadero RAD Studio XE4

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

Открыть новую тему     Написать ответ в эту тему

valgreesh



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
deks

Цитата:
Особенно трогательно она смотрится на iOS, на котором COM нету!) Ну и на андроиде - будет самое к месту))  

Динамически подгружать библиотеки на этих платформах можно? Следовательно и применение интерфейсов в экспорте будет уместно. Загрузило приложение плагин, который в функцию инициализации получает интерфейс IApplication, а возвращает IPlugin. А дальше от этого плагина прилага может запросить интересующие её интерфейсы, а плагин от интерфейса приложения.
 

Цитата:
А если серьезно, то в свое время в Дельфи стоило ввести нормальный "внутренний" для Дельфи интерфейс, а для COM делать надстройку над этим механизмом

То есть для собственного велосипеда изобрести свой механизм запроса интерфейсов, свой механизм управления временем жизни (если без него, то потом хрен объяснишь почему после запроса "внутреннего" интерфейса объект продолжает жить своей жизнью, а после запроса COM-интерфейса управление временем жизни изменяется), а потом еще прикостылить поддержку COM... Лишняя путаница и ничего более. Зачем???  
 

Цитата:
Ну или такой штукой стоит озаботится прямо сейчас, в NextGen компиляторе

Ага, мало там сломать собираются, еще пусть и интерфейсы сломают... Вообще без юзеров останутся.
 

Цитата:
И да, текущий компилятор Дельфи мог бы ругнуться на отсутствие GUID у интерфейса, если этот интерфейс используется в "as". Я уж не говорю про "сгенерировать" гуид "под капотом", чтобы не грузить пользователя деталями реализации (к 18-й версии компилятора то!).

Мог бы. А еще лучше, если бы они кодогенерацию нормальную сделали, и компилятор не сыпал бы ICE'ами на дженериках.
 
Добавлено:
deks

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

Мне без надобности, а для форума не интересно. Смотри на TVirtualInterface. Механизм довольно простой - с методов снимаются сигнатуры, по этим сигнатурам создается виртуальный интерфейс который вызове методов делегирует к целевому объекту. Кто-то, кажется, в буржунете эту штуку даже делал.

Всего записей: 292 | Зарегистр. 30-11-2011 | Отправлено: 11:20 21-06-2013
deks



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
valgreesh
 

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

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

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

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

Всего записей: 857 | Зарегистр. 09-10-2003 | Отправлено: 12:01 21-06-2013 | Исправлено: deks, 12:07 21-06-2013
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 12:36 21-06-2013
valgreesh



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
deks

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

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

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

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

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

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

Код:
 
Duck<TAnyInterface>(Obj).SomeMethod();
 

 

Цитата:
П.С. Если в буржуйском инете кто то что то хорошее про интерфейсы написал, то это Nick Hodges

Нет, это был не Ходжес. Я нашел где видел что-то такое.

Всего записей: 292 | Зарегистр. 30-11-2011 | Отправлено: 12:37 21-06-2013
deks



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
valgreesh
 
Да, вот это уже оч похоже, спасибо))
 
http://arcana.sivv.com/blog/2012/2/17/duck-duck-delphi-release-3.html
 
Только там так:
Код:
 
obj.asA<ISomeInterface>.SomeMethod();


Всего записей: 857 | Зарегистр. 09-10-2003 | Отправлено: 13:54 21-06-2013 | Исправлено: deks, 13:55 21-06-2013
Drionn

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи, конечно Ваша дискуссия увлекательна, но кто может прояснить разницу:
Два компонента на форме 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. Извиняйте, пример не могу выложить, тут на форуме нельзя аттач файлы

Всего записей: 11 | Зарегистр. 18-12-2009 | Отправлено: 14:51 21-06-2013
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

Цитата:
Ещё. Как делать Repaint формы или PaintBox без скрытия/раскрытия руками?
А у них разве нету соответствующего метода? В VCL он так и называется - Repaint.

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 16:00 21-06-2013
Drionn

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
"Нормальное поведение для TImage, ведь он не предназначен для рисования."
Ну, да. А как тогда рисовать? В ex4 и на чём (я графики хочу)?
Только этот компонент тут держит repaint. Остальные его не имеют (как я пока понимаю и успел поюзать чего) и довольствуются onpaint, который программно не вызывается с эффектом исполнения.
У меня версия с рутраккерорг сампонмаиете.

Всего записей: 11 | Зарегистр. 18-12-2009 | Отправлено: 16:51 21-06-2013
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Drionn

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

TPaintBox обычно юзают для этого или TPanel .... кому как.

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 18:06 21-06-2013
deks



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Drionn
 
_http://docwiki.embarcadero.com/Libraries/XE4/en/FMX.Controls.TControl.PaintTo
 
Не оно?

Всего записей: 857 | Зарегистр. 09-10-2003 | Отправлено: 18:29 21-06-2013
Drionn

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не могу повторный тест с TPanel. Выходной, а дома ех4 нет. Но полууверен, что в нём нет repaint or refresh. И нет возможности вызвать онпаинт с ожидаемым результатом. В лоб, понятно, ничего не выводится.

Всего записей: 11 | Зарегистр. 18-12-2009 | Отправлено: 18:30 21-06-2013
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Drionn

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

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

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

Методы Refresh и Repaint у TPanel, разумеется, есть. Куда без них, а вот OnPaint события нет.

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 18:38 21-06-2013
Drionn

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
deks
 
Благодарю.
 
Оно, да оно, вероятно оно. Замыленный глаз видал его. Буду пытать его.
Однако не объясняет поведение ....bitmap.canvas. .....
 
Боль головы, а ещё нужно ето на плоттер. Ранее я рисовал на канве монитора, а для вывода 1:1 на канве printer.  
 
Удачных и счастливых всем выходных.  
 
Добавлено:
Eternal_Shield
 
Я уж в растерянности. TPaintBox уже пытал. И нет там Repaint!
Вероятно пятница. Мозги пухнут +32, а вечер.
 
Замутил я Вас. За мной долг за Ваше внимание, отпишусь по результатам в конце пн..
 

Всего записей: 11 | Зарегистр. 18-12-2009 | Отправлено: 18:45 21-06-2013
sergionn

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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, но в первом случае изображение всегда будет перерисовываться если будут внешние воздейтвия т.е. всегда актуально

Всего записей: 472 | Зарегистр. 02-11-2011 | Отправлено: 20:01 21-06-2013 | Исправлено: sergionn, 20:20 21-06-2013
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 07:41 22-06-2013 | Исправлено: delover, 12:12 24-06-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

 
Это неудобно, конечно... Но вот представим у нас есть типы (с неявным преобразованием)
T1 -> TA -> T2 и T1 -> TB -> T2
Причем, преобразования через TA и TB работают заметно по разному.
 
И вот мы где-то сделали "по простому" var:T2 := expression:T1;
 
И вот в зависимости от очередности модулей в uses, наличия свежих dcu, фазы луны и еще бог весть чего эта строчка в одних местах программы будет трактоваться так, а в других - иначе. Как-то это настораживает...
 
тоже, кстати, проклятый ромб напоминает
 

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

Наследуется поведение. У интерфейса поведения нет.

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 17:40 22-06-2013 | Исправлено: Arioch1, 17:41 22-06-2013
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нет, в смысле да, такое часто. Например, если бы изначально ставилась задача писать IFileList, возможно всё бы получилось минуя преобразования. Зачастую необходимость выделить интерфейс возникает позже, хотя мне понятно почему IFileList удобнее без IFileListItem, кажется он удобнее даже без методов IList.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 23:15 22-06-2013 | Исправлено: delover, 10:08 23-06-2013
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нашёл пример, где от списка файлов надо было только IsMask.

Код:
 
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

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 11:06 23-06-2013
Drionn

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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

Всего записей: 11 | Зарегистр. 18-12-2009 | Отправлено: 10:03 24-06-2013
deks



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Drionn
 
Данные на "каждый чих" перерисовывать не надо, надо кэшировать получающуюуся картинку, дополняя ее новыми данными.
 
А вы не пробовали взять готовый компонент с графиками? Типа _http://steema.com/teechart/vcl
 

Всего записей: 857 | Зарегистр. 09-10-2003 | Отправлено: 11:41 24-06-2013
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Embarcadero RAD Studio XE4


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru