Перейти к содержанию
  • Регистрация

Евгений Корепов

Пользователи
  • Публикаций

    624
  • Зарегистрирован

  • Посещение

  • Победитель дней

    68

Весь контент Евгений Корепов

  1. Поддержал ваш блог небольшой суммой. В наше время текстовый, русскоязычный блог посвященный Delphi редкость, в основном все перешли на видео блоги. А время смотреть полуторачасовое видео для получения информации умещающейся в паре предложений есть не у каждого ;-)
  2. Нет, вставлять надо именно Идентификатор отправителя. На кой они его обзывают то API ключем, то API FCM. Кнопка в диалоговом окне у них "Связать" или "Ок" или "Подключить", зависит он настроения переводчика. Все вставилось, связалось и подключилось. Просто с точки зрения гугля, открытое бета-тестирование - не повод для тестирования GCM, теперь уже FCM.
  3. Спасибо вам за отличные статьи! Не планируете создать статью о Firebase, в частности о консоли Firebase? Самостоятельно не получается разобраться, по какой то причине консоль уже наполнена проектами, в проектах по несколько приложений, одно и тоже приложение дублируется в трех местах. Что за проект "Google Play Android Developer" и чем он отличается от остального мусора в этой консоли.
  4. Это тот что в файле google-services.json ? "api_key": [ { "current_key": "AIza******7I" } При попытке вставить это получаю Неверный ключ FСМ API (Отправитель не зарегистрирован).
  5. Что то я совсем туплю. Не могу подключить идентификатор отправителя к проекту в Google Developer Console. В console.firebase.google.com создаю проект, в cloudmessaging вижу "Идентификатор отправителя", но при копировании его в консоль разработчика мне говорит Неверный ключ FСМ API (Неверный ключ). Проект правда в открытом бета-тестировании, может из за этого? Раньше была эта процедура через жопу, но зато работала, теперь вроде попытались сделать красиво, но видимо у меня ума не хватает. P.S. Как заставить работать консоль разработчика на английском языке? А то консоль на русском, факи и помощь большей частью на английском, даже в терминологии название пунктов меню консоли полная каша, как будто на русский переводят пол сотни переводчиков, каждый по одному предложению и у каждого свое видение мира...
  6. Тут главное не забыть RadioButton1.GroupName:='SelectDestiny' и так для всех RadioButton одинаковый GroupName, тогда выбираться будет только один. procedure TFormMain.CreateOpenComboEdit; Const GroupName = 'Select destiny'; Var I : Integer; ALisBoxItem : TListBoxItem; ARadioButton : TRadioButton; begin for I := 0 to 5 do begin ALisBoxItem:=TListBoxItem.Create(ListBox); ALisBoxItem.Text:=''; ARadioButton:=TRadioButton.Create(ALisBoxItem); ARadioButton.GroupName:=GroupName; ARadioButton.Text:=GroupName+' '+I.ToString; ARadioButton.Align:=TAlignLayout.Client; ALisBoxItem.AddObject(ARadioButton); ListBox.AddObject(ALisBoxItem); end; end;
  7. Попробуйте проверить отладкой какой размер шрифта попадает в GetTextHeight. Потому что по умолчанию размер 12, а в стиле размер может быть 18. Так же вы не выполняете ListView.ApplyStyleLookup после заполнения ListView. Очень рекомендую перед заполнением ListView выполнять код AListView.BeginUpdate; AListView.OnUpdateObjects:=Nil; После заполнения: AListView.EndUpdate; ListViewUpdateAll(AListView); // В цикле применяет ListViewUpdateObjects ко всем элементам AListView.ApplyStyleLookup; AListView.OnUpdateObjects:= ListViewUpdateObjects;
  8. У кого есть опыт монетизации приложений для Windows? Есть ли какие нибудь сервисы по размещению рекламы в таких приложениях?
  9. В первом сообщении этой темы есть ссылка на обсуждаемый здесь компонент TKRBarCodeSanner.zip, у этого компонента есть событие TKRBarCodeScannerScanResult(Sender: TObject; AResult: string), ну и AResult - это то где находится результат сканирования.
  10. Если не получается сразу определить источник ошибок, я публикую для бетатестеров новую версию приложения, где FAppStage прописана более подробно - начало конец вызова каждой подозрительной функции или кода.
  11. Я использую дополнительный модуль с отдельным потоком отправляющий все что надо на мой сервер. На сервере кусок кода на php все это пишет в лог. В основном коде использую глобальную переменную FAppStage : procedure TFormMain.ServiceConnectionOnChange(Sender: TObject; AChange: TPushService.TChanges); begin FAppStage:='ServiceConnectionOnChange start'; if AChange=[TPushService.TChange.DeviceToken] Then GetHTTP(CommandActions, -1, ''); FAppStage:='ServiceConnectionOnChange stop'; end; В проекте лежит TfgApplicationEvents, в нужных событиях, к примеру fgApplicationEventsException, идет отправка FAppStage и E: Exception. В логе я вижу где и какое исключение произошло. Достаточно удобно мне кажется.
  12. Я использую как разминающее мозги хобби, в свободное от работы время. Доход от приложений - приятное дополнение. До основного иструмента Delphi пока не дотягивает - нет компилятора под Linux, основную рабочую лошадку 90% предприятий в моей отрасли (ISP).
  13. При публикации нового приложения я обнаружил исчезновение Google Cloud Messaging из консоли разработчика, теперь вместо него Firebase Cloud Messaging. Как я понимаю возможность push сообщений для Delphi закончилась? Или как то можно прикрутить FCM к проекту на Delphi?
  14. Полностью согласен. Ширину я устанавливаю в ListViewActionsUpdateObjects, и только после этого вызываю функцию.
  15. Почитал, посмотрел все варианты и сделал работу над ошибками. Переделал свой, показанный выше, код. Проверил на Windows и Android, с стилем по умолчанию и другими стилями - работает безупречно. Так же не нуждается в подгонках типа "Height:= Round(t) + 30;". Преимущество кода в том что на вход подаем ATextObject : TListItemText, т.е. можно легко использовать для вычисления Text или Detail. function TFormMain.CalculateListItemObjectHeight(ATextObject : TListItemText) : Single; begin FTextLayout.BeginUpdate; try FTextLayout.Text:=ATextObject.Text; FTextLayout.MaxSize:=TPointF.Create(ATextObject.Width, TTextLayout.MaxLayoutSize.Y); FTextLayout.Font.Assign(ATextObject.Font); FTextLayout.WordWrap:=ATextObject.WordWrap; FTextLayout.Trimming:=ATextObject.Trimming; FTextLayout.HorizontalAlign:=ATextObject.TextAlign; FTextLayout.VerticalAlign:=ATextObject.TextVertAlign; finally FTextLayout.EndUpdate; end; Result:=FTextLayout.Height; end; Пример использования: у меня Text непредсказуемой длины, вверху ListItem, по всей ширине ListItem. Под Text располагаются слева Image, справа Detail. Текст Detail может быть от пары слов, до нескольких предложений procedure TFormMain.ListViewActionsUpdateObjects(const Sender: TObject; const AItem: TListViewItem); Var AItemTextHeight, AItemDetailHeight, AItemImageHeight, AItemHeight : Single; AListView: TListView; begin AListView:=TListView(Sender); AItem.Objects.TextObject.Width:=AListView.Width - AListView.ItemSpaces.Left - // Вычисляем ширину Text AListView.ItemSpaces.Right - DefaultScrollBarWidth; AItemTextHeight:=CalculateListItemObjectHeight(AItem.Objects.TextObject); // Вычисляем высоту Text AItem.Objects.DetailObject.PlaceOffset.Y:=AItemTextHeight; // Устанавливаем смещение для Detail AItem.Objects.ImageObject.PlaceOffset.Y:=AItemTextHeight; // Устанавливаем смещение для Image AItemDetailHeight:=CalculateListItemObjectHeight(AItem.Objects.DetailObject); // Вычисляем высоту Text AItemImageHeight:=AItem.Objects.ImageObject.Height; AItem.Objects.DetailObject.Height:=AItemImageHeight; AItemHeight:=AItemTextHeight + Max(AItemDetailHeight, AItemImageHeight); // Вычисляем высоту всего Item AItem.Height:=Round(AItemHeight); end;
  16. Для десктопа уже 15 лет пользуюсь EhLib. Вот там гриды, так гриды. Вот купила бы их эмбаркадера и включила в Дельфи, было бы хорошо. Для осознания их недосягаемой крутизны достаточно посмотреть скриншоты компонентов http://www.ehlib.com/ru/skrinshoty
  17. Вот посмотрите, просто и красиво TSimpleDNSServer http://www.delphipraxis.net/87433-dns-server-mit-indys-tiddnsserver-%3D-verwirrung.html
  18. У меня не заработал на XE8 к сожалению код. Но принцип тот же самый, разве что не совсем понятно что за "m" // Get layout height Result := Round(Layout.Height); // Add one em to the height Layout.Text := 'm'; Result := Result + Round(Layout.Height); Заметил странность, если установить размер шрифта отличный от стандартного, к примеру 11,99 или 12,01, то все начинает нормально работать, текст влазит. Но размер шрифта на экране в полтора раза меньше "стандартного". Не знаю какой стандартный, но точно не 12, больше похож на 14 или 15. Может из за этого и косяк? В недрах FMX расчет ведется с "стандартным" шрифтом 12, а на экране отрисовывается гораздо более крупным.
  19. Подтверждаю что на андроиде этот код косячит, выдает высоту процентов на 10-15 меньше нужной. Осталось разобраться почему в других моих проектах все работает нормально. Может действительно из за большого текста с сплошными строками накапливается ошибка? P.S. Заменил текст на кусок из книги, та же самая фигня, обрезает снизу.
  20. А с каким именно прибором вы хотите установить связь? С их роутером VR-006 или с преобразователями интерфейсов VR-001-5 ? Роутер, как я понял настраивается как прозрачный шлюз на преобразователи интерфейсов? Тупо пересылает пакеты, а преобразователи интерфейсов пересылают обратно? Если все так, то протокол TCP/IP. Компонет TIdTCPClient, а лучше TIdTCPServer. Если вы умеете общаться с счетчиком по USB, то есть вариант проще - найдите дешевый телефон с поддержкой OTG (можно найти за тысячи полторы), китайский OTG переходник с подзарядкой и втыкайте USB преобразователя интерфейса (или счетчика, если есть такие) прямо в смартфон. На телефоне пишите приложение, которое будет работать с счетчиком по USB, а отдавать данные как вам удобнее, от смс и email, до http сервера и push сообщения. Весь этот колхоз будет раза в три дешевле колхоза с приведенного вами сайта. Хотя на сайте штуки прикольные, подумаю о покупке некоторых изделий.
  21. Для начал у вас не правильно работает function ReplaceSpecSymbol, она оставляет спецсимволы в конце строки. Вот накидал правильно работающую: function ReplaceSpecSymbol(S: String): String; var Count : Integer; begin Count:=0; Result:=''; while True do begin Count:=Ord(S.Chars[0]); Result:=Result+S.Substring(1,Count)+'.'; S:=S.Remove(0,Count+1); if Ord(S.Chars[0])=0 Then break; end; Result:=Result.TrimRight(['.']); end; После этого в вашем проекте нормально все ресолвится, но что отсылать в ответ на lookup я не имею представления. Не знаю как заставить IdDNSResolver отдать данные в сыром формате, надо искать и читать документацию. Вот код процедуры, но надо разобраться что слать: procedure TMainForm.IdUDPServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); var S, Domain: String; I : Integer; ABuffer : TIdBytes; begin S:=ReplaceSpecSymbol(BytesToString(AData,12)); Memo_Log.Lines.Add(S); if Pos('in-addr.arpa',S)=0 then begin IdDNSResolver.Resolve(S); for I := 0 to IdDNSResolver.QueryResult.Count-1 do if IdDNSResolver.QueryResult[I].RecType = qtA then begin S:=TARecord(IdDNSResolver.QueryResult[I]).IPAddress; Memo_Log.Lines.Add('IdDNSResolver: '+S); end; // Вот дальше не знаю что именно пересылать // ABuffer:=DNSHeader.GenerateBinaryHeader; // ABuffer:=IdDNSResolver.PlainTextResult; // ABuffer:=ABuffer+IdDNSResolver.InternalQuery; // ABuffer:=IdDNSResolver.InternalQuery; ABinding.Send(ABuffer); end; Вы можете поразбираться с помощью простейшего DNS прокси, по крайней мере будете видеть что идет в запросе и что в ответе. Код ниже, только пропишите глобальную переменную ALocalPort : Integer, для запоминания забинденного порта на 127.0.0.1 procedure TMainForm.IdUDPServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); Const ExternalDNSHost = '8.8.8.8'; LocalHost = '127.0.0.1'; begin if ABinding.PeerIP.Equals(LocalHost) then // если запрос с локального, пересылаем на внешний dns begin ALocalPort:=ABinding.PeerPort; IdUDPServer.SendBuffer(ExternalDNSHost,53,AData); end; if ABinding.PeerIP.Equals(ExternalDNSHost) then // если с внешнего, пересылаем на локальный IdUDPServer.SendBuffer(LocalHost,ALocalPort,AData); exit; end; в коммандной строке используйте "nslookup -retry=1 -timeout=30 google.ru 127.0.0.1 " (один повтор запроса, чтоб не засирать отладку и таймаут сколько нужно секунд, что не отвалился запрос пока будете разбираться)
  22. Так весь проект целиков и выложил. В форме только апперанс у ListView выставил в Custom. А куда дели Parent? Это важное свойство хранящее родителя. Может как то переименовали? P.S. Вы можете AListView заменить за свой конкретный ListView, доступ через парент сделал для красоты и универсальности, если несколько ListView в проекте...
  23. Делать было нечего, дело было вечером... Вот попробовал, свою процедуру чуть изменил, добавил константы ширины скроллбара из ListView unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListView.Types, FMX.ListView, FMX.TextLayout, System.StrUtils; const {$IFDEF IOS} DefaultScrollBarWidth = 7; {$ELSE} {$IFDEF MACOS} DefaultScrollBarWidth = 7; {$ENDIF} {$ENDIF} {$IFDEF MSWINDOWS} DefaultScrollBarWidth = 16; {$ENDIF} {$IFDEF ANDROID} DefaultScrollBarWidth = 7; {$ENDIF} type TForm1 = class(TForm) ListView1: TListView; procedure FormCreate(Sender: TObject); procedure ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem); private { Private declarations } public { Public declarations } FTextLayout : TTextLayout; procedure CalculateTListViewItemHeight(Sender: TObject); end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); Var AText : String; begin FTextLayout := TTextLayoutManager.DefaultTextLayout.Create; AText:= 'FMX.Dialogs.MessageDlg - RAD Studio API Documentation ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + '11 февр. 2016 г. - function MessageDlg(const AMessage: string; const ADialogType: TMsgDlgType; const ... extern DELPHI_PACKAGE int __fastcall MessageDlg _DEPRECATED_ATTRIBUTE1("Use FMX.DialogService methods") ' + 'Перевести эту страницу ' + '11 февр. 2016 г. - function MessageDlg(const AMessage: string; const ADialogType: TMsgDlgType; const ... extern DELPHI_PACKAGE int __fastcall MessageDlg _DEPRECATED_ATTRIBUTE1("Use FMX.DialogService methods") ' + 'Перевести эту страницу ' + '11 февр. 2016 г. - function MessageDlg(const AMessage: string; const ADialogType: TMsgDlgType; const ... extern DELPHI_PACKAGE int __fastcall MessageDlg _DEPRECATED_ATTRIBUTE1("Use FMX.DialogService methods") ' + 'Перевести эту страницу ' + '11 февр. 2016 г. - function MessageDlg(const AMessage: string; const ADialogType: TMsgDlgType; const ... extern DELPHI_PACKAGE int __fastcall MessageDlg _DEPRECATED_ATTRIBUTE1("Use FMX.DialogService methods") ' + '(const System::UnicodeString AMessage, const ... Warning: MessageDlg is deprecated. ***'; with ListView1.Items.Add do Text:=AText; with ListView1.Items.Add do Text:= ReverseString(AText); with ListView1.Items.Add do Text:= AText; end; procedure TForm1.ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem); begin CalculateTListViewItemHeight(AItem); end; procedure TForm1.CalculateTListViewItemHeight(Sender: TObject); var AListItem: TListViewItem; AListView: TListView; begin if (Sender is TListViewItem) then begin AListItem := Sender as TListViewItem; if (AListItem.Parent is TListView) then AListView:=AListItem.Parent as TListView Else Exit; FTextLayout.BeginUpdate; try FTextLayout.Text:=AListItem.Text; FTextLayout.MaxSize:=TPointF.Create(AListView.Width - AListView.ItemSpaces.Left - AListView.ItemSpaces.Right - DefaultScrollBarWidth, 1000); FTextLayout.Font:=AListView.ItemAppearanceObjects.ItemObjects.Text.Font; FTextLayout.WordWrap:=AListView.ItemAppearanceObjects.ItemObjects.Text.WordWrap; FTextLayout.Trimming:=AListView.ItemAppearanceObjects.ItemObjects.Text.Trimming; FTextLayout.HorizontalAlign:=AListView.ItemAppearanceObjects.ItemObjects.Text.TextAlign; FTextLayout.VerticalAlign:=AListView.ItemAppearanceObjects.ItemObjects.Text.TextVertAlign; finally FTextLayout.EndUpdate; end; AListItem.Height:=Round(FTextLayout.Height + AListView.ItemSpaces.Top + AListView.ItemSpaces.Bottom); end; end; end.
×
×
  • Создать...