-
Постов
181 -
Зарегистрирован
-
Посещение
-
Победитель дней
26
Активность репутации
-
enatechno получил реакцию от HyperZen в [DX10] Drag-and-Drop Пример
https://www.youtube.com/watch?v=ta_N6DSi0Xg
с 22 минуты
-
enatechno отреагировална Rusland в Стиль на разных версиях Windows
Если стиль везде одинаковый, то можно в Default поместить этот стиль, а остальные удалить
-
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;
-
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;
-
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;
-
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 - поэтому и ошибка).
-
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 - поэтому и ошибка).
-
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 - поэтому и ошибка).
-
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
-
enatechno получил реакцию от Kitty в Вопрос Администратору! Какие планы на Россию?
Недавно Ярослав писал про https://allsoft.ru/offers/c-builder-berlin-so-skidkoy/?clear_cache=Y
Смотрели тут?
-
enatechno получил реакцию от Евгений Корепов в List box ошибка при создание ListBox1.AddObject();
Воспроизводится под Windows и в Seattle и в Berlin.
1). Добавьте в листбокс 50 TMetropolisUIListBoxItem.
2). Проскрольте листбокс.
3). Кликните по любому айтему.
4). Закройте программу.
Сбой происходит при закрытии программы: в секции финализации FMX.Forms, а именно в TStyleCache.Clear.
Если заменить TMetropolisUIListBoxItem на TListBoxItem, сбой не происходит.
tst_Listbox.zip
-
enatechno получил реакцию от Rusland в List box ошибка при создание ListBox1.AddObject();
Воспроизводится под Windows и в Seattle и в Berlin.
1). Добавьте в листбокс 50 TMetropolisUIListBoxItem.
2). Проскрольте листбокс.
3). Кликните по любому айтему.
4). Закройте программу.
Сбой происходит при закрытии программы: в секции финализации FMX.Forms, а именно в TStyleCache.Clear.
Если заменить TMetropolisUIListBoxItem на TListBoxItem, сбой не происходит.
tst_Listbox.zip
-
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);
-
enatechno получил реакцию от Rusland в Создание и коррекция кастомных стилей в XE8
Похоже Вы разместили Rectangle 'background' поверх других контролов. Попробуйте нажать на нем правой кнопкой мыши и в контекстном меню выбрать Control -> Send To Back
-
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);
-
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);
-
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);
-
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);
-
enatechno отреагировална dnekrasov в Создание и коррекция кастомных стилей в XE8
Сделайте Background контейнером для Content-а.
-
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, не нашел его в Берлине?
-
enatechno отреагировална Кривяков Виталий в Зависимость от регистра русских символов при использовании LIKE
Не вопрос.
SQLITE.zip
-
enatechno отреагировална Rusland в Изменить цвет фона в DesignTime режиме
Полагаю что раскрашивается через сменю стиля... типа у кнопки нажимаем Edit Custom Style, в редакторе удаляем background, ставим вместо него Rectangle, меняем ему Align на Client, StyleName=background, Fill.Color=цвет (ну и Stroke поменять). Перенести Text на Rectangle... как-то так.
Создать несколько вариантов стиля и в рантайме менять StyleLookup кнопки, не?
-
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 '%иван%'
Запрос вернет все имена содержащие иван в любом регистре.
-
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)
но это секрет и оффтоп в данной теме.
-
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. Компоненты на форму можно "не садить"