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

enatechno

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

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

  • Посещение

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

    26

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

  1. Like
    enatechno получил реакцию от HyperZen в [DX10] Drag-and-Drop Пример   
    https://www.youtube.com/watch?v=ta_N6DSi0Xg
    с 22 минуты
  2. Like
    enatechno отреагировална Rusland в Стиль на разных версиях Windows   
    Если стиль везде одинаковый, то можно в Default поместить этот стиль, а остальные удалить
  3. Like
    enatechno получил реакцию от Brovin Yaroslav в Пробежать по компонентам на Layout   
    Родителем (Parent) является Layout. А Owner у Ваших контролов - форма. ComponentCount считается для Owner.
    Создавая кнопки в runtime можете задать:
    aButton := TButton.Create(Layout1); Layout1.Add(aButton); и тогда Layout1.ComponentCount уже не будет равно 0.

    Для перебора в Parent используйте ChildrenCount
     
    for i:=0 to Layout1.ChildrenCount-1 do begin if (Layout1.Children[i] is TButton) or (Layout1.Children[i] is TLabel) then if (TControl(Layout1.Children[i]).Visible) then TControl(Layout1.Children[i]).Width:=50; end;  
  4. Like
    enatechno получил реакцию от Rusland в Пробежать по компонентам на Layout   
    Родителем (Parent) является Layout. А Owner у Ваших контролов - форма. ComponentCount считается для Owner.
    Создавая кнопки в runtime можете задать:
    aButton := TButton.Create(Layout1); Layout1.Add(aButton); и тогда Layout1.ComponentCount уже не будет равно 0.

    Для перебора в Parent используйте ChildrenCount
     
    for i:=0 to Layout1.ChildrenCount-1 do begin if (Layout1.Children[i] is TButton) or (Layout1.Children[i] is TLabel) then if (TControl(Layout1.Children[i]).Visible) then TControl(Layout1.Children[i]).Width:=50; end;  
  5. Like
    enatechno отреагировална zairkz в Не работает IFMXPhoneDialerService?   
    Вообщем так как андройд не поддерживает функцию определения соединения, сделал через журнал звонков
    В Андройде после звонка если было соединение, время звонка будет больше нуля.
    //PhoneDialerService.OnCallStateChanged := MyOnCallStateChanged;
    На Disconnected проверяю журнал звонков, так как бывает не успевает падать информация использую таймер с интервалом 1 секунда, ниже приведен код в нем или iOS соединения и все ок или андройд на дисконекте и пуск таймера.
    procedure TForm_Main.MyOnCallStateChanged(const ACallID: String; const ACallState: TCallState); begin   case ACallState of     TCallState.Connected:       begin  {$IFDEF IOS} TThread.Synchronize(nil, ShowDialDialog); {$ENDIF}       end;     TCallState.Disconnected:       begin {$IFDEF ANDROID} TimerCallCheck.Enabled := true; {$ENDIF}         PhoneDialerService.OnCallStateChanged := nil;       end;   end; end; Пока не добавил такую архитектуру с ТТаском и Синхронизацией были иногда вылеты приложения
    procedure TForm_Main.TimerCallCheckTimer(Sender: TObject); begin   TimerCallCheck.Enabled := false;   TTask.Run(     procedure     var       Dur: Int64;     begin       Dur := CheckStat; //Функция проверки журнала       TThread.Synchronize(nil,         procedure         begin           if Dur = -1 then              TimerCallCheck.Enabled := true           else           begin             TimerCallCheck.Enabled := false;             if Dur > 0 then               ShowDialDialog; //Вызывается форма у меня в приложении           end;         end);     end); end;  
    function TForm_Main.CheckStat: Int64; var   cursor: JCursor;   Dtime, CallDuration: Int64;   JsortOrder, JSelection: String;   wJQueryParams: TJavaObjectArray<JString>; begin   Result := 0;   wJQueryParams := TJavaObjectArray<JString>.Create(4);   wJQueryParams[0] := TJCallLog_Calls.JavaClass.CACHED_NAME;   wJQueryParams[1] := TJCallLog_Calls.JavaClass.NUMBER;   wJQueryParams[2] := TJCallLog_Calls.JavaClass.DURATION;   wJQueryParams[3] := TJCallLog_Calls.JavaClass.DATE;   JsortOrder := 'date DESC LIMIT 1';   Dtime := (DateTimeToUnix(Now, true) - 360) * 1000;  //Последние пять минут   JSelection := 'number = "+77017017708" AND type = 2 AND date > ' + IntToStr(Dtime);   cursor := TAndroidHelper.Activity.getContentResolver.query(TJCallLog_Calls.JavaClass.CONTENT_URI, wJQueryParams,     StringToJString(JSelection), nil, StringToJString(JsortOrder));   if (cursor.getCount > 0) then   begin     while (cursor.moveToNext) do     begin       CallDuration := StrToInt64(JStringToString(cursor.getString(cursor.getColumnIndex(TJCallLog_Calls.JavaClass.DURATION))));       Result := CallDuration;     end;   end   else     Result := -1;   cursor.Close;   FreeAndNil(wJQueryParams); end;  
  6. Like
    enatechno получил реакцию от Brovin Yaroslav в Создать в рантайме перетаскиваемый компонент   
    procedure TForm1.Label7Click(Sender: TObject); var Phase: TCalloutRectangle; begin Phase := crtPhase.Clone(ScrollBox1) as TCalloutRectangle; Phase.OnMouseDown := crtPhaseMouseDown; Phase.OnMouseMove := crtPhaseMouseMove; Phase.Parent := ScrollBox1; Phase.Position.X := crtPhase.Position.X + 10; Phase.Position.Y := crtPhase.Position.Y + 10; Phase.Visible := true; end; Замените у себя эту процедуру и удалите Button1 (как я и сказал выше, TButton не является TShape - поэтому и ошибка).
  7. Like
    enatechno получил реакцию от Rusland в Создать в рантайме перетаскиваемый компонент   
    procedure TForm1.Label7Click(Sender: TObject); var Phase: TCalloutRectangle; begin Phase := crtPhase.Clone(ScrollBox1) as TCalloutRectangle; Phase.OnMouseDown := crtPhaseMouseDown; Phase.OnMouseMove := crtPhaseMouseMove; Phase.Parent := ScrollBox1; Phase.Position.X := crtPhase.Position.X + 10; Phase.Position.Y := crtPhase.Position.Y + 10; Phase.Visible := true; end; Замените у себя эту процедуру и удалите Button1 (как я и сказал выше, TButton не является TShape - поэтому и ошибка).
  8. Like
    enatechno получил реакцию от Dozent в Создать в рантайме перетаскиваемый компонент   
    procedure TForm1.Label7Click(Sender: TObject); var Phase: TCalloutRectangle; begin Phase := crtPhase.Clone(ScrollBox1) as TCalloutRectangle; Phase.OnMouseDown := crtPhaseMouseDown; Phase.OnMouseMove := crtPhaseMouseMove; Phase.Parent := ScrollBox1; Phase.Position.X := crtPhase.Position.X + 10; Phase.Position.Y := crtPhase.Position.Y + 10; Phase.Visible := true; end; Замените у себя эту процедуру и удалите Button1 (как я и сказал выше, TButton не является TShape - поэтому и ошибка).
  9. Like
    enatechno отреагировална Равиль Зарипов (ZuBy) в Delphi 10.1 + iOS 7   
    Seattle -> http://docwiki.embarcadero.com/RADStudio/Seattle/en/Supported_Target_Platforms
    Berlin -> http://docwiki.embarcadero.com/RADStudio/Berlin/en/Supported_Target_Platforms
  10. Like
    enatechno получил реакцию от Kitty в Вопрос Администратору! Какие планы на Россию?   
    Недавно Ярослав писал про https://allsoft.ru/offers/c-builder-berlin-so-skidkoy/?clear_cache=Y
    Смотрели тут?
  11. Like
    enatechno получил реакцию от Евгений Корепов в List box ошибка при создание ListBox1.AddObject();   
    Воспроизводится под Windows и в Seattle и в Berlin.
    1). Добавьте в листбокс 50 TMetropolisUIListBoxItem.
    2). Проскрольте листбокс.
    3). Кликните по любому айтему.
    4). Закройте программу.

    Сбой происходит при закрытии программы: в секции финализации FMX.Forms, а именно в TStyleCache.Clear.
    Если заменить TMetropolisUIListBoxItem на TListBoxItem, сбой не происходит.
    tst_Listbox.zip
  12. Like
    enatechno получил реакцию от Rusland в List box ошибка при создание ListBox1.AddObject();   
    Воспроизводится под Windows и в Seattle и в Berlin.
    1). Добавьте в листбокс 50 TMetropolisUIListBoxItem.
    2). Проскрольте листбокс.
    3). Кликните по любому айтему.
    4). Закройте программу.

    Сбой происходит при закрытии программы: в секции финализации FMX.Forms, а именно в TStyleCache.Clear.
    Если заменить TMetropolisUIListBoxItem на TListBoxItem, сбой не происходит.
    tst_Listbox.zip
  13. Like
    enatechno получил реакцию от Евгений Корепов в как сделать автоскролинг чтобы активный итем был виден ?   
    Активный итем или последний добавленный? На дельфи "скроллировать" можно с помощью TListbox.ScrollToItem(Item). Если последний добавленный, то сначала добавляем, а потом скролл к нему. Например вот так:
     
    Listbox1.BeginUpdate; try aListBoxItem := TListBoxItem.Create(Listbox1); aListBoxItem.Text := 'text ' + random(500).ToString; Listbox1.AddObject(aListBoxItem); finally Listbox1.EndUpdate; end; Listbox1.ScrollToItem(aListBoxItem);  
  14. Like
    enatechno получил реакцию от Rusland в Создание и коррекция кастомных стилей в XE8   
    Похоже Вы разместили Rectangle 'background' поверх других контролов. Попробуйте нажать на нем правой кнопкой мыши и в контекстном меню выбрать Control -> Send To Back
  15. Like
    enatechno получил реакцию от Равиль Зарипов (ZuBy) в как сделать автоскролинг чтобы активный итем был виден ?   
    Активный итем или последний добавленный? На дельфи "скроллировать" можно с помощью TListbox.ScrollToItem(Item). Если последний добавленный, то сначала добавляем, а потом скролл к нему. Например вот так:
     
    Listbox1.BeginUpdate; try aListBoxItem := TListBoxItem.Create(Listbox1); aListBoxItem.Text := 'text ' + random(500).ToString; Listbox1.AddObject(aListBoxItem); finally Listbox1.EndUpdate; end; Listbox1.ScrollToItem(aListBoxItem);  
  16. Like
    enatechno получил реакцию от Kitty в как сделать автоскролинг чтобы активный итем был виден ?   
    Активный итем или последний добавленный? На дельфи "скроллировать" можно с помощью TListbox.ScrollToItem(Item). Если последний добавленный, то сначала добавляем, а потом скролл к нему. Например вот так:
     
    Listbox1.BeginUpdate; try aListBoxItem := TListBoxItem.Create(Listbox1); aListBoxItem.Text := 'text ' + random(500).ToString; Listbox1.AddObject(aListBoxItem); finally Listbox1.EndUpdate; end; Listbox1.ScrollToItem(aListBoxItem);  
  17. Like
    enatechno получил реакцию от Pax Beach в как сделать автоскролинг чтобы активный итем был виден ?   
    Активный итем или последний добавленный? На дельфи "скроллировать" можно с помощью TListbox.ScrollToItem(Item). Если последний добавленный, то сначала добавляем, а потом скролл к нему. Например вот так:
     
    Listbox1.BeginUpdate; try aListBoxItem := TListBoxItem.Create(Listbox1); aListBoxItem.Text := 'text ' + random(500).ToString; Listbox1.AddObject(aListBoxItem); finally Listbox1.EndUpdate; end; Listbox1.ScrollToItem(aListBoxItem);  
  18. Like
    enatechno получил реакцию от chaplin.u@gmail.com в как сделать автоскролинг чтобы активный итем был виден ?   
    Активный итем или последний добавленный? На дельфи "скроллировать" можно с помощью TListbox.ScrollToItem(Item). Если последний добавленный, то сначала добавляем, а потом скролл к нему. Например вот так:
     
    Listbox1.BeginUpdate; try aListBoxItem := TListBoxItem.Create(Listbox1); aListBoxItem.Text := 'text ' + random(500).ToString; Listbox1.AddObject(aListBoxItem); finally Listbox1.EndUpdate; end; Listbox1.ScrollToItem(aListBoxItem);  
  19. Like
    enatechno отреагировална dnekrasov в Создание и коррекция кастомных стилей в XE8   
    Сделайте Background контейнером для Content-а.

  20. Like
    enatechno отреагировална Кривяков Виталий в Некорректный вывод текста под Андроид.   
    Итак, год спустя описываю решение проблемы.  Исследования проводил в Берлине, но думаю рецепт подойдет и для младших версий.
    1. Ошибка существует в файле FMX.TextLayout.GPU, поэтому копируем его в проект.
    2. Убираем мусор при отрисовке кропнутого символа.
    Ищем в файле следующий фрагмент:
     
    ColoredGlyph := TFontGlyphStyle.ColorGlyph in Rec.Glyph.Style; if ColoredGlyph then TCustomCanvasGpu(ACanvas).ModulateColor := $FFFFFFFF; ACanvas.DrawBitmap(Rec.Bitmap, SrcR, R, Opacity); if ColoredGlyph then TCustomCanvasGpu(ACanvas).ModulateColor := LRun.Color; и заменяем его на 
    if not R.IsEmpty then begin // Disable draw empty rect ColoredGlyph := TFontGlyphStyle.ColorGlyph in Rec.Glyph.Style; if ColoredGlyph then TCustomCanvasGpu(ACanvas).ModulateColor := $FFFFFFFF; ACanvas.DrawBitmap(Rec.Bitmap, SrcR, R, Opacity); if ColoredGlyph then TCustomCanvasGpu(ACanvas).ModulateColor := LRun.Color; end; Пояснение: при расчете области отрисовки R символа, мы можем получить "отрицательный размер", где Bottom будет меньше чем Top. Соответсвенно такой же неправильной становиться область источника SrcR и на экран вылазит мусор.
    3. От мусора избавились, но если присмотреться к нижней границе текста, то можно увидеть, что отрезка не ровная, одни символы отрезаны больше, другие меньше. Для этого нужно исправить алгоритм расчета области отсечения. 
    Для этого ищем комментарий  //Checking for lines lower than bottom border - с него начинается ветка, в которую нужно внести изменения.
    Чуть далее ищем код
     
    Rec := AddOrGetChar(nil, Run.Chars[K], ChDic, Run.Font); X := MaxSize.Y - FFrame.Last.TopLeft.Y - Rec.Glyph.VerticalAdvance * FScaleFactor; и меняем его на 
     
    Rec := AddOrGetChar(LayoutCanvas, Run.Chars[K], ChDic, Run.Font); X := MaxSize.Y - FFrame.Last.TopLeft.Y - ((Rec.SrcRect.Height + Rec.Glyph.Origin.Y) * FScaleFactor); Здесь пояснения дать сложнее, скажу только, что разработчики проигнорировали тот момент, что символы имеют разные размеры (например . и Ж) и считают отсечение не по размеру глифа символа а по экранному размеру символа, т.е. он будет одинаковый для всей строки, что неправильно, так как в дальнейшем данное отсечение применяется к глифу символа.
     
    P.S. А куда переехал CodeCentral, не нашел его в Берлине? 
  21. Like
  22. Like
    enatechno отреагировална Rusland в Изменить цвет фона в DesignTime режиме   
    Полагаю что раскрашивается через сменю стиля...  типа у кнопки нажимаем Edit Custom Style, в редакторе удаляем background, ставим вместо него Rectangle, меняем ему Align на Client, StyleName=background, Fill.Color=цвет (ну и Stroke поменять). Перенести Text на Rectangle... как-то так.
    Создать несколько вариантов стиля и в рантайме менять StyleLookup кнопки, не?
  23. Like
    enatechno отреагировална Кривяков Виталий в Зависимость от регистра русских символов при использовании LIKE   
    Добрый день!
    В стандартных компонента есть механизм по встраиванию своих функций в SQLite. 
    ... // создаю встроенную функцию ru_lower F1 := TFDSQLiteFunction.Create(nil); F1.DriverLink := WC1; F1.FunctionName := 'ru_lower'; F1.ArgumentsCount := 1; F1.OnCalculate := ru_lower; ... procedure TORMmanager.ru_lower(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject); begin AOutput.AsString := AInputs[0].AsString.ToLower; end; SQL:
    select name from users where ru_lower(name) like '%иван%'
    Запрос вернет все имена содержащие иван в любом регистре.
  24. Like
    enatechno отреагировална RoschinSpb в "Нестабильный" вызов OnSelectCell в Berlin?   
    А вот есть такая конторка, Microsoft называется, так она целый Excel для мобильников сделала  
    В целом конечно надо с особой осторожностью подходить к использованию таблиц в мобильных устройствах да и вообще учитывать некоторые особенности при разработке интерфейса, но это уже вопросы второго порядка. В идеале к которому мы стремимся: то, что работает на дэсктопе должно работать и на телефоне без переделок.
    OnDblClick в public как был так и остался.
    В следующей версии в Published должны появиться
      TCellClick = procedure(const Column: TColumn; const Row: Integer) of object;     property OnCellClick;     property OnCellDblClick; Будут срабатывать в таком порядке
    OnSelectCell([StringGrid1] 4; 8)
    OnSelChanged([StringGrid1] 4; 8)
    OnCellClick([StringGrid1] Progress; Row: 8)
    OnCellDblClick([StringGrid1] Progress; Row: 8)
    но это секрет и оффтоп в данной теме.
  25. Like
    enatechno получил реакцию от aleksandrguru в Новая БД в Android   
    FDConnection1 := TFDConnection.Create(Self); FDPhysSQLiteDriverLink1 := TFDPhysSQLiteDriverLink.Create(Self); FDGUIxWaitCursor1 := TFDGUIxWaitCursor.Create(Self); FDGUIxWaitCursor1.ScreenCursor := gcrSQLWait; FDGUIxWaitCursor1.Provider := 'FMX'; FDConnection1.DriverName := 'SQLite'; FDConnection1.Params.Values['Database'] := TPath.GetDocumentsPath + PathDelim + 'test.db'; FDConnection1.LoginPrompt := false; FDConnection1.Connected := true; if FDConnection1.Connected then ShowMessage('подключились'); Пример подключения в runtime. Компоненты на форму можно "не садить"
×
×
  • Создать...