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

rareMax

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

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

  • Посещение

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

    35

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

  1. Like
    rareMax получил реакцию от Hevard в Предупреждение MessageDlg   
    FMX.Dialogs procedure ShowMsgYesNo; begin { Show a multiple-button alert that triggers different code blocks according to your input } TDialogService.MessageDialog('Choose a button:', System.UITypes.TMsgDlgType.mtInformation, [System.UITypes.TMsgDlgBtn.mbYes, System.UITypes.TMsgDlgBtn.mbNo], System.UITypes.TMsgDlgBtn.mbYes, 0, // Use an anonymous method to make sure the acknowledgment appears as expected. procedure(const AResult: TModalResult) begin case AResult of { Detect which button was pushed and show a different message } mrYES: ShowMessage('You chose Yes'); mrNo: ShowMessage('You chose No'); end; end); end;  
  2. Like
    rareMax отреагировална ENERGY в [Отклонение] TFloatAnimation и TFrame   
    Столкнулся с такой же проблемой, если любой компонент (в моем случае TImage ) лежит на фрейме не работает TFloatAnimation вообще.
    Решение: 
    При создании фрейма нужно указывать Self формы, а не  nil.
    : MyFrame := TMyFrame.Create(Self);
  3. Like
    rareMax отреагировална RoschinSpb в Загрузка иконок в TimageList из файла   
    Загрузка картинки будет выглядеть примерно так.
    procedure TForm11.Button2Click(Sender: TObject); const SourceName = 'Картинка'; procedure LoadPicture(const Source: TCustomSourceItem; const Scale: Single; const FileName: string); var BitmapItem: TCustomBitmapItem; TmpBitmap: TBitmap; begin BitmapItem := Source.MultiResBitmap.ItemByScale(Scale, True, True); if BitmapItem = nil then begin BitmapItem := Source.MultiResBitmap.Add; BitmapItem.Scale := Scale; end; BitmapItem.FileName := FileName; TmpBitmap := BitmapItem.CreateBitmap; try if TmpBitmap <> nil then BitmapItem.Bitmap.Assign(TmpBitmap); finally TmpBitmap.Free; end; end; var NewSource: TCustomSourceItem; NewDestination: TCustomDestinationItem; NewLayer: TLayer; begin if ImageList1.Source.IndexOf(SourceName) = -1 then begin NewSource := ImageList1.Source.Add; NewSource.Name := SourceName; NewSource.MultiResBitmap.TransparentColor := TColorRec.Fuchsia; NewSource.MultiResBitmap.SizeKind := TSizeKind.Custom; NewSource.MultiResBitmap.Width := 16; NewSource.MultiResBitmap.Height := 16; LoadPicture(NewSource, 1, 'D:\Мои веселые картинки\Icons\16x16\alarm16.bmp'); LoadPicture(NewSource, 1.5, 'D:\Мои веселые картинки\Icons\24x24\alarm24.bmp'); NewDestination := ImageList1.Destination.Add; NewLayer := NewDestination.Layers.Add; NewLayer.SourceRect.Rect := TRectF.Create(TPoint.Zero, NewSource.MultiResBitmap.Width, NewSource.MultiResBitmap.Height); NewLayer.Name := SourceName; ControlAction1.ImageIndex := NewDestination.Index; end; end; Здесь как видно грузится деве картинки 16х16 и 24х24, при этом используются масштабы 1 и 1,5. После загрузки меняется свойство ImageIndex у действия ControlAction1. Загруженная картинка должна автоматом появится на всех кнопках, которые используют ControlAction1.
     
     

  4. Like
    rareMax получил реакцию от Валерий Ильин в Предупреждение MessageDlg   
    FMX.Dialogs procedure ShowMsgYesNo; begin { Show a multiple-button alert that triggers different code blocks according to your input } TDialogService.MessageDialog('Choose a button:', System.UITypes.TMsgDlgType.mtInformation, [System.UITypes.TMsgDlgBtn.mbYes, System.UITypes.TMsgDlgBtn.mbNo], System.UITypes.TMsgDlgBtn.mbYes, 0, // Use an anonymous method to make sure the acknowledgment appears as expected. procedure(const AResult: TModalResult) begin case AResult of { Detect which button was pushed and show a different message } mrYES: ShowMessage('You chose Yes'); mrNo: ShowMessage('You chose No'); end; end); end;  
  5. Like
    rareMax получил реакцию от MrAnderson в [TScrollBox] Возврат toolbar'a при лёгкой прокрутке вверх   
    Source code e APK Link: Codice sorgente Delphi XE7
    Link: Demo APK (da installare sul vostro dispositivo Android)
  6. Like
    rareMax получил реакцию от x11 в Telega π - Библиотека для работы с Telegram Bot API в Delphi   
    Боту могут много человек одновременно писать. Для этого от сервера возвращается не один объект Update, а массив таких объектов. 
    Событие OnUpdates - возвращает скоп таких обновлений. Событие OnUpdate - перебирает массив и вызывается для каждого элемента(массива)
    Для чего: OnUpdate - тебе не придется запускать цикл, ты работаешь напрямую с объектом. OnUpdates - был случай, когда необходимо было этот массив событий отправить в TParallel.For. Раз понадобился мне - возможно и вам понадобится. 
  7. Haha
    rareMax получил реакцию от Barbanel в Telega π - Библиотека для работы с Telegram Bot API в Delphi   
    https://www.native-english.ru/grammar/english-nouns-plural
    https://core.telegram.org/bots/api#getting-updates
  8. Like
    rareMax получил реакцию от Anatoliy в Telega π - Библиотека для работы с Telegram Bot API в Delphi   
    Мне очень неудобно, что я не обновил статью. На самом деле с этой библиотекой произошло очень много изменений с проектом:
    - переехал на битБакет: https://bitbucket.org/RareGods/cloudapi/src/master/
    -  теперь там не только работа с телеграмом, но и другие сервисы
    -  после выхода Delphi CE позволил себе вырезать работу с сетевыми библиотеками, отличными от System.Net. 
    - пофиксил больше багов чем добавил.
     
    На вскидку это все. На вопросы оперативно отвечаем в телеграм-чате : @CloudAPI. 
  9. Like
    rareMax получил реакцию от AngryOwl в Telega π - Библиотека для работы с Telegram Bot API в Delphi   
    В начале пару новостей: 
    Репозиторий клонируется также на ГитХаб. Можно устанавливать с помощью Delphinus'a Бот калькулятор для Telegram.
    А сейчас мы напишем своего бота, который сможет решать арифметические выражения(и не только).
    Что для этого нужно:
     Telega π - Библиотека для работы с Telegram Bot API в Delphi TeeBI После установки библиотек свыше - создаем новое консольное приложение. Далее создаем новый модуль(unit) и называем его, например, Telegram.Plugin.Calculator
    В этом модуле мы будем писать логику калькулятора, а точнее взаимодействие команд от пользователя и модуля выражений BI.Expression(TeeBI).
    Для наглядности, сразу код модуля:
    unit Telegram.Plugin.Calculator; interface uses TelegAPI.Bot, TelegAPI.Types, TelegAPI.Utils, TelegAPI.Module; Type TTgCalculatorBot = Class(TTgModule) private FIsCommandWait: Boolean; protected procedure OnUpdate(Sender: TObject; Const Update: TtgUpdate); override; End; implementation uses BI.Expression, System.SysUtils; { TTgWelcomeBot } procedure TTgCalculatorBot.OnUpdate(Sender: TObject; const Update: TtgUpdate); var Cmd: TCommandHelper; Procedure Calculation; var TextExpr: String; Begin FIsCommandWait := False; if Cmd.ParamCount = 0 then TextExpr := Update.Message.Text else TextExpr := Cmd.ParamsToString; try (Sender as TTelegramBot).sendTextMessage(Update.Message.Chat.ID, TExpression.FromString(TextExpr).Value); except on E: Exception do (Sender as TTelegramBot).sendTextMessage(Update.Message.Chat.ID, 'упс, ошибочка вышла: ' + E.ClassName + ' ' + E.Message); end; End; begin Cmd := TCommandHelper.Create(Update.Message.Text); try if Cmd.Command = '/calc' then Begin if Cmd.ParamCount = 0 then Begin FIsCommandWait := true; (Sender as TTelegramBot).sendTextMessage(Update.Message.Chat.ID, 'ожидаю выражение:'); End else Begin Calculation; End; End else if FIsCommandWait then Begin Calculation; End; finally Cmd.Free; end; end; end. Первое на что обращаем внимание -  наш класс TTgCalculatorBot  будет наследоваться от TTgModule, в котором заложен базовый функционал для расширения функционала бота(на данный момент только получение обновлений от сервера).
    В метод OnUpdate будут поставляться обновления, которые приходят от сервера, в нем мы и будем работать. 
    Насчет поля FIsCommandWait. Уж так сложилось - что, как правило, пользователь сразу отправляет боту команду - а потом параметры. Поэтому, если придет поддерживаемая модулем команда - мы устанавливаем это поле в True. Если это поле - правда - значит нужно обработать текст.
    Теперь вернемся к нашему консольному приложению:
    program CalculatorBot; {$APPTYPE CONSOLE} {$R *.res} uses TelegaPi.Bot, TelegaPi.Types, System.SysUtils, Telegram.Plugin.Calculator in 'Telegram.Plugin.Calculator.pas'; Const C_PAUSE_UPDATE = 1000; { 1sec. } Var TelegramBot: TTelegramBot; TelegramCalc: TTgCalculatorBot; Procedure InitRecesive; var Offset: Integer; Updates: TArray<TtgUpdate>; Update: TtgUpdate; Begin Offset := 0; while True do begin Sleep(C_PAUSE_UPDATE); // Update pause Updates := TelegramBot.getUpdates(Offset); // Get updates if Length(Updates) = 0 then Continue; Offset := Updates[High(Updates)].ID + 1; end; End; begin WriteLn('Telegram Calculator Sample'); { Here you Api key } TelegramBot := TTelegramBot.Create({$I ..\telegaToken.inc} ); TelegramCalc := TTgCalculatorBot.Create(TelegramBot); try WriteLn('Bot token: ', TelegramBot.getMe.ID <> -1); InitRecesive; except on E: Exception do WriteLn(E.ClassName, ': ', E.Message); end; TelegramBot.Free; TelegramCalc.Free; end.   TelegramCalc := TTgCalculatorBot.Create(TelegramBot); - во время создания модуля - происходит подписка на сообщения от сервера. Никаких данных программисту передавать не нужно. 
    Далее, что бы консоль сразу же не закрылась - нужно зациклить прием данных от сервера. Пример - в процедуре InitRecesive.
    Что получаем в итоге:

     
    Так же можете сами протестировать бота(если он конечно будет запущен): @test_delphi_api_bot
    Готовый пример: https://bitbucket.org/uasoft/telegapi/src//examples/PluginCalculator/?at=master
  10. Like
    rareMax получил реакцию от МихаилЪ чайковЪ в Telega π - Библиотека для работы с Telegram Bot API в Delphi   
    Автор: Максим Сысоев
    Репозиторий: Github
    Связь со мной: Telegram
     
    Telega π - Библиотека для работы с Telegram Bot API в Delphi
    Библиотека для работы с Telegram Bot API
    Зависимости
    RAD Studio CE  CloudAPI Примеры
    Получение Username бота
    program Project5; {$APPTYPE CONSOLE} {$R *.res} uses TelegaPi.Bot, TelegaPi.Types, System.SysUtils; var Telegram: TTelegramBot; begin Telegram := TTelegramBot.Create({$I TokenTelegramBot.inc}); try { TODO -oUser -cConsole Main : Insert code here } Writeln(Telegram.getMe.Username); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; Telegram.Free; end. Пример автоответчика
    Напишите ему "привет"
    Код: https://gist.github.com/ms301/c7281f443f481115b7643116535e697d  

  11. Like
    rareMax получил реакцию от Superator в Через NetHTTPClient передать фотографию на сервер   
    В общем рабочее время подходит к концу - поэтому держи:
    Function SampleSendFile(Const Url, FileName: String): Boolean; var lHttp: THTTPClient; lSendData: TMultipartFormData; lResponse: IHTTPResponse; Begin lHttp := THTTPClient.Create; lSendData := TMultipartFormData.Create; try lSendData.AddFile('FileField', FileName); lResponse := lHttp.Post(Url, lSendData); Result := lResponse.StatusCode = 200; finally lSendData.Free; lHttp.Free; end; End;  
  12. Like
    rareMax получил реакцию от Евгений Корепов в Telega π - Библиотека для работы с Telegram Bot API в Delphi   
    Мне очень неудобно, что я не обновил статью. На самом деле с этой библиотекой произошло очень много изменений с проектом:
    - переехал на битБакет: https://bitbucket.org/RareGods/cloudapi/src/master/
    -  теперь там не только работа с телеграмом, но и другие сервисы
    -  после выхода Delphi CE позволил себе вырезать работу с сетевыми библиотеками, отличными от System.Net. 
    - пофиксил больше багов чем добавил.
     
    На вскидку это все. На вопросы оперативно отвечаем в телеграм-чате : @CloudAPI. 
  13. Like
    rareMax получил реакцию от Евгений Корепов в Telega π - Библиотека для работы с Telegram Bot API в Delphi   
    Автор: Максим Сысоев
    Репозиторий: Github
    Связь со мной: Telegram
     
    Telega π - Библиотека для работы с Telegram Bot API в Delphi
    Библиотека для работы с Telegram Bot API
    Зависимости
    RAD Studio CE  CloudAPI Примеры
    Получение Username бота
    program Project5; {$APPTYPE CONSOLE} {$R *.res} uses TelegaPi.Bot, TelegaPi.Types, System.SysUtils; var Telegram: TTelegramBot; begin Telegram := TTelegramBot.Create({$I TokenTelegramBot.inc}); try { TODO -oUser -cConsole Main : Insert code here } Writeln(Telegram.getMe.Username); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; Telegram.Free; end. Пример автоответчика
    Напишите ему "привет"
    Код: https://gist.github.com/ms301/c7281f443f481115b7643116535e697d  

  14. Like
    rareMax получил реакцию от x11 в Telega π - Библиотека для работы с Telegram Bot API в Delphi   
    Пропущен тип Telegapi.types или типа того. 
    Вроде писал, что оперативная поддержка в телеграм-чате осуществляется. А на сайте я не постоянно нахожусь.
    Да
    Ты прав, в ближайшее время напишу.
     

    Максим Сысоев?:
    Все еще бета версия. Не стоит меня винить, если в продакшене пойдет что-либо не так библиотекой!
    ⚙️GIT: https://bitbucket.org/RareGods/cloudapi/branch/develop
    ?ZIP: https://bitbucket.org/RareGods/cloudapi/get/develop.zip
    ?Установка: https://bitbucket.org/RareGods/cloudapi/wiki/Установка
    ?Баг-репорт: https://bitbucket.org/RareGods/cloudapi/issues/new. Регистрация необязательна.
    ?Delphi Community Edition: https://www.embarcadero.com/ru/products/delphi/starter (Win32/Win64/iOS/Mac/Android) FREE
  15. Like
    rareMax получил реакцию от x11 в Telega π - Библиотека для работы с Telegram Bot API в Delphi   
    В начале пару новостей: 
    Репозиторий клонируется также на ГитХаб. Можно устанавливать с помощью Delphinus'a Бот калькулятор для Telegram.
    А сейчас мы напишем своего бота, который сможет решать арифметические выражения(и не только).
    Что для этого нужно:
     Telega π - Библиотека для работы с Telegram Bot API в Delphi TeeBI После установки библиотек свыше - создаем новое консольное приложение. Далее создаем новый модуль(unit) и называем его, например, Telegram.Plugin.Calculator
    В этом модуле мы будем писать логику калькулятора, а точнее взаимодействие команд от пользователя и модуля выражений BI.Expression(TeeBI).
    Для наглядности, сразу код модуля:
    unit Telegram.Plugin.Calculator; interface uses TelegAPI.Bot, TelegAPI.Types, TelegAPI.Utils, TelegAPI.Module; Type TTgCalculatorBot = Class(TTgModule) private FIsCommandWait: Boolean; protected procedure OnUpdate(Sender: TObject; Const Update: TtgUpdate); override; End; implementation uses BI.Expression, System.SysUtils; { TTgWelcomeBot } procedure TTgCalculatorBot.OnUpdate(Sender: TObject; const Update: TtgUpdate); var Cmd: TCommandHelper; Procedure Calculation; var TextExpr: String; Begin FIsCommandWait := False; if Cmd.ParamCount = 0 then TextExpr := Update.Message.Text else TextExpr := Cmd.ParamsToString; try (Sender as TTelegramBot).sendTextMessage(Update.Message.Chat.ID, TExpression.FromString(TextExpr).Value); except on E: Exception do (Sender as TTelegramBot).sendTextMessage(Update.Message.Chat.ID, 'упс, ошибочка вышла: ' + E.ClassName + ' ' + E.Message); end; End; begin Cmd := TCommandHelper.Create(Update.Message.Text); try if Cmd.Command = '/calc' then Begin if Cmd.ParamCount = 0 then Begin FIsCommandWait := true; (Sender as TTelegramBot).sendTextMessage(Update.Message.Chat.ID, 'ожидаю выражение:'); End else Begin Calculation; End; End else if FIsCommandWait then Begin Calculation; End; finally Cmd.Free; end; end; end. Первое на что обращаем внимание -  наш класс TTgCalculatorBot  будет наследоваться от TTgModule, в котором заложен базовый функционал для расширения функционала бота(на данный момент только получение обновлений от сервера).
    В метод OnUpdate будут поставляться обновления, которые приходят от сервера, в нем мы и будем работать. 
    Насчет поля FIsCommandWait. Уж так сложилось - что, как правило, пользователь сразу отправляет боту команду - а потом параметры. Поэтому, если придет поддерживаемая модулем команда - мы устанавливаем это поле в True. Если это поле - правда - значит нужно обработать текст.
    Теперь вернемся к нашему консольному приложению:
    program CalculatorBot; {$APPTYPE CONSOLE} {$R *.res} uses TelegaPi.Bot, TelegaPi.Types, System.SysUtils, Telegram.Plugin.Calculator in 'Telegram.Plugin.Calculator.pas'; Const C_PAUSE_UPDATE = 1000; { 1sec. } Var TelegramBot: TTelegramBot; TelegramCalc: TTgCalculatorBot; Procedure InitRecesive; var Offset: Integer; Updates: TArray<TtgUpdate>; Update: TtgUpdate; Begin Offset := 0; while True do begin Sleep(C_PAUSE_UPDATE); // Update pause Updates := TelegramBot.getUpdates(Offset); // Get updates if Length(Updates) = 0 then Continue; Offset := Updates[High(Updates)].ID + 1; end; End; begin WriteLn('Telegram Calculator Sample'); { Here you Api key } TelegramBot := TTelegramBot.Create({$I ..\telegaToken.inc} ); TelegramCalc := TTgCalculatorBot.Create(TelegramBot); try WriteLn('Bot token: ', TelegramBot.getMe.ID <> -1); InitRecesive; except on E: Exception do WriteLn(E.ClassName, ': ', E.Message); end; TelegramBot.Free; TelegramCalc.Free; end.   TelegramCalc := TTgCalculatorBot.Create(TelegramBot); - во время создания модуля - происходит подписка на сообщения от сервера. Никаких данных программисту передавать не нужно. 
    Далее, что бы консоль сразу же не закрылась - нужно зациклить прием данных от сервера. Пример - в процедуре InitRecesive.
    Что получаем в итоге:

     
    Так же можете сами протестировать бота(если он конечно будет запущен): @test_delphi_api_bot
    Готовый пример: https://bitbucket.org/uasoft/telegapi/src//examples/PluginCalculator/?at=master
  16. Like
    rareMax получил реакцию от x11 в Telega π - Библиотека для работы с Telegram Bot API в Delphi   
    Автор: Максим Сысоев
    Репозиторий: Github
    Связь со мной: Telegram
     
    Telega π - Библиотека для работы с Telegram Bot API в Delphi
    Библиотека для работы с Telegram Bot API
    Зависимости
    RAD Studio CE  CloudAPI Примеры
    Получение Username бота
    program Project5; {$APPTYPE CONSOLE} {$R *.res} uses TelegaPi.Bot, TelegaPi.Types, System.SysUtils; var Telegram: TTelegramBot; begin Telegram := TTelegramBot.Create({$I TokenTelegramBot.inc}); try { TODO -oUser -cConsole Main : Insert code here } Writeln(Telegram.getMe.Username); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; Telegram.Free; end. Пример автоответчика
    Напишите ему "привет"
    Код: https://gist.github.com/ms301/c7281f443f481115b7643116535e697d  

  17. Like
    rareMax получил реакцию от Евгений Корепов в [Android] как вы решаете проблему с таймаутом?   
    System.Net.HttpClient.THttpClient попробуй
  18. Like
    rareMax получил реакцию от Yarpda в [Android] как вы решаете проблему с таймаутом?   
    System.Net.HttpClient.THttpClient попробуй
  19. Like
    rareMax получил реакцию от Superator в Как сделать плиточное меню в приложении?   
    ModernListView
    GridLayout(в названии мог ошибиться)
    Либо на скроллБокс кидаешь нужные тебе компоненты.
  20. Like
    rareMax отреагировална dnekrasov в Изменить цвет пикспля на bitmape image   
    var   bmd: TBitmapData;   bmp: TBitmap; c, c1: TAlphaColor; x, y: Integer; ... bmp.Map(TMapAccess.ReadWrite, bmd);   try    c1 := bmd.GetPixel(x, y);    bmd.SetPixel(x, y, c); finally     bmp.Unmap(bmd);   end;  
  21. Like
    rareMax отреагировална AliZairov в Native Android VideoView   
    Привет. Поддерживает прямая и m3u видео ссылку.
  22. Like
    rareMax отреагировална AliZairov в Native Android VideoView   
    Здравствуйте. К сожалению, есть некоторые ошибки.

    1) К сожалению, компонент Align и Anchor не реагирует.
    2) Распространяйте объекты в Layouta и это не работает должным образом.
    3) Если размер видео небольшой, он остается черным, как на картинке.
    if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, FScreenService) then FScale := FScreenService.GetScreenScale else FScale := 1; procedure Load; begin {$IFDEF ANDROID} CallInUIThreadAndWaitFinishing( procedure begin { VideoView } FJVideoParams := TJViewGroup_LayoutParams.JavaClass.init(Round(Width * FScale), Round(Height * FScale)); FJVideoView := TJVideoView.JavaClass.init(TAndroidHelper.Context); FJVideoView.setLayoutParams(FJVideoParams); FJVideoView.setBackgroundColor(TJColor.JavaClass.BLACK); if Visible = True then begin Visible := False; FJVideoView.setVisibility(TJView.JavaClass.VISIBLE); end else begin FJVideoView.setVisibility(TJView.JavaClass.INVISIBLE); end; { Control } FJNativeLayout := TJNativeLayout.JavaClass.Init(TAndroidHelper.Activity, MainActivity.getWindow.getDecorView.getWindowToken); FJNativeLayout.setControl(FJVideoView); FJNativeLayout.setPosition(Round(Position.X * FScale), Round(Position.Y * FScale)); FJNativeLayout.setSize(Round(Width * FScale), Round(Height * FScale)); end); {$ENDIF} end; // http://techslides.com/demos/sample-videos/small.3gp 4) Trackbar не меняет позицию.
    procedure TMain.TrackBar1Change(Sender: TObject); begin Label1.Text := MSToTime(TrackBar1.Value); //V.setPosition(TrackBar1.Value); // Когда вы его активируете, это создает проблемы. end;
  23. Like
    rareMax отреагировална Barbanel в Идентификация устройства   
    Всем доброго времени!
    Как и обещал, выкладываю либы для работы с KeyChain.
    Либы были взяты у братьев-китайцев, ни слова про покупку сказано не было (хотя чтобы выкачать их пришлось заплатить какому-то облачному сервису).
    Использовать просто, за все отвечают три функции: 
    function StoreItemToKeychain(const AServiceName, AKey, AValue: string; const bOverride: Boolean=True): Boolean; function GetItemValueFromKeychain(const AServiceName, AKey: string): string; function DeleteItemFromKeychain(const AServiceName, AKey: string): Boolean; Ну и традиционно нужно подключить саму библиотеку, все находится в аттаче.
    Enjoy! ?
    iOS_KeyChain.zip
  24. Like
    rareMax отреагировална dnekrasov в borlndmm.dll при написании dll   
    Почитайте здесь.
  25. Like
    rareMax получил реакцию от dnekrasov в Проблемы с размерами компонентов.   
    Помимо свойства Align используйте TLayout для группировки компонентов. Приложите простую демку - и возможно вам покажут как сделать пропорциональное изменение дизайна. 
    Еще обратите внимание на компонент TScaledLayout - он изменяет размеры всех дочерних контролов пропорционально изменению своих размеров
×
×
  • Создать...