-
Постов
2 124 -
Зарегистрирован
-
Посещение
-
Победитель дней
390
Активность репутации
-
Brovin Yaroslav получил реакцию от Andrey Efimov в Приведение типа - as
Если посмотреть, что вызывается под капотом для случая с интерфейсами, то можно увидеть:
1. Для вызова Interface1(Instance), вызывает системный метод _IntfCopy, который по сути не проверяет типы, а просто увеличивает счетчик типов. Такое приведение типов не проверяет типы, а просто копирует указатель а реализацию.
procedure _IntfCopy(var Dest: IInterface; const Source: IInterface); {$IFDEF PUREPASCAL} var P: Pointer; begin P := Pointer(Dest); if Source <> nil then Source._AddRef; Pointer(Dest) := Pointer(Source); if P <> nil then IInterface(P)._Release; end; {$ELSE} 2. При использовании оператора as будет вызван _IntfCast, который выполняет честное приведение типов через QueryInterface. Поэтому в этом случае вы получите на выходе честный указатель на таблицу интерфейса, если интерфейс поддерживается объектом.
procedure _IntfCast(var Dest: IInterface; const Source: IInterface; const IID: TGUID); {$IF defined(PUREPASCAL) or defined(PIC)} // PIC: EBX must be correct before calling QueryInterface var Temp: Pointer; begin if Source = nil then Dest := nil else begin Temp := nil; if Source.QueryInterface(IID, IInterface(Temp)) <> 0 then ErrorAt(byte(reIntfCastError), ReturnAddress) else begin if Assigned(Dest) then Dest._Release; Pointer(Dest) := Temp; end; end; end;
-
Brovin Yaroslav получил реакцию от Равиль Зарипов (ZuBy) в Приведение типа - as
Если посмотреть, что вызывается под капотом для случая с интерфейсами, то можно увидеть:
1. Для вызова Interface1(Instance), вызывает системный метод _IntfCopy, который по сути не проверяет типы, а просто увеличивает счетчик типов. Такое приведение типов не проверяет типы, а просто копирует указатель а реализацию.
procedure _IntfCopy(var Dest: IInterface; const Source: IInterface); {$IFDEF PUREPASCAL} var P: Pointer; begin P := Pointer(Dest); if Source <> nil then Source._AddRef; Pointer(Dest) := Pointer(Source); if P <> nil then IInterface(P)._Release; end; {$ELSE} 2. При использовании оператора as будет вызван _IntfCast, который выполняет честное приведение типов через QueryInterface. Поэтому в этом случае вы получите на выходе честный указатель на таблицу интерфейса, если интерфейс поддерживается объектом.
procedure _IntfCast(var Dest: IInterface; const Source: IInterface; const IID: TGUID); {$IF defined(PUREPASCAL) or defined(PIC)} // PIC: EBX must be correct before calling QueryInterface var Temp: Pointer; begin if Source = nil then Dest := nil else begin Temp := nil; if Source.QueryInterface(IID, IInterface(Temp)) <> 0 then ErrorAt(byte(reIntfCastError), ReturnAddress) else begin if Assigned(Dest) then Dest._Release; Pointer(Dest) := Temp; end; end; end;
-
Brovin Yaroslav отреагировална kami в VersionCode
(с) не помню чье:
var FProgramVersion: string; function GetProgramVersion: string; var {$IFDEF ANDROID} PackageManager: JPackageManager; PackageInfo: JPackageInfo; {$ENDIF} {$IFDEF IOS} s: MarshaledAString; {$ENDIF} {$IFDEF MSWINDOWS} Exe: string; Size, Handle: DWORD; Buffer: TBytes; FixedPtr: PVSFixedFileInfo; {$ENDIF} begin if FProgramVersion <> '' then begin Result := FProgramVersion; exit; end; {$IFDEF ANDROID} PackageManager := TAndroidHelper.Context.getPackageManager; PackageInfo := PackageManager.getPackageInfo(TAndroidHelper.Context.getPackageName, 0); Result := JStringToString(PackageInfo.versionName); {$ENDIF} {$IFDEF IOS} s := TNSString.Wrap(CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle, kCFBundleVersionKey)).UTF8String; Result := string(s); {$ENDIF} {$IFDEF MSWINDOWS} Exe := ParamStr(0); Size := GetFileVersionInfoSize(PChar(Exe), Handle); if Size = 0 then begin Result := 'Unknown'; exit; end; SetLength(Buffer, Size); if not GetFileVersionInfo(PChar(Exe), Handle, Size, Buffer) then begin Result := 'Unknown'; exit; end; if not VerQueryValue(Buffer, '\', Pointer(FixedPtr), Size) then begin Result := 'Unknown'; exit; end; Result := Format('%d.%d.%d.%d', [LongRec(FixedPtr.dwFileVersionMS).Hi, // major LongRec(FixedPtr.dwFileVersionMS).Lo, // minor LongRec(FixedPtr.dwFileVersionLS).Hi, // release LongRec(FixedPtr.dwFileVersionLS).Lo]); // build {$ENDIF} FProgramVersion := Result; end;
-
Brovin Yaroslav отреагировална x11 в Служба + перехват номера
На основе нескольких тем форума сделал службу перехвата звонков и номера телефона.
http://fire-monkey.ru/topic/3878-статьякак-создать-простой-android-broadcast-receiver-how-to-implement-simplest-android-broadcast-receiver-in-delphi/
http://fire-monkey.ru/topic/2386-перехват-события-звонка/
http://fire-monkey.ru/topic/2972-использование-нативных-localbroadcastmanager-и-broadcastreceiver/
Покритикуйте пожалуйста. Уверен, что не всё правильно.
Но что до ума не удалось довести, так это то, как правильно останавливать службу и закрывать приложение.
Проект (для Токио) приложил теме.
Заранее благодарен.
BR2.rar
-
Brovin Yaroslav получил реакцию от x11 в Перехват события звонка
Посмотрите уже готовый сервис IFMXPhoneDialerService, он умеет слушать сеть: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Mobile_Tutorial:_Using_the_Phone_Dialer_on_Mobile_Devices_(iOS_and_Android)
-
Brovin Yaroslav отреагировална dnekrasov в Создание контролов клонированием стиля
По-моему вообще некорректно. Внешне-то будет выглядеть как надо, а вот логики работы не будет вообще. Ведь стиль - это только описание того, как контрол должен выглядеть, а не как работать.
Кстати, копию стиля легче получить так
MainControl := FindStyleResource('ScreenFogStyle', True);
-
Brovin Yaroslav отреагировална Andy в Маршалинг/ДеМаршалинг в System.JSON
Можно и без сеттеров и геттеров и тоже будет работать:
TTelegaUser = Class FID: Integer; FFirst_Name: String; FLast_Name: String; FUsername: String; End;
-
Brovin Yaroslav отреагировална Виталий Иванов в Маршалинг/ДеМаршалинг в System.JSON
Для Syste,.JSON необходимо использовать атрибуты по типу которые расположены в REST.Json.Types
[JSONNameAttribute('НАЗВАНИЕ')] -Так ваша переменная назвается в JSON
[JSONMarshalledAttribute(False)] - Так блокируется выгрузка (нащет загрузки не уверен) тоесть при TJsonObject(oJSON).ToString переменной с таким атрибутом не будет
TItems = class
private
[JSONNameAttribute('ERROR')]
FERROR: String;
[JSONNameAttribute('RESULT')]
FRESULT: String;
[JSONMarshalledAttribute(False)]
FOwner : TItems;
public
property ERROR : String read FERROR write FERROR;
property RESULT : String read FRESULT write FRESULT;
property Owner : TItems read FOwner write FOwner;
end;
-------------Результат TJsonObject().ToString---------------------
{"ERROR": "", "RESULT": ""}
==================================================================
TItems = class
private
FERROR: String;
FRESULT: String;
FOwner : TItems;
public
property ERROR : String read FERROR write FERROR;
property RESULT : String read FRESULT write FRESULT;
property Owner : TItems read FOwner write FOwner;
end;
-------------Результат TJsonObject().ToString---------------------
{"eRROR": "", "rESULT": "", "owner": ""}
Если честно то не знаю почему так все используют XSuperObject, встроенного инструмента "System.JSON, REST.Json, REST.Json.Types" с головой хватает на всё
-
Brovin Yaroslav получил реакцию от ice donkey в ListView - фиксированный заголовок
Раньше точно делали прилипание хедера в ЛистВью. К сожалению сейчас точно не могу сказать ничего на этот счет. Но точно было сделано. Но, как вариант, если речь идет об ios, то в TListView есть поддержка нативной реализации. И там реализованы выталкивающие хедеры
http://docwiki.embarcadero.com/Libraries/Tokyo/en/FMX.ListView.TListViewBase.NativeOptions
-
-
Brovin Yaroslav отреагировална krapotkin в [THttpClient] Как работать с Cookie в HTTPClient?
http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Net.HttpClient.TCookieManager_Methods
тут только один метод что-то делает с куками, так что думаю, он и подойдет
-
Brovin Yaroslav отреагировална krapotkin в [THTTPClient] Как скачать файл с System.Net.HttpClient?
var resp:IHttpResponse;
resp := h.get(...)
там в resp все что нужно
-
Brovin Yaroslav отреагировална krapotkin в [THTTPClient] Как скачать файл с System.Net.HttpClient?
а что подсказать-то? где код для ревью?
h:=THttpClient.Create;
resultStream:=TFileStream.Create(....);
h.get(URL, resultStream);
h.free;
resultStream.free;
-
Brovin Yaroslav отреагировална sinuke в Не получается запустить эмулятор
и еще. на x86 образах (а они реально работают шустро) fmx-приложения не запускаются
все равно придется создавать виртуальное устройство на arm-образе
-
Brovin Yaroslav отреагировална Alex7wrt в Не получается запустить эмулятор
Чтобы не было красного крестика, нужно не только создать эмулятор в AVD менеджере, но и запустить его там же. В итоге на экране увидите окно, в котором запускается интерфейс Android. Когда он запустится, и появится рабочий стол Android, можно запускать установку приложения на эмулятор.
Только учтите, что на относительно слабых системах эмулятор может запускаться довольно долго. Ну и Вообще для проверки работоспособности (работает/ не работает) легче воспользоваться установкой на реальный девайс.
-
Brovin Yaroslav отреагировална dnekrasov в Искажения текста на Canvas под Windows XP
Попробуйте в файле проекта добавить GlobalUseGDIPlusClearType := False
-
Brovin Yaroslav отреагировална Вадим Смоленский в Искажения текста на Canvas под Windows XP
Помогло! Даже под XP теперь всё красиво.
Собственно, проблему я сам на себя навлек, когда по чьему-то совету вставил в файл проекта GlobalUseGDIPlusClearType := True для повышения быстродействия. Причем, нельзя сказать, чтобы быстродействие после этого ощутимо повысилось. Наверняка этот параметр принимает False по умолчанию, но пусть на всякий случай присвоение останется.
Спасибо!
-
Brovin Yaroslav отреагировална Олег Киреев в Приложение 3D примера работы некоторых механизмов v.1.0. Для OS Win.
Приложение для наглядного обучения работы некоторых механизмов автомобиля и автобуса.
Работает в OS Windows. Есть возможность записи процесса в формате
AVI. Можно изменять прозрачность и посмотреть что внутри.
СпасиБО EMBARCADERO!
Автор: Олег Киреев - ведущий инженер-конструктор.
kireevoleg@gmail.by тел. +375 29 676 13 84.
Республика Беларусь г.Минск.
3D Работа механизмов.rar
-
Brovin Yaroslav отреагировална x11 в XML
я понял, нужно начинать отсюда
http://docwiki.embarcadero.com/RADStudio/Berlin/en/Using_TXMLDocument
-
Brovin Yaroslav отреагировална x11 в XML
здесь есть примеры
http://docwiki.embarcadero.com/CodeExamples/Berlin/en/Code_Examples_by_Functionality#Xml.XMLDoc
-
Brovin Yaroslav отреагировална Виталий Иванов в Полноэкранный режим редактора
Извините совсем забыл, так же у меня строит вот такое дополнение DDevExtensions к IDE в нем как раз и настраиваться такое поведение, так же есть и super-zoom - который оставляет только поле редакторов как на сткриншоте ниже.
-
Brovin Yaroslav отреагировална krapotkin в fgActivityDialog
В любом случае, вам придется вносить изменения в программу, т.к. 10.2 имеет новый подход к потокам в приложении.
Вы можете либо изменить свой код, либо код fgActivityDialog.
В вашем случае можно попробовать так:
fgActivityDialog1.Message: = 'Проверка подключения к Интернету.';
fgActivityDialog1.Show;
TTask.Run(procedure
var result :string;
begin
try
CM.DSRestConnection1.Host: = 'my.server.com'; // Пример
CM.DSRestConnection1.TestConnection ();
Result: = 'S';
except
Result: = 'N';
End;
tthread.synchronize(NIL, procedure begin F_Result := result; fgActivityDialog1.hide; end);
end);
F_Result - это поле формы
-
Brovin Yaroslav отреагировална Евгений Корепов в fgActivityDialog
В Токио изменена логика работы приложения на Андроид - пользовательский интерфейс выполняется в основном потоке приложения, возможно проблема из за этого. Вот похожая тема
-
Brovin Yaroslav получил реакцию от x11 в OXml - библиотека для работы с XML
Она встроена в существующий TXMLDocument.
-
Brovin Yaroslav отреагировална x11 в FMXComponents
Может, кому пригодится, здесь набор open-sourced компонент для FMX
https://github.com/zhaoyipeng/FMXComponents