Delphi 2010

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

Архивы

Рубрики

Реклама

Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Embarcadero

 


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

О строках в мобильных приложениях уже писали, и, наверное не раз, но как-то все-равно осталось не замеченным. По крайней мере я почему-то не принял к сведению, хотя задним числом и вспомнил, что читал. Поэтому “пост-напоминалка”.

Предположим, есть есть FireMonkey приложение и такой код:

procedure TfMainTexturesTest.Button1Click(Sender: TObject);
var
s: string;
begin
   s:= 'Нет войне! Даешь рок-н-ролл!';
   ShowMessage(s[1]+' '+s[5]+' '+s[12]);
end;

При запуске в Windows результат будет очевидным:

StringTestWin

Попробуем запустить приложение под Android:

StringTestDroid

Очевидно, что в первом случае индексация символов в строке начинается с 1, а во втором с нуля. Сделано так не случайно, этимология данного вопроса рассмотрена в блоге у Александра Алексеева. Настоятельно рекомендую к прочтению.

И в заключение о совместимости кода. Директива компилятора $ZEROBASEDSTRINGS.

Если мы, к примеру принудительно поставим

{ZEROBASEDSTRINGS ON},

то и Windows и Android приложения отработают так. как показано на втором рисунке.

Так что. будьте бдительны, данный нюанс нужно учитывать. во избежание ошибок.

PS

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


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Embarcadero

Rodrigo Ruz

Marco Cantu

Bruce McGee

Jeroen Pluimers

The Programming Works

 

Семен Хмелёв

Роман.Янковский

Владислав Баженов

 


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Одним из самых значимых и интересных новшеств в XE7, безусловно, стал новый дизайнер форм FireUI Multi-Device Designer. Для того, что бы понять зачем он нужен и в чем заключается его ценность, нужно просто написать хотя бы одно Android приложение в XE5 или XE6, а затем запустить его на устройстве с другим формфактором. Вы сразу же поймете, что по сути, вы не сделали ничего и вам нужно “работать над интерфейсом”. В подобную ситуацию я попал, создавая свое первое рабочее Android приложение. Отлаживал я его на планшете 7″, а демонстрировал на телефоне. Соответственно, и у меня и у приложения был весьма блеклый вид. А “работа над интерфейсом” вылилась не только в перетаскивание контролов, изменение их размеров и свойств. Пришлось писать код, высчитывать нужное положение и размеры элементов управления, в зависимости от размеров формы. Занятие трудоемкое. К тому же тестировать результаты приходилось на эмуляторе, что тоже добавляло сложностей.

В XE7 все изменилось радикальным образом. Если в двух словах, то теперь для каждого формфактора можно создать отдельный, наследуемый от основной формы, экземпляр формы. Боле того, учитывается не только размер экрана, но и платформа. Таким образом, если раньше мы говорили о единой кодовой базе для разных приложений, то теперь мы можем говорить об одном приложении для разных платформ. Все, что нам нужно – создать для каждой из форм набор представлений, позволяющий правильно отобразить форму на различных устройствах. При этом все это делается с помощью обычного интерфейса редактирования форм.

FireUI

Давайте посмотрим, как же это выглядит на практике. Я не стану изобретать какие-то демонстрационные примеры, а попытаюсь показать все на примере рабочего (точнее разрабатываемого) приложения. Итак у нас есть некоторая форма. Изначально у нас выбрано представление Main. Читать далее


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

David I

OTAPI (SAimon Stewart) 

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

 Stefan Glienke

Marjan Venema

 Jeroen W. Pluimers

Александр Люлин

DevArt


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Одним из новшеств FireMonkey в XE7 стал компонент TMultiView. По сути это некая панель, которая может вести себя по разному, в зависимости от устройства, на котором запускается приложение. Она может “всплывать, “выпадать”, оставаться закрепленной и т.д. В мобильных приложениях такие панели практически повсеместно используются для организации представления Master-Details, поэтому такой компонент был, что называется, необходим. До выхода XE7 я видел как минимум три реализации чего-то подобного, хотя и менее универсального.

Вчера в процессе перевода своего рабочего приложения на XE7, я попытался разобраться с этим компонентом. Для того, что бы понять как он работает лучше всего создать новое Multi-Device приложение и использовать шаблон Master-Detail.

NewMultiDeviceApplication

