уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

За последнее время в сообществе DelphiFeeds появилось сразу несколько блогов, касающихся непосредственно FireMonkey — это блоги разработчиков из Embarcadero: Евгения Крюкова, Сергея Рощина и Ярослава Бровина, а также совсем новый интересный блог под названием «FMX, Usability & Rad Studio IDE». Так что теперь полезной, интересной и, главное, свежей информации по FireMonkey должно быть предостаточно для того, чтобы начать разбираться с новой платформой и использовать её в своих проектах. Я же решил немного отвлечься от теории, касающейся FMX и разработать какой-нибудь небольшой проектик с использованием FireMonkey 2.0, а заодно и как-то оправдать название блога. Всё-таки в последнее время статьи, появляющиеся в блоге, к Web и Internet отношение имели очень мало. Вот и появилась идея написать небольшой клиент для DelphiFeeds.ru, который бы позволял получать информацию о новых публикациях в максимально короткий срок и позволять производить те же действия, что и на сайте, т.е. — голосовать за понравившиеся статьи. Ну, а что из этой затеи вышло — читайте далее :)

Интерфейс

В начале немного про интерфейс. Здесь я не стал изобретать ничего сверхъестественного и решил использовать в разработке премиум-стиль FMX 2.0., который шел в бонус-паке к Delphi XE3. Одновременно с этим я постарался сделать так, чтобы сама программа не была слишком «нагруженной»  всякими окошками, диалогами и т.д. В результате «DelphiFeeds Client» приобрел вот такой незамысловатый вид:

Интерфейс программы DelphiFeeds Client

Пр работе над программой пришлось попутно вникать в разработку компонентов для FireMonkey и написать свой небольшой компонент для рейтинга (на рисунке он находится в статусбаре), а в остальном — все обошлось использованием того, что предоставляет FMX «из коробки»: TGrid, TImage, TComboBox’ы и т.д.

Теперь посмотрим, что и зачем нужно в программе.

Обновление списка публикаций

Первая задача, которую надо было решить — это: как получать список публикаций на DelphiFeeds?  С одной стороны можно было не заморачиваясь просто «вытягивать» с сайта одну-две страницы, парсить их на предмет чего-либо необходимого и выводить результаты в таблицу. С другой — неплохо было бы иметь под рукой полный список публикаций, чтобы потом можно было, не напрягая сервер лишними запросами, организовать в программе, например, поиск публикаций или какие-либо другие манипуляции с данными, т.е. иметь небольшой задел на будущее (если оно посветит программе :)). Так как доступа к API сайта у меня не было, то в результате родилась такая схема работы с данными сайтов:

  1. Один раз программа проходит по всему сайту DelphiFeeds.ru и набирает базу публикаций. Всего, как Вы можете видеть на рисунке выше, на момент написания этой заметки в БД находилось 2159 публикаций. Эта база распространяется вместе с программой (не советую её терять и удалять :))
  2. При последующем обновлении списка публикаций парсер, в зависимости от Ваших настроек, скачивает с сайта от 1 до 5 страниц и сохраняет в БД только новые публикации.

Вот эта самая кнопка и используется для выполнения п.2 — скачивает 1-5 страниц и парсит с этих страничек публикации. Все новые публикации, как и положено, появятся в таблице в первых строках.

Кроме этого «DelphiFeeds Client» может обновлять список публикаций автоматически без Вашего участия. Время между авто-обновлениями можно установить в  интервале от 5 до 60 минут. Если в результате обновления окажется, что на DelphiFeeds появились новые публикации, то программа сообщит Вам об этом.

Обновление рейтинга записей

Так как программа позволяет голосовать за те или иные публикации, то хорошо было бы иметь под рукой всегда свежую информацию о рейтинге записей. Здесь, опять же был выбор: использовать уже имеющийся парсер страничек и вытаскивать с его помощью информацию по рейтингу записи, или же написать специальный класс для обновления рейтинга. Второй вариант оказался на порядок быстрее в работе. Как происходит обновление рейтинга.

Клик по этой кнопке запускает процесс обновления рейтинга записей, видимых в данный момент в таблице. При этом программа не скачивает ничего с сайта — только отправляет небольшой, буквально в пару десятков байт POST-запрос и получает примерно такой же по объему ответ сервера. Эта операция запускается пока только вручную. Ели потребуется, то сделать авто-обновление рейтинга можно будет без проблем.

Работа со списком публикаций

Как можно видеть на рисунке ниже, в списке публикаций отображается: статус публикации в базе данных, автор публикации, дата и заголовок:

Список публикаций

Чтобы  получить аннотацию к публикации, а также выполнить необходимые операции, например, проголосовать или изменить статус для статьи надо нажать «Enter» или, если выставлена соответствующая опция в настройках, сделать двойной клик мышкой по записи в таблице. В результате откроется панель с расширенным описанием публикации:

Расширенное описание публикации

Здесь Вы можете проголосовать за публикацию точно также как и на сайте DelphiFeeds.ru, перейти по прямой ссылке сразу на сайт автора и прочитать полный текст статьи или же изменить статус публикации. Кстати, заодно скажу пару слов и о том зачем потребовалось использование статуса. Полагаю, что все когда-либо встречали на DelphiFeeds записи, которые по тем или иным причинам, нам видеть бы совсем не хотелось. Ну, например,

Так как модерация записей на DelphiFeeds ведется вручную, то на удаление такой «левой» записи уйдет какое-то время. Другой пример — дублирование одних и тех же записей, скажем, первый вариант статьи — на русском языке, а второй — на английском. И, наконец, ссылки на несуществующие записи — опубликовал автор статью, парсер DelphiFeeds её «подхватил» вынес на главную страницу, а автор вдруг передумал и затёр запись в блоге — такое встречается редко, но тем не менее. Вот для того, чтобы такие записи можно было скрыть из списка, но, в случае необходимости, получить обратно и были введены два статуса для публикации — «Удалена» и «Опубликована». Записи со статусом «Удалена» никуда не деваются из БД, т.к. вполне возможно, что какие-то из этих записей могут пригодится в дальнейшем, например, теже английские варианты статей, но скрыть их из списка довольно просто — достаточно отжать кнопку «Показывать удаленные» и в списке останутся только  опубликованные публикации, а сам список примет вот такой простенький вид:

Настройки программы

Окно настроек программы имеет следующий вид:

Настройки программы

В принципе, пояснять здесь особенно и нечего :). В настройках Вы можете:

  1. Включить/отключить авто-обновление списка публикаций
  2. Настроить интервал времени между авто-обновлениями (5-60 минут)
  3. Настроить работу парсера публикаций, указав количество загружаемых за одну сессию страниц (1-5 страниц)
  4. Определить действие для двойного щелчка мыши по записи в списке. По умолчанию двойной щелчок открывает окно предпросмотра (расширенного описания) статьи, но Вы можете, например, настроить двойной щелчок для перехода на сайт автора.
  5. Сохранять настройки фильтра записей в таблице.

Справка по программе

Собственно, вся справка по программе уже расписана выше в статье :) В программе же я оставил только небольшую напоминалку по горячим клавишам, посмотреть которую можно в окне «О программе»:

Окно «О программе»

В этом окне также приведена информация об использованных технологиях, даны ссылки на сайты и т.д. В общем, стандартный набор информации.

Вот пожалуй и все, что пока могу сообщить о программе «DelphiFeeds Client«. Конечно, есть ещё куда двигаться, что добавлять, улучшать и т.д., но это уже другая история =) Пока же можете скачать архив, в котором Вы найдете готовую базу по статьям с DelphiFeeds.ru и сам exe-файл программы:

проект закрыт в связи с переездом DelphiFeeds на новый адрес

Книжная полка

Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
купить книгу delphi на ЛитРес
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
купить книгу delphi на ЛитРес
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
53 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
IL
IL
15/10/2012 10:44

Супер! Особенно понравился фильтр авторов. Но переход с одной строки на другую 1-2 секунды, почему так медленно? Может быть сделать настраиваемый вид и добавить панель чтения внизу, чтобы не надо было дважды кликать для чтения 2-3 строчек новости?

Всеволод Леонов

Крутатенюшка!
P.S. Вот ты где пропадал?!
P.P.S. Просто представить себе не могу, что будет после выхода Mobile Studio.

IL
IL
15/10/2012 13:38

Всегда пожалуйста! На другом компьютере, гораздо менее мощным, чем первый, и с встроенным видео Intel i865G, переход со строки на строку почти незаметен, хотя грид немного подтормаживает. Зато посмотрите, как выглядит окноcomment image Особенно надпись «Автор», не видны картинки на кнопках, вертикальная полоска чередующихся красных и зеленых пикселей слева, оставшаяся от левой же колонки при горизонтальном скроллинге. Даешь настройку шрифта, и хорошо быть иметь возможность ставить рейтинг статье прямо из клиента :)

Александр Божко

А чего тут скажешь? Круто!

Игорь
Игорь
17/10/2012 02:04

А чего без исходников? :( жалко?

Игорь
Игорь
17/10/2012 03:45

по-честному хотелось как раз этот стиль и поиметь (:
это будет наглость попросить у вас стили с бонус-пака?

Игорь
Игорь
17/10/2012 04:06

прошу тогда прощения…
кстати, не могли бы на будущее, пусть далекое, написать урок по работе с видео в FM?
всё чаще вижу связь FM с бизнес приложениями..
по мне — он очень хорош для мультимедийных приложений.
но никак не могу разобраться, как можно отрисовывать свою графику на видеокадрах..
типа Sample Grabber’a что-то бы такое..
да и звук взять.. добавив в функционал тот же эквалайзер да пару стандартных DSP эффектов — для разработчников, понимающих всю структуру, мелочь.., а для популярности FM большой плюс.. для VCL сторонних библиотек, примеров очень много.. на FM даже не знаю откуда подойти..

Георгий
Георгий
17/10/2012 21:02

Влад, это действительно очень нужная вещь!
Мне прям этого сильно не хватало, спасибо!

Влад, я бы ещё туда встроил
* сортировку
* «пользовательские флажки» (аналог многомерного избранного) как в мс аутлуке (типа оранжевые нужно проч., крас — интересная, …) и фильтрац.
* среднюю оценку(рейтиг)/кол. оценок в грид
* Ctrl+C в гриде

Иногда выпадает
Floating point division by zero.

-----
-----
17/10/2012 23:29

> P.P.S. Просто представить себе не могу, что будет после выхода Mobile Studio.

А что может быть? Если будет работать также медленно и криво, как это есть в XE2, то ничего хорошего не будет…

-----
-----
18/10/2012 12:03

Vlad, нехорошо удалять комментарии, даже если они вам не нравятся…
Прогиб не защитан :(

Всеволод Леонов

@——
>>А что может быть? Если будет работать также медленно и криво, как это есть в XE2, то ничего хорошего не будет…

Уважаемый, неосведомленность нужно скрывать. Хотите пообщаться — я тут.
Для начала расскажите, что у Вас работает медленно.

Георгий
Георгий
18/10/2012 17:12

Влад,походу на прорисовке.
Стабильно повторяется при сворачивание и разворачивание.

+ к хотелкам ))
* Поиск по like %…%

Игорь
Игорь
19/10/2012 04:53

сам клиент для DelphiFeeds — круть решение!
поковырявшись в FM понял, что очень ещё сырой..
отрисовка хрен поймешь — на одном ПК нормально, на другом полосы какие-то..
шапка того же окна настроек — вместо кнопки закрыть линия горизонтальная пока мышкой не наведешь.. как буд-то со стилями где то напутано..

попробывав графику в FM пришел в уныние.
даже взять простой вывод текста на битмапе.. тяжело что ли было прикрутить к FillText кроме сплошной кисти и другие (градиент, битмап…), ту же тень тяжело что ли было прилепить..?
вообщем пока он годится для домашних «бизнес» приложений..

Ярослав
Ярослав
19/10/2012 19:16

Игорь,
А в чем сложности отрисовки текста в TBitmap?

Берете канву для TBitmap (TBitmap.Canvas) и рисуете в свое удовольствие. Канва использует свои кисти (TCanvas.Fill, TCanvas.Stroke). Поэтому как вы кисть канвы настроите, так текст у вас и отрисуется.

RusMikle
RusMikle
19/10/2012 20:43

Доброгр время суток!
При попытке запуска проги вылетает сообщение о ошибке
«Exception EArgumentOutOfRangeException in module DFClient.exe at 00893F28.
Argument out of Range» и программа не открывается.
Походу выход за границы массива.
Win 7 x64 Pro German. На компе так же стоит лицензионный XE2 тоже немецкий.

С уважением Михаил.

Ярослав
Ярослав
19/10/2012 20:59

Vlad.
Хорошо. Нет проблем. Как будет время напишу статью про графику в FireMonkey :-)

