Перейти к содержанию
Fire Monkey от А до Я

#WAMACO

Пользователи
  • Постов

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

  • Посещение

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

    27

Активность репутации

  1. Haha
    #WAMACO получил реакцию от Равиль Зарипов (ZuBy) в Служба - двухсторонняя связь   
    Сначала человек пишет...
    потом...
    Товарищ, но в АС же JAVA! :)) хохмачи конечно... удивляюсь каждый раз...
  2. Like
    #WAMACO получил реакцию от Andrey Efimov в Служба - двухсторонняя связь   
    Сначала человек пишет...
    потом...
    Товарищ, но в АС же JAVA! :)) хохмачи конечно... удивляюсь каждый раз...
  3. Like
    #WAMACO отреагировална mazayhin в Служба - двухсторонняя связь   
    Вот интересный вы человек! 
    Вам показали пример, вы не посмотрев начпли говорить про какие то левые фантики.
    Потом все же скачали, и просто нажали зеленую кнопку, а оно не вот ошбками плюется, да за такие деньги! Ужас, как таким ...ном пользоваться можо!!! Не работает!!!!
    А можно было просто посмотреть на том же доквики, там расписан порядок работы с срвисами. Вы билд делали сервису перед запуском то? Угадаю- нет конечно! А если бы сделали все как надо, а не бубны искали для танцев, заработало бы.
    Когда вот в AS gradle начнет ошибками кидать, кто виноват будет? Майкрософт наверное, что в свою ОС дал эту поделку ставить?
  4. Like
    #WAMACO отреагировална mazayhin в Окно на переднем плане во время звонка   
    Как создавать это вью или как им созданным пользоваться?
    Если создавать - то создаете разметку в xml, деплоете ее в layouts. Примеров в интернете можно кучу найти. Остальное - в другие папки.
    В общем, получится во так.
    Здесь задеплоено 3 файла - картинка res/drawable/myicon.png, res/drawable/border.xml - прямоугольник подложки и res/layouts/toast.xml - сам lauoyt.
    toast.xml ("-- " - комментарии, удалить надо будет).
    Текст, картинки и прочее можем сразу указать в разметке, и грузить автоматически. Но всегда сможем поменять в коде
    border.xml
    Думаю, тут все понятно. Примитив может быть любой.
    И формируем тост:
    //uses FMX.Helpers.Android, AndroidApi.Helpers, AndroidApi.JNI.GraphicsContentViewText, Androidapi.JNI.Widget var Toast: JToast; InfObj: JObject; Inflater: JLayoutInflater; View: JView; Text: JTextView; begin InfObj := TAndroidHelper.Context.getSystemService (TJContext.JavaClass.LAYOUT_INFLATER_SERVICE); Inflater := TJLayoutInflater.Wrap((InfObj as ILocalObject).GetObjectID); View := TJView.JavaClass.init(TAndroidHelper.Context); View := Inflater.inflate(TAndroidHelper.Context.getResources() .getIdentifier(StringToJString('layout/toast'), StringToJString('layout'), TAndroidHelper.Context.getPackageName), nil); //Грузим из ресурсов. Второе значение всегда nil Text := TJTextView.Wrap ((View.findViewById(TAndroidHelper.Context.getResources() .getIdentifier(StringToJString('id/toastText'), StringToJString('id'), TAndroidHelper.Context.getPackageName)) as ILocalObject).GetObjectID); // Так ищем элементы разметки, если надо свои значения поставить. Так же могли и поменять картинку(id/toastImage), подложку и т.д. Text.setText(StrToJCharSequence('Привет, х11! Я нативный Toast!' + #13 + 'Сегодня пишем на Pascal')); //Устанавливаем свое значение. CallInUIThreadAndWaitFinishing( //В сервисе запускаем без этого, отключаем FMX.Helpers.Android - только его, GraphicsContentViewText к графике, которая ломает сервис, отношения не имеет. procedure begin Toast := TJToast.JavaClass.init(TAndroidHelper.Context); Toast.setView(View); // Своя вьюшка Toast.setDuration(TJToast.JavaClass.LENGTH_LONG); //Константа. Свое значение не пройдет Toast.Show; //Показываем end); end; Ну и все в принципе.
    Сложного, считаю, 0.
    А что не понятно, яндекс показывает, глаза разбегаются.
     

  5. Like
    #WAMACO получил реакцию от Rusland в Что невозможно сделать на Delphi для Android?   
    Сравнивать RAD надо не с нативными студиями разработки, а с Xamarin, например, там вообще тихий ужас...
    Есть 1С:Мобильная платформа, там тоже можно собирать под Android, iOS - правда все в желтом цвете (про toolbar), но знаю людей, кто на этом столько денег заработал, что авторы нативных приложений и не видели еще... 
    Дело в направленности приложений и ДА, некоторые типы приложений (например, корпоративные) делаются быстрее.
    Не надо рисовать виджет погоды на Delphi, не надо делать путеводитель по сортам кофе на Delphi. Делайте это нативными инструментами. 
    Востребованность в кроссплатформе есть и эта тенденция будет только усиливаться. 
     
    Сейчас это напоминает мне разговор в 1998 году о том, что все ПО под Windows надо писать на C++, потому что на других языках - НЕ НАТИВНО, МЕДЛЕННО РАБОТАЕТ, ПОДВИСАЕТ! 
    А потом, я пришел  в одну контору и руководство провозгласило: ТОРМОЗИТ? Добавьте Гигагерц и ОЗУ -  это дешевле и быстрее, нежели переписывать на нативных языках! Так вот, со временем так же будет и с мобилами! и уже очень скоро!
     
    НЕ РАБОТАЕТ НА КИТАЙСКИХ СМАРТФОНАХ? выбросьте их и купите уже нормальные аппараты!  это дешевле, нежели платить Kotlin разрабу!
  6. Like
    #WAMACO отреагировална AliZairov в YouTubeApi VCL & FMX   
    Привет. Никаких официальных YouTube Api компоненты. Только данные с парсинг. Пример доступен в архиве.
  7. Thanks
    #WAMACO отреагировална Евгений Корепов в Кто хорошо знает внутреннюю структуру FMX?   
    Вот простой пример накидал. Главная форма, поток, две очереди (очередь запросов и очередь ответов). Вы в главной форме вбивате два числа, и нажимаете кнопку по своему усмотрению (прибавить, умножить, разделить). Числа отправляются в Очередь запросов, поток получает задачу, выполняет и отправляет ответ в очередь ответов. Главная форма, в Application.OnIdle ждет получения результатов проверяя Очередь ответов, при получении добавляет их в Memo. Все. Проект прилагаю в архиве, вот листинг:
    unit UnitFormMain; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Generics.Collections, FMX.StdCtrls, FMX.Edit, FMX.EditBox, FMX.NumberBox, FMX.Layouts, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo; type TThreadOperation = (Sum, Mult, Divinity); TThreadDataRequest = record A : Double; B : Double; Operation : TThreadOperation; end; TThreadDataAnswer = record Operation : TThreadOperation; A : Double; B : Double; X : Double; ErrorMessage : String; end; TQueueRequest = TThreadedQueue<TThreadDataRequest>; TQueueAnswer = TThreadedQueue<TThreadDataAnswer>; TExcampleThread = class(TThread) protected FQueueRequest: TQueueRequest; FQueueAnswer: TQueueAnswer; procedure Execute; override; public constructor Create(AQueueRequest : TQueueRequest; AQueueAnswer : TQueueAnswer); reintroduce; end; TFormMain = class(TForm) Memo: TMemo; Layout1: TLayout; Label1: TLabel; Label2: TLabel; ButtonSum: TButton; ButtonMult: TButton; ButtonDiv: TButton; EditA: TEdit; EditB: TEdit; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ButtonClick(Sender: TObject); private { Private declarations } FQueueRequest: TQueueRequest; // Очередь запросов FQueueAnswer : TQueueAnswer; // Очередь ответов FExcampleThread : TExcampleThread; procedure OnApplicationIdle(Sender : TObject; var Done: Boolean); public { Public declarations } end; var FormMain: TFormMain; implementation {$R *.fmx} procedure TFormMain.FormCreate(Sender: TObject); begin FQueueRequest:=TQueueRequest.Create(10, 1000, 10); FQueueAnswer:=TQueueAnswer.Create(10, 1000, 10); Application.OnIdle:=OnApplicationIdle; FExcampleThread:=TExcampleThread.Create(FQueueRequest, FQueueAnswer); end; procedure TFormMain.FormDestroy(Sender: TObject); begin if Assigned(FExcampleThread) then begin FExcampleThread.Terminate; FExcampleThread.WaitFor; FExcampleThread.Free; end; if Assigned(FQueueRequest) then FQueueRequest.Free; if Assigned(FQueueAnswer) then FQueueAnswer.Free; end; procedure TFormMain.OnApplicationIdle(Sender : TObject; var Done: Boolean); Var AThreadDataAnswer : TThreadDataAnswer; S : String; begin if FQueueAnswer.PopItem(AThreadDataAnswer) = TWaitResult.wrSignaled then begin case AThreadDataAnswer.Operation of TThreadOperation.Sum : S:=' + '; TThreadOperation.Mult : S:=' * '; TThreadOperation.Divinity : S:=' / '; end; S:=AThreadDataAnswer.A.ToString + S + AThreadDataAnswer.B.ToString + ' = '; if Not AThreadDataAnswer.ErrorMessage.IsEmpty then S:=S + AThreadDataAnswer.ErrorMessage else S:=S + AThreadDataAnswer.X.ToString; Memo.Lines.Add(S); end; end; constructor TExcampleThread.Create(AQueueRequest : TQueueRequest; AQueueAnswer : TQueueAnswer); begin FQueueRequest:=AQueueRequest; FQueueAnswer:=AQueueAnswer; Inherited Create(False); end; procedure TExcampleThread.Execute; Var AThreadDataRequest : TThreadDataRequest; AThreadDataAnswer : TThreadDataAnswer; begin while Not Terminated do begin if FQueueRequest.PopItem(AThreadDataRequest) = TWaitResult.wrSignaled then begin AThreadDataAnswer.Operation:=AThreadDataRequest.Operation; AThreadDataAnswer.ErrorMessage:=''; AThreadDataAnswer.A:=AThreadDataRequest.A; AThreadDataAnswer.B:=AThreadDataRequest.A; AThreadDataAnswer.X:=0; try case AThreadDataRequest.Operation of TThreadOperation.Sum : AThreadDataAnswer.X:=AThreadDataRequest.A + AThreadDataRequest.B; TThreadOperation.Mult : AThreadDataAnswer.X:=AThreadDataRequest.A * AThreadDataRequest.B; TThreadOperation.Divinity : AThreadDataAnswer.X:=AThreadDataRequest.A / AThreadDataRequest.B; end; except on E : Exception do AThreadDataAnswer.ErrorMessage:=E.Message; end; FQueueAnswer.PushItem(AThreadDataAnswer); end; TThread.Sleep(10); end; end; procedure TFormMain.ButtonClick(Sender: TObject); Var AThreadDataRequest : TThreadDataRequest; begin AThreadDataRequest.A:=EditA.Text.ToDouble; AThreadDataRequest.B:=EditB.Text.ToDouble; Case TButton(Sender).Tag of 1 : AThreadDataRequest.Operation:=TThreadOperation.Sum; 2 : AThreadDataRequest.Operation:=TThreadOperation.Mult; 3 : AThreadDataRequest.Operation:=TThreadOperation.Divinity; End; FQueueRequest.PushItem(AThreadDataRequest); end; end.  
    test116 TThreadedQueue.zip
  8. Like
    #WAMACO получил реакцию от S_007 в Сортировка FDTable   
    Индекс надо создать по этому полю видимо
  9. Like
    #WAMACO получил реакцию от S_007 в Сортировка FDTable   
    FDTable.IndexFieldNames := 'имя поля';  
  10. Like
    #WAMACO отреагировална fsdb в MQTT под Ubuntu Server   
    ну ничего. шишки набивать надо. ото так вас послушать так если ничего не выходит то надо все бросить))) жалко ответа по существу не дали. ну ок
  11. Like
    #WAMACO отреагировална x11 в Управление окном заставки   
    Может кому пригодится.
    1. В приложении по умолчанию главной формой, т.е. формой, которая автоматически создается при старте, является форма логина. Т.е. именно она появляется первой.
    2. В форме логина уже во время исполнения программы, подменяем форму логина на ту, которая должна теперь считаться главной.
     
    procedure SetAsMainForm(aForm:TForm); var P: Pointer; begin P := @Application.Mainform; Pointer(P^) := aForm; end;  
    когда проверили логин/пароль и убедились, что пользователь авторизован, создаём форму и делаем её главной, а форму логина закрываем:
    procedure TfmLogin.btnOkClick(Sender: TObject); begin if edPass.Text = qUserspassword.AsString then begin UserData.ID := qUsersid.AsInteger; UserData.Name := qUsersname.AsString; UserData.Group := qUsersid_group.AsInteger; fmMain := TfmMain.Create(Application); fmMain.Show; SetAsMainForm(fmMain); close; end else begin lbInfo.Text := 'Ошибка. Пароль неверный.'; end; end;  
  12. Like
    #WAMACO получил реакцию от Ingalime в Окончание подписки   
    только оплатить
  13. Like
    #WAMACO получил реакцию от Alex7wrt в Окончание подписки   
    только оплатить
  14. Like
    #WAMACO отреагировална x11 в Новые требования на Google Play   
    здесь http://fire-monkey.ru/topic/4786-несколько-sdk-в-приложении/
    обсудили, вывод: нужно самому ручками указывать в файле шаблона AndroidManifest.template.xml
  15. Like
    #WAMACO получил реакцию от Ingalime в Отображение картинок в ListView   
    ownerBitmap := true;
  16. Like
    #WAMACO отреагировална x11 в Поиск контакта по номеру   
    function TContactsManager.GetContactByNumber( const aPhoneNumber: string): string; var wUri: JNet_URI; wCursor: JCursor; wfilter, wJQueryParams: TJavaObjectArray<JString>; begin Result := ''; wUri := TJNet_URI.JavaClass.withAppendedPath ( TJContactsContract_PhoneLookup.JavaClass.CONTENT_FILTER_URI, StringToJString(aPhoneNumber) ); wfilter := TJavaObjectArray<JString>.Create(2); wfilter[0] := StringToJString('lookup'); wfilter[1] := StringToJString('display_name'); with SharedActivity.getContentResolver do wCursor := query(wUri, wfilter, nil, nil, nil); try if Assigned(wCursor) and (wCursor.getCount > 0) then begin wCursor.moveToNext; Result := JStringToString(wCursor.getString( wCursor.getColumnIndex(StringToJString('display_name')))); end; finally wCursor.Close; wCursor := nil; end; end; http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1183758&msg=21183983
  17. Like
    #WAMACO отреагировална Akad в Лагает StrigGrid - Андроид   
    В смысле для чего? Что бы значениями заполнить таблицу. Он разве работает в каком-то другом режиме? На сколько я знаю только TStringGrid хранит значения в себе TGrid не умеет такого.
    У меня достаточно сложный код:
    procedure CTableElement.Grid1GetValue(Sender: TObject; const ACol, ARow: Integer; var Value: TValue); begin if ARow >= Length(CellValue) then begin assert(false); end; if ACol >= Length(CellValue[ARow].cols) then begin assert(false); end; if ACol = -1 then begin Value := CellValue[ARow].color; exit; end; if ACol = -2 then begin Value := CellValue[ARow].isBlinking; exit; end; Value := CellValue[ARow].cols[ACol].GetVal; end; Т.е. у меня описан цвет строки, её мигание.
    GetVal у меня TValue. В нём может быть текст или картинка.
  18. Like
    #WAMACO отреагировална S_007 в Программное управление подсветкой экрана   
    Akad спасибо за ответ
    получилось так, может кому пригодится... Delphi 10.2
    В опциях проекта - Uses permissions - включить  WRITE SETTINGS
     
    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.Helpers.Android, Androidapi.Helpers, Androidapi.JNI.Provider, Androidapi.JNI.App, Androidapi.JNI.GraphicsContentViewText, FMX.Controls.Presentation, FMX.StdCtrls; type TForm1 = class(TForm) Button_Plus: TButton; Button_Minus: TButton; Label1: TLabel; procedure Button_MinusClick(Sender: TObject); procedure BrightnesSet; procedure Button_PlusClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; brightness:integer; implementation {$R *.fmx} procedure TForm1.BrightnesSet; var Resolver: JContentResolver; AttainedBrightness: Single; LayoutParams: JWindowManager_LayoutParams; Window: JWindow; begin label1.Text := inttostr(brightness); Resolver := TAndroidHelper.ContentResolver; //Отключаем автоматический режим TJSettings_System.JavaClass.putInt(Resolver,TJSettings_System.JavaClass.SCREEN_BRIGHTNESS_MODE,TJSettings_System.JavaClass.SCREEN_BRIGHTNESS_MODE_MANUAL); //Устанавливаем нужную яркость TJSettings_System.JavaClass.putInt(Resolver,TJSettings_System.JavaClass.SCREEN_BRIGHTNESS,brightness); try AttainedBrightness := TJSettings_System.JavaClass.getInt(Resolver,TJSettings_System.JavaClass.SCREEN_BRIGHTNESS); CallInUIThread( procedure begin Window := TAndroidHelper.Activity.getWindow; LayoutParams := Window.getAttributes; LayoutParams.screenBrightness := AttainedBrightness / 255; Window.setAttributes(LayoutParams); end); except end; end; procedure TForm1.Button_MinusClick(Sender: TObject); begin if brightness > 20 then begin brightness := brightness - 5; BrightnesSet; end; end; procedure TForm1.Button_PlusClick(Sender: TObject); begin if brightness < 255 then begin brightness := brightness + 5; BrightnesSet; end; end; procedure TForm1.FormCreate(Sender: TObject); begin brightness := 20; end; end.  
  19. Like
    #WAMACO отреагировална mazayhin в Отпечаток пальца   
    Мы писали на java библиотеку, реализующую работу с сенсором и кейсторам, подключали с помощью паскалевской обертки.
    Ели будет интерес, то как дойдут руки, до ума доведем и выложим.
  20. Like
    #WAMACO отреагировална Равиль Зарипов (ZuBy) в StatusBar Color   
    попробуйте последнюю версию
  21. Like
    #WAMACO отреагировална x11 в Delphi не видит мой телефон   
    В первую очередь нужно проверить, видит ли утилита adb.exe ваше устройство.
    в консоли CMD нужно зайти в папку "C:\Users\Public\Documents\Embarcadero\Studio\19.0\PlatformSDKs\android-sdk-windows\platform-tools"
    И выполнить adb devices, появится строка: List of devices attached и под ней все подключенные смартфоны (устройства). Если там ничего не будет, то не установлены USB-драйверы, либо на устройстве не включен режим разработчика.
    Когда установите драйверы и перезапустите ПК, то adb может всё равно не увидеть устройство, тогда поможет создание файла adb_usb.ini и нужно будет прописать в нём ID устройства: http://digphone.ru/esli-android-adb-ne-vidit-smartfon/
     
    После этого перезапустить ПК.
    Снова запустить в CMD: adb.exe devices
    после этого может появиться строка, говорящая о том, что устройство подключено, но не авторизовано, т.е. код устройства и unauthorized:
    Переподключите смартфон к компьютеру и на экране смартфона должно появиться окно авторизации, где нужно нажать ОК и, возможно, перед этим сперва поставить галочку "Всегда разрешать подключение с этого ПК".
    Снова выполните adb.exe devices и увидите, что вместо unauthorized, будет слово device.
    Вместо перезапуска ПК, можно перезапускать службу adb
    adb kill-server adb start-server
  22. Thanks
    #WAMACO получил реакцию от dnekrasov в Символ шрифта с иконками вместо картинки на кнопке   
    Первый и второй вариант работает!
    Последний - НЕТ!
    Я так понимаю, по смыслу, этот самый правильный
    ... begin Application.Initialize; TIconicFont.FontsReg; try TStyleManager.TrySetStyleFromResource('STYLE_Dark'); Application.CreateForm(TMainForm, MainForm); Application.Run; finally TIconicFont.FontsUnreg; end; end.  
  23. Like
    #WAMACO отреагировална dnekrasov в Вертикальное смещение юникодных шрифтов   
    Ну почему же:
    var F: TFont; PD: TPathData; begin F := TFont.Create; try F.Family := 'Kozuka Gothic Pr6N B'; F.Size := 60; with TBitmap.Create do try Canvas.Font.Assign(F); PD := TPathData.Create; try if Canvas.TextToPath(PD, RectF(0, 0, 10000, F.Size), '字字字 AsD АыЩ', False, TTextAlign.Leading, TTextAlign.Leading) then begin PathLabel.Width := PD.GetBounds.Width; PathLabel.Data := PD; end; finally PD.Free; end; finally Free; end finally F.Free; end; end;  
  24. Like
    #WAMACO отреагировална Евгений Корепов в JSON Pretty Print - красивый JSON   
    Долго мучался отсутствием штатного средства красивого вывода JSON в текст, все что есть в комплекте, в REST к примеру, выводит убогую, не читаемую кашу. Плюнул и на написал свою функцию, на базе REST TSON.Format.
    function JsonPrettyPrint(AJsonValue : TJsonValue; AIndent : string = ' ') : string; var SourceContent: string; AChar: char; EOL: string; LeftIndent: string; isEOL: boolean; isInString: boolean; isInArray: boolean; isEscape: boolean; begin Result:=''; EOL:=#13#10; AIndent:= ' '; LeftIndent:=''; isEOL:=true; isInString:=false; isInArray:=false; isEscape:=false; SourceContent := AJsonValue.ToString; //This will basically display all strings as Delphi strings. Technically we should show "Json encoded" strings here. for AChar in SourceContent do begin case AChar of '{' : if not isInString and not isInArray then begin Result := Result + AChar + EOL; LeftIndent := LeftIndent + AIndent; Result := Result + LeftIndent; isEOL := true; end; ',' : if not isInString and (AChar = ',') then begin isEOL := false; if isInArray then Result := Result + AChar + ' ' else Result := Result + AChar + EOL + LeftIndent; end; '}' : if not isInString then begin Delete(LeftIndent, 1, Length(AIndent)); if not isEOL then Result := Result + EOL; Result := Result + LeftIndent + AChar; end; ':' : if not isInString and (AChar = ':') then Result := Result + AChar + ' '; else begin isEOL := false; Result := Result + AChar; end; end; isEscape := (AChar = '\') and not isEscape; if not isEscape and (AChar = '"') then isInString := not isInString; if not isEscape and (AChar = '[') then isInArray:=True; if not isEscape and (AChar = ']') then isInArray:=False; end; end; Результат налицо:
    { "Rig": { "Name": "node07", "Account": "3DQ9fRMVfxHaT7noy7molmuhlCI3RQkxt2y8BB", "PowerCost": [4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43] }, "ExcavatorInstance": { "Host": "192.168.0.156", "Port": 38080, "APIToken": "asevsdrbdrtnetyjer34yb435t", "ConnectionType": "HTTP" }, "Devices": { "DeviceType": "", "UseDevices": [0, 1, 2, 3, 4] }, "Algorithms": { "cryptonight": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [32, "M=2", 876], "Speed": 1506138068.81243, "Power": 851 }, "lbry": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [95, 120, -1000], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "pascal": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "decred": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "neoscrypt": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "daggerhashimoto": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "daggerhashimoto_decred": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "daggerhashimoto_sia": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "lyra2rev2": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [95, 120, -1000], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "blake2s": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "equihash": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": ["2", "M=1", "676556"], "Speed": 1506138068.81243, "Power": 851 }, "daggerhashimoto_pascal": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "keccak": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "sia": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 } } } Конкретно в текущем случае, массивы мне нужны были в одну строку. Кому понадобиться иное - закомментируйте последние 4 строки.
  25. Like
    #WAMACO отреагировална dnekrasov в Символ шрифта с иконками вместо картинки на кнопке   
    Механизм, который позволяет использовать иконку символьного шрифта вместо картинки на кнопках.
    Уж очень мне не нравится стандартный механизм добавления картинки на кнопку, поэтому, пару лет назад, начал искать альтернативу и остановился на символьных шрифтах (таких как FontAwesome). Вот что из этого получилось:

    IconicFontGlyph.zip 
    Под Windows работает без проблем - на других системах не пробовал.
    Как это работает
    Добавляем в проект модуль UIExt.IconicFont.pas Добавляем в проект модули описания шрифтов, которые будут использоваться (см. ниже) Описываем символ, который будет использоваться в качестве иконки (см. ниже) В обработчике  события OnApplyStyleLookup кнопки пишем одну строчку - TIconicFont.ApplyButtonStyle(TCustomButton(Sender)); Модули описания шрифтов
    UIExt.IconicFont.FA.pas -  Font Awesome UIExt.IconicFont.IM.pas - IcoMoon UIExt.IconicFont.IML.pas - IcoMoon Lindua UIExt.IconicFont.IMLN.pas - IcoMoon Linear UIExt.IconicFont.MDI.pas - Material Design Icons UIExt.IconicFont.WHHG.pas - WebHostingHub Glyphs Описание символа
    Для описания символа используется свойство StyleName (не знаю как остальные - лично я его нигде не использую). Само описание - это строка в определённом формате:
    [Короткое имя шрифта];[код символа];[размер шрифта];[цвет]
    2 первых поля - обязательны. Короткое имя шрифта можно увидеть в его модуле описания (TIconicFont.Short)
    Примеры можно увидеть на скриншотах выше (текст над кнопками).
    Ну и напоследок - небольшая демка IconicFontDemo.zip
×
×
  • Создать...