В XE7 данный шаблон уже содержит предварительно настроенный экземпляр данного компонента, расположенный слева на форме. TMultiView имеет несколько ключевых свойств, определяющих его поведение. Прежде всего, это свойство Mode.

    property Mode: TMultiViewMode read FMode write SetMode default TMultiViewMode.PlatformBehaviour;

 Именно это свойство определяет поведение компонента – будет ли это обычная панель, либо она будет выезжающей или выпадающей. Свойство может принимать следующие значения:

TMultiViewMode = (PlatformBehaviour, Panel, Popover, Drawer, Custom);

По умолчанию значение PlatformBehaviour, т. е. его поведение определяется платформой. Что бы понять как будет вести себя компонент при изменении значения этого свойства, вы можете сделать небольшой эксперимент. Поместите на форму компонент TComboBox (я предварительно удалил в шаблонном приложении все контролы, предназначенные для отображения данных). Свойство Items определите следующим образом:

PlatformBehaviour

Panel

Popover

Drawer

Custom

Задайте следующий обработчик события OnChange:

MultiView1.Mode:= TMultiViewMode(cbMode.ItemIndex);

Теперь при выборе элемента выпадающего списка будет меняться значение свойства Mode. Под Windows компонент может выглядеть так:

MultiViewProper

Или так (панель “выезжает”):

MultiViewDrawer

Свойство компонента MasterButton указывает на тот компонент, который будет инициировать появление или скрытие панели. Вы можете так же указать значение свойства TargetControl. Это может быть панель или другой компонент контейнер. Так или иначе, состояние MultiView будет отражаться на свойствах компонента, выбранного в качестве TargetControl. На приведенных ниже рисунках видно как изменяется TargetControl при выпадании панели компонента MultiView. За изменение цвета отвечает свойство ShadowOptions.

MultiViewTargetControl2

MultiViewTargetControl1

Собственно, ничего особо сложного в использовании компонента нет. К тому же, в комплекте Delphi XE7 поставляется демонстрационный пример.

 


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Embarcadero

 

Marco Cantu

Malcolm Groves

David I

Tim Del Chiaro

Sarina Dupont

Malcolm Groves

Nick Hodges

Jeroen Pluimers

Daniele Teti

Vincent Parrett

Nick Hodges

 

 EurikaLog

DevArt

 

Александр Люлин

Андрей Терехов

Николай Зверев

 


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Листаю свежекупленную книгу Даниеля Тети (Daniele Teti) Delphi Cookbook. По нашим временам, любая книга по Delphi, уже событие. Если же она не переписана с ранее издававшихся, то это вообще шикарно. А в данном случае ко всему этому добавляется то, что по сути, книга посвящена новинкам Delphi. То есть, большая часть кода, приведенного в книге не заработает не то, что на Delphi 7, но и на Delphi XE. Хотя речь идет не только о FireMonkey, которая появилась в XE2, но и новинках языка. Судя по эволюции обложек, автор начал работу над книгой, когда актуальной версией Delphi была ещеXE5. Конечно, сейчас писать книгу  о FireMonkey – задача не для слабых духом. Платформа существенно обновляется не только с каждым новым релизом, но даже при выпуске апдейтов. Понятно, что новинки XE7 в книгу не попали. Тем не менее, интересного в книге хватает.

Содержание вы можете посмотреть в блоге автора.

К книге, естественно, прилагается архив с примерами.

По своей структуре книга является сборником рецептов, о чем, собственно, и свидетельствует ее название. 50 отдельных примеров объедены по тематике в 7 глав. К слову, мне подобный формат книг нравится. Хорошо описанные примеры. пожалуй самое эффективно средство в освоении новшеств, на отсутствие которых пользователям Delphi жаловаться в последнее время не приходится.

Еще один плюс, по крайней мере для меня, это не сложный английский. Автор книги, судя по всему, итальянец, и английский для него не родной язык. А следовательно, ломать голову над словесными изысками не нужно.

Цена pdf версии более чем демократична – $10. Даже по меркам местных магазинов, в частности ЛитРез, цена вполне демократичная. Моё мнение – книга вполне достойна того, что бы занять место на книжной полке где-нибудь в папке Actual Books.

Купить книгу вы можете здесь.