Игорь
Игорь
20/10/2012 00:41

Ярослав, с удовольствием увидел бы пример отрисовки текста на битмапе использую допустим градиентную кисть.. логически должно быть так: var LRect: TRectF; begin LRect:= Image1.BoundsRect; Image1.Bitmap.Canvas.BeginScene; Image1.Bitmap.Canvas.Font.Family:=’Times New Roman’; Image1.Bitmap.Canvas.Font.Size:=50; Image1.Bitmap.Canvas.Fill.Kind := TBrushKind.bkGradient; Image1.Bitmap.Canvas.Fill.Gradient.Style:= TGradientStyle.gsLinear; Image1.Bitmap.Canvas.Fill.Gradient.StartPosition.X:= 0; Image1.Bitmap.Canvas.Fill.Gradient.StartPosition.Y:= 0; Image1.Bitmap.Canvas.Fill.Gradient.StopPosition.X:= 2; Image1.Bitmap.Canvas.Fill.Gradient.StopPosition.Y:= 2; Image1.Bitmap.Canvas.Fill.Gradient.Color := TAlphaColors.Red; Image1.Bitmap.Canvas.Fill.Gradient.Color1 := TAlphaColors.Gray; Image1.Bitmap.Canvas.FillText(LRect, ‘Delphi XE3 FM2’, false, 55, [], TTextAlign.taLeading, TTextAlign.taCenter); Image1.Bitmap.Canvas.EndScene; посмотрев FillText можно увидеть только Layout.Color := Self.Fill.Color; второй момент — есть свои алгоритмы обработки изображений.. как сейчас добраться до пикселей не понимаю.. хотя бы тот же ScanLine прикрутили бы.. видео взять.. для VideoCaptureDevice есть SampleBufferReady, а для плеера как добраться до… Подробнее »

Alexander
Alexander
21/10/2012 02:51

По записи и чтению пикселей нашел только этот пример: [code] var vBitMapData : TBitmapData; vPixelColor : TAlphaColor; // Note: FireMonkey colors are different from VCL TColor x,y : Integer; begin memo1.Lines.Clear; // dump bitmap pixels if image1.Bitmap.Map(TMapAccess.maRead, vBitMapData) then // lock bitmap and get pixels begin for y := 0 to trunc(image1.Bitmap.height)-1 do // loop through image lines begin Memo1.Lines.Add('======================'); memo1.Lines.Add('Line # ' + IntToStr(Y)); Memo1.Lines.Add('======================'); for x := 0 to trunc(image1.Bitmap.width)-1 do // loop through pixels on the line begin vPixelColor := vBitmapData.GetPixel(x,y); // get the pixel colour memo1.Lines.Add( // dump pixel info to screen 'line=' + IntToStr(Y) +… Подробнее »

Игорь
Игорь
21/10/2012 04:28

Alexander, спасибо!
я как раз дошел до FMX.PixelFormats
что-то радости не прибавилось (:

Ярослав
Ярослав
22/10/2012 15:37

Игорь, 1. Доступ к пикселям TBitmap: Прямого доступа к ScanLine нету. И на это есть причина. TBitmap, в отличии от VCL, кроссплатформенный и внутренне зависит от целевой платформы. Предоставление, по умолчанию, доступа к пикселям резко сказывается на производительности TBitmap. Поэтому прямого доступа нету. Однако, этот доступ можно получить/запросить, явно указав свое намерение на это (через TBitmap.Map). Пример Александра правдив. 2. Градиентная закраска текста: Опять же. Канва — кроссплатформенная. К сожалению, на маке нету быстрой функции рендеринга закраски текста градиентной кистью (для примера GDI+, DirectWriter предоставляет такую возможность). «Быстрой» — это значит прямой закраски, а не через вспомогательные способы: Получение Path… Подробнее »

Сергей Сидоров
Сергей Сидоров
24/10/2012 21:46

По поводу ошибки division by zero при использовании Premium style (jet.style). В Delphi XE3 создаём пустое приложение HD Firemonkey. Затем кидаем на форму stylebook и подцепляем вышеуказанный стиль (именно его). Теперь при сворачивании разворачивании окна формы будет выскакивать ошибка деления на ноль.

Krasnov Anatoly
Krasnov Anatoly
11/01/2013 17:08
Ответить на  Сергей Сидоров

Скорее всего у Вас видео карта Radeon. :) У меня такая же проблема, но если на другой видео карте или даже драйвере (на ноутбуке вторая карта Intel HD), то все нормально. Проблема пока не решается никак. У меня сначала были проблемы с отрисовкой DirectX 2D, после обновления драйвера карты — с отрисовкой DirectX 3D. Можно еще поиграть константами (запрет на аппаратную обработку directx и т.п.), но тогда ошибка уйдет, а отрсовка начнет глючить. Понятно, что это ошибка драйвера, но хотелось бы, чтобы она автоматически перехватывалась… В QC регистрировал, но ответ прост — обновите видеодрайвер. Оправданием служит только то, что «проект… Подробнее »

Krasnov Anatoly
Krasnov Anatoly
11/01/2013 18:52
Ответить на  Vlad

>>Короче идеал не достижим пока по любому :) Это я уже давно понял :) У меня на ноутбуке «идеал» только при работе с Intel HD. Про NVidia впервые от Вас услышал. У Radeon просто традиционно с драйверами были проблемы. Исходя из моего и, судя по всему, и Вашего опыта делаю неутешительный вывод о том, что проблема в самой FM, хотя Embarcadero того и не признает, отсылая к кривым драйверам. Точнее, скорее всего проблема в модулях, работающих с DX10. К сожалению их исходники закрыты и понять где именно падает невозможно. Но то, что там нет простейшей обработки исключений, мне очевидно. Access… Подробнее »

Krasnov Anatoly
Krasnov Anatoly
14/01/2013 13:20
Ответить на  Vlad
Георгий
Георгий
26/10/2012 16:00

По поводу division by zero, интересно, на 2-м компе попробовал всё отлично, причём всё летает (тормозов при прорисовке, и скролирование нету). На 1-м обновил дрова видюхи, и всё стало тоже летать, а вот division by zero осталась ))

Георгий
Георгий
26/10/2012 16:02

да на 1-м XP x32, на 2-м 7-ка x64

Георгий
Георгий
26/10/2012 16:03

наоборот

Сергей Сидоров
Сергей Сидоров
26/10/2012 19:54

Vlad, у меня эта ошибка на Win7 x64. А вообще это нездорово, когда работа бизнес приложений зависит от версии дров видеокарты. Нужна стабильность.

Сергей Сидоров
Сергей Сидоров
26/10/2012 22:18

Vlad
У меня ошибка проявляется всегда при сворачивании/разворачивании формы. На работе рядом ещё десяток компьютеров с разными ОС — попробую на них. На следующей неделе постараюсь преодолеть лень и отписать в Embarcadero Quality Central.

Сергей Сидоров
Сергей Сидоров
28/10/2012 16:50

Vlad. Да, проявляется при сворачивании/разворачивании формы. Код в пустой проект не добавлял.

Сергей Сидоров
Сергей Сидоров
29/10/2012 01:03

Vlad
Пробовал и другие, но проявляется только в Jet

RusMikle
RusMikle
29/10/2012 15:23

Vlad, да, ошибка вылетает до того как что либо становится видно.

Михаил
Михаил
29/10/2012 20:22

Доброго времени суток уважаемые Коллеги!
Наверное адресую вопрос прежде всего Ярославу, как одному из разработчиков FMX, но может быть кто-то сталкивался с аналогичной ситуацией:
В TCanvas отсутствует метод CopyRect, есть ли какой-нибудь обходной путь чтобы получить аналогичный результат?

trackback

[…] всё, что с этим связано. Во-первых, по поводу доработки клиента для DelphiFeeds.ru. Обновление в процессе, но в виду того, что работа […]

trackback
"Floating point divizion by zero" в Jet Style?!...Лови его!!!! | Delphi в Internet
23/11/2012 18:35

[…] несколько человек с тех самых пор, как я выложил первую версию клиента для DelphiFeeds.ru. Знаете, я бы никогда и ни за что не поверил в то, что […]