В заключение воспользуюсь случаем и напомню, что до 30-го сентября вы можете воспользоваться 10%-ой скидкой при покупке Delphi.


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Технология App Tethering появилась еще в прошлой версии Delphi. И рассказать о ней я собирался еще после выхода XE6, однако, как это часто бывает “не дошли руки”. Этот механизм предназначен для взаимодействия приложений на разных устройствах. Примечательно, что он поддерживается как в VCL, так и в FireMonkey. В XE7 в App Tethering были добавлены новые возможности, что для меня стало очередным поводом разобраться и сделать пару примеров. Обдумывать идеи для тестового приложения долго не пришлось. Так получилось, что сейчас у меня на рабочем столе  стоит два ПК и, время от времени появляется планшет и смартфон (оба под управлением Android). Работаю я с этими устройствами практически одинаково интенсивно и, соответственно, возникает необходимость оперативно обмениваться не только файлами, но и текстовыми фрагментами, ссылками и т. д.. Конечно, существуют сотни программ, решающих это задачу, но коль скоро у нас имеется инструмент, то грех не написать собственное приложение, реализующее данный функционал.

В идеале мне бы хотелось бы создать некоторое приложение, работающее как под Windows, так и под Android, которое позволяло бы:

  • осуществлять обмен файлами между устройствами;
  • осуществлять обмен содержимым буфера обмена.

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

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

Разработку начнем с реализации простейшего функцонала – обмена файлами между ПК. Для того, что бы упростить понимание принципов работы App Tethering создадим два приложения – приложение, передающее файлы (“передатчик”) и приложение, принимающее файлы (“приемник”). Во избежание путанницы я сознательно не стану использовать термины “клиент”, “сервер” и т.д. “Передатчик” реализуем на VCL, а “приемник” – на FireMonkey. Опять же все это из соображений наглядности. В идеале это должно быть одно мультиплатформенное приложение, совмещающее в себе функции приема и передачи файлов. К этому вопросу, надеюсь, мы вернемся чуть позже.

Итак создадим два приложения,VCL и FireMonkey(Multi-device application), назовем их PrjSender и PrjReceiver и объеденим их в одной группе проектов. Механизм App Tethering в Delphi реализуют всего два компонента TTetheringManager и TTetheringAppProfile  (менеджер и профиль). Размещаем их на главной (и пока единственной) форме обоих приложений. В обоих случаях для TetheringAppProfile устанавливаем значение свойства TetheringManager – TetheringManager1, таким образом связываем менеджер с профилем.

Для чего нужны эти компоненты? Документация гласит следующее:

Менеджер может обнаруживать и попарно связываться с другими менеджерами, представляющие удаленные профили, которые могут “расшаривать” данные для зарегистрированных профилей вашего менеджера. Менеджер может быть связан с одним или несколькими профилями. Основные функции менеджера:

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

Все это звучит немного сумбурно, но попробуем разобраться во всем на практике. Прежде всего, нам нужно обеспечить соединение между двумя приложениями. В верхней части главной формы приложения-приемника разместим компонент ListBox (lbSenders) и кнопку (btnGetAvailableSenders). По нажатию на кнопку отобразим список доступных удаленных менеджеров. Для этого определим обработчик события OnEndManagersDiscovery следующим образом:

procedure TfRecMain.TetheringManager1EndManagersDiscovery(const Sender: TObject;
  const ARemoteManagers: TTetheringManagerInfoList);
var
  I: Integer;
begin
 lbSenders.Clear;

 for I := 0 to aRemoteManagers.Count - 1 do
 begin
  lbSenders.Items.Add(ARemoteManagers[i].ManagerText);
 end;

end;

А по нажатию на кнопку вызовем метод DiscoverManagers компонента TetheringManager.

procedure TfRecMain.btnGetavailableSendersClick(Sender: TObject);
var
i: integer;
begin
  for I := TetheringManager1.PairedManagers.Count - 1 downto 0 do
    TetheringManager1.UnPairManager(TetheringManager1.PairedManagers[I]);

  lbSenders.Clear;
  TetheringManager1.DiscoverManagers;

end;

Предварительно здесь мы очищаем список и разрываем все связи (метод UnPairManager). Читать далее


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Jim McKeeth

Marco Cantu


David I

Sarina Dupont

DevArt

ModelMaker Tools

 Роман Янковский

Николай Зверев

Владимир Тимофеев

 


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Реклама

Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика