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

zairkz

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

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

  • Посещение

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

    12

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

  1. Like
    zairkz отреагировална Brovin Yaroslav в Возвращаясь к вопросу о подсчете высоты текста TListView   
    Вот пример вычисления высоты итема. ListViewVariableHeightItems2.zip
    Я этот пример показывал на лонче в питере.
  2. Like
    zairkz отреагировална Равиль Зарипов (ZuBy) в Возвращаясь к вопросу о подсчете высоты текста TListView   
    Решение может быть следующим: Этот текст без единого переноса, нужно добавить. Разделить текст на две части и посчитать их отдельно, после сложить и дать Itemу высоту
  3. Like
    zairkz отреагировална Равиль Зарипов (ZuBy) в Возвращаясь к вопросу о подсчете высоты текста TListView   
    да поместить то не проблема, проблема избавиться от пустого места
    LVItemHeight.rar
  4. Like
    zairkz отреагировална Евгений Корепов в Возвращаясь к вопросу о подсчете высоты текста TListView   
    Возможно вы не учитывате  свойство Trimming, а судя по скринам оно у вас включено.
    Я пользуюсь вот таким кодом, работает идеально на всех платформах.
    procedure TFormMain.CalculateTListViewItemHeight(Sender: TObject); var AListItem: TListViewItem; AListView: TListView; begin if (Sender is TListViewItem) then begin AListItem := Sender as TListViewItem; if (AListItem.Parent is TListView) then AListView:=AListItem.Parent as TListView Else Exit; FTextLayout.BeginUpdate; try FTextLayout.Text:=AListItem.Text; FTextLayout.MaxSize:=TPointF.Create(AListView.Width - AListView.ItemSpaces.Left - AListView.ItemSpaces.Right, 1000); FTextLayout.Font:=AListView.ItemAppearanceObjects.ItemObjects.Text.Font; FTextLayout.WordWrap:=AListView.ItemAppearanceObjects.ItemObjects.Text.WordWrap; FTextLayout.Trimming:=AListView.ItemAppearanceObjects.ItemObjects.Text.Trimming; FTextLayout.HorizontalAlign:=AListView.ItemAppearanceObjects.ItemObjects.Text.TextAlign; FTextLayout.VerticalAlign:=AListView.ItemAppearanceObjects.ItemObjects.Text.TextVertAlign; finally FTextLayout.EndUpdate; end; AListItem.Height:=Round(FTextLayout.Height + AListView.ItemSpaces.Top + AListView.ItemSpaces.Bottom); end; end; При создании формы не забудьте FTextLayout := TTextLayoutManager.DefaultTextLayout.Create;
    Применять вот так:
    procedure TFormMain.ListViewNewsUpdateObjects(const Sender: TObject; const AItem: TListViewItem); begin CalculateTListViewItemHeight(AItem); end;  
  5. Like
    zairkz отреагировална Равиль Зарипов (ZuBy) в кнопка поверх ListView   
    кидаешь TImage без Align'инов и на ресайзе выставляешь позицию кнопке
  6. Like
    zairkz отреагировална AngryOwl в кнопка поверх ListView   
    И [brunnengi] и [ZuBy] оба правы.
    В первом случае у TLayout нужно выключить свойсвто HitTest, чтобы сам TLayout не "перекрывал" клики мышь (или тапы) (TLayout  позволит "выравнивать" несколько "кнопок" относительно друг друга проще)
    Во втором случае - все проще (любой лишний компонент на форме, не важно - в составе чего он, - это дополнительная память, а главное - расходы на отрисовку. Порой нам кажется, что вроде на форме и "нет ничего", а если копнуть поглубже - там окажется море того, чего мы не видим, а отрисовывать то их прийдется!). Простой TImage, на мой взгляд, лучше.
    Но, как мне кажется, в данном случае вовсе не обязательно обрабатывать выравнивание в событии OnResize.
    Достаточно в DesignTime разместить TImage (все) где нужно и установить его (их) свойство Anchors = [akRight, akBottom] (для Вашего случая)
  7. Like
    zairkz отреагировална Равиль Зарипов (ZuBy) в Возвращаясь к вопросу о подсчете высоты текста TListView   
    Да все верно, нужно отнять ширину скрола если он показан.
    Для IOS/MacOS/Android ширина составляет 7 пикселей, для Windows - 16. узнать показан ли сейчас скрол думаю не сложно определить, высота контента > высоты компонента
  8. Like
    zairkz отреагировална Равиль Зарипов (ZuBy) в StringGrid + StringColumn + выравнивание   
    отрисовать самому?
    procedure TFormMain.sGridDrawColumnCell(Sender: TObject; const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF; const Row: integer; const Value: TValue; const State: TGridDrawStates); begin aBounds := Bounds; aBounds.Left := aBounds.Left + 2; Canvas.BeginScene; Canvas.Fill.Color := TAlphaColorRec.Red; Canvas.FillRect(Bounds, 0, 0, AllCorners, 1); Canvas.Fill.Color := TAlphaColorRec.White; Canvas.FillText(aBounds, (Sender as TStringGrid).Cells[1, Row], false, 1, [], TTextAlign.Center, TTextAlign.Center); Canvas.EndScene; end;  
  9. Like
    zairkz отреагировална AngryOwl в Возвращаясь к вопросу о подсчете высоты текста TListView   
    Добрый вечер!
    Не вдавался в проверку кода самой процедуры TextHeight, но мне кажется, что именно в Вашем, конкретном, случае, Вы забываете, что передаете этой функции неверные параметры.
    TextHeight(AItem.Text, TS, ListView1.Width) В качестве "ширины" по умолчанию Вы передаете значение ширины всего объекта TListView. При том как Ваш объект TListView имеет еще видимый TScrollBar (полосу прокрутки), ширину которой Вы не учитываете и не вычитаете из общей ширины TListView соответственно.
  10. Like
    zairkz отреагировална AngryOwl в Возвращаясь к вопросу о подсчете высоты текста TListView   
    Что же касается самой функции, кажется можно чуть проще (где-то на форуме уже вроде был такой код) и он прекрасно работает:
    function GetTextHeight(AText: string; AMaxWidth: Single; AFont: TFont; ATextAlign: TTextAlign): Single; var txt: TText; begin txt := TText.Create(nil); try txt.Align := TAlignLayout.None; txt.VertTextAlign := ATextAlign; txt.HorzTextAlign := TTextAlign.Leading; txt.Font := AFont; txt.WordWrap := True; txt.Width := AMaxWidth; txt.BeginUpdate; txt.Text := AText; txt.EndUpdate; txt.AutoSize := True; Result := txt.Height; finally FreeAndNil(txt); end; end;  
  11. Like
    zairkz получил реакцию от Kitty в [Android] Как свернуть приложение?   
    TAndroidHelper.Activity.moveTaskToBack(true); отправляет приложение в фон, где оно продолжает работать. и при повторном открытие открывается программа так как будто она и не закрывалась. 
  12. Like
    zairkz отреагировална alxsev в Кубики Кликомания (ClickoMania)   
    Платформа: Android
    Тип устройства: смартфон, планшет
    Разрешение экрана: любое
    Описание:
    Цель игры удалить как можно больше квадратиков на поле. Два и более квадратов одного цвета можно удалить на поле, когда они находятся рядом друг с другом. Они исчезают с доски и все остальные камни перемещаются вниз и влево, занимая освободившиеся поля. Если ходов больше нет - игра закончится.

    В меню игры есть обычная игра и игра на время:
    Новая игра - Классическая Кликомания. Удаляем кубики на поле. В игре после последнего хода автоматически начинается новая игра.
    Игра на время - Игра с уровнями прохождений на время. За определенное время нужно набрать определенное количество очков. После набора этого количества вы переходите на новый уровень, где время меньше а набрать очков нужно больше.
    Чем больше уровень, тем сложнее набирать очки.

    В настройках игры выбирается размер игрового поля, цвета ячеек,звуковые эффекты,  а так же наличие специальных камней и бомбочек.

    Разрешения программы - только доступ в интернет для показа рекламного баннера внизу приложения.
    Он не мешает игровому процессу!
    Cсылки на Google Play
    Версия игры с рекламой: Ссылка Платная версия игры без рекламы:  Ссылка   Изображения:
  13. Like
    zairkz получил реакцию от Равиль Зарипов (ZuBy) в [Android] Как свернуть приложение?   
    TAndroidHelper.Activity.moveTaskToBack(true); отправляет приложение в фон, где оно продолжает работать. и при повторном открытие открывается программа так как будто она и не закрывалась. 
  14. Like
    zairkz отреагировална krapotkin в Не запускается приложение под Android   
    думаю, просто связь с сервером нужно устанавливать самому, по кнопочке, а не оставлять на совести загрузчика формы
    при старте любые серверные подключения должны быть Active=false!
  15. Like
    zairkz отреагировална Andrey Efimov в [Android] Как свернуть приложение?   
    Вот так:
    uses   Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers; procedure TForm2.Button1Click(Sender: TObject); var   Intent: JIntent; begin   Intent := TJIntent.Create;   Intent.setAction(TJIntent.JavaClass.ACTION_MAIN); Intent.addCategory(TJIntent.JavaClass.CATEGORY_HOME);   Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);   SharedActivity.startActivity(Intent); end; но на 4.4 поведение немного другое... (Выскакивает табличка с выбором лаунчера). Хотя не известно на всех устройствах так или только у меня...
     
    В справке написано, что должен открываться домашний экран, по всей видимости, тем, у кого стоит несколько Лаунчеров даётся выбор.
  16. Like
    zairkz отреагировална Равиль Зарипов (ZuBy) в Проиграть аудио   
    вот хорошая документация по андроид апи для создания полноценного плеера.
    показано как использовать кастомные звуки.
    а для чего нужны стандартные звуки? 
  17. Like
    zairkz отреагировална AngryOwl в TImage в Base64   
    {$IFDEF ANDROID} function Encode_Stream( AStream: TStream ): string; var LStream: TMemoryStream; begin AStream.Position:= 0; LStream := TMemoryStream.Create; TNetEncoding.Base64.Encode( AStream, LStream ); LStream.Position := 0; Result := ReadStringFromStream(LStream, -1, IndyTextEncoding_8Bit); end; function Decode_Stream( enc_str: string ): TMemoryStream; var LStream: TStringStream; begin Result:= TMemoryStream.Create; LStream:= TStringStream.Create; LStream.WriteString( enc_str ); LStream.Position:= 0; TNetEncoding.Base64.Decode( LStream, Result ); end; {$ELSE} function Encode_Stream(AStream: TStream): string; begin AStream.Position:= 0; Result:= TIdEncoderMIME.EncodeStream(AStream); end; function Decode_Stream(enc_str: string): TMemoryStream; begin Result:= TMemoryStream.Create; TIdDecoderMIME.DecodeStream(enc_str, Result); end; {$ENDIF} function LoadBitmapFromStream(const AStream: TStream; const Bitmap: TBitmap): Boolean; var Bmp: TBitmapSurface; begin Result := False; Bmp := TBitmapSurface.Create; try Bmp.Assign(Bitmap); Result := TBitmapCodecManager.LoadFromStream(AStream, Bmp); Bitmap.Assign(Bmp); finally FreeAndNil(Bmp); end; end; function SaveBitmapToStream(const AStream: TStream; const Bitmap: TBitmap; const Extension: string; SaveParams: PBitmapCodecSaveParams = nil): Boolean; var surf: TBitmapSurface; begin Result := False; surf := TBitmapSurface.Create; surf.Assign(Bitmap); try Result := TBitmapCodecManager.SaveToStream(AStream, surf, Extension, SaveParams); finally surf.Free; end; end; function Bitmap_To_Base64(bmp: TBitmap; const AQuality: Integer = 85): string; var eStream: TMemoryStream; SaveParams: TBitmapCodecSaveParams; begin eStream:= TMemoryStream.Create; SaveParams.Quality := AQuality; SaveBitmapToStream(eStream, bmp, '.jpg', @SaveParams); Result:= Encode_Stream(eStream); eStream.Free; end; function Bitmap_From_Base64(b64_string: string): TBitmap; var eStream: TMemoryStream; begin Result := TBitmap.Create; eStream := Decode_Stream(b64_string); if Assigned(eStream) then try eStream.Position := 0; LoadBitmapFromStream(eStream, Result); finally eStream.free; end; end; Скинул как есть. На цэ желания переводить нет, так-что смотрите сами... Надеюсь разберетесь
  18. Like
    zairkz отреагировална Kitty в [Корпоративное] контроль персонала   
    Мой опыт создания приложения для андроида в С++ Builder Берлин.
    Приложение предназначено для контроля прихода-ухода персонала на работу. Знакомый руководитель стоматологического центра попросил.
    Использовался этот маячок beacon:
    Bytereal-iBeacon
    Обязанности сотрудника при приходе и уходе с работы:
    - сотрудник запускаем мобильное приложение
    - далее подносит телефон к маячку
    Мобильное приложение фиксирует отметку в базу данных SQL lite. Уведомляет пользователя в интерфейсе программы и дополнительным push уведомлением.
    Отметки можно посмотреть на самом телефоне или выслать руководителю по почте. Телефон превращается во что-то вроде магнитной карты учета прихода-ухода с хранением данных. Интерфейс на прилагаемом рисунке.
    Что положительного:
    - Задача решена быстро на с++ и не надо тратить время на изучение чего-то другого. Для корпоративного решения то, что нужно.
    - Студия упала во время разработки только два раза. В С++ Builder XE6-7 при наличии достаточного кол-ва кода в проекте для андроида студия падала каждые две минуты.
    - Учитывая стоимость маячков это перспективная линия для всякого рода приложений  связанных с биконами. Положительный опыт.
    Что отрицательного:
    - При попытке активировать TFDQuery в инспекторе объектов, возникает ошибка LiveBindings и уже нельзя сохранить проект. Только закрытие без сохранения и повторное открытие студии.
    - Не удалось показать картинку на вкладке История. В дизайнере она есть, на устройстве странным образом исчезает. Не победила.
    - Попытка удалить StyleBook и затем настроить новый, привела к тому, что в дизайнере все отлично, а на устройстве стилизация полностью исчезает. Не победила.  Спасла резервная копия приложения.
    - Были мысли расширить приложение, но в текущей версии C++ Builder невозможно создавать сервисы для андроида. Наличие сервиса позволило бы дополнительный не гласный контроль. Например, если человек отлучился уже в течение рабочего дня.
    Судя по дорожной карте и в следующей версии С++ Builder 10.2 в пролете создания сервисов для андроида. 
    Выводы:
    Больше всего времени я тратила не на программирование, а на пункты из отрицательного. Пытаясь понять, что происходит, но безуспешно.
    Поскольку задача все же решена то, в общем, все хорошо, но без полного ощущения счастья.
    Просьба:
    Может что-то посоветуете еще по функционалу или интерфейсу для приложения такого типа? Может, есть что-то полезное, что можно добавить в такой тип мобильного приложения?
    Спасибо.
     

  19. Like
    zairkz отреагировална kami в [android] Как правильно удалять контролы в RunTime(2)?   
    Сперва - Release, потом = nil
    http://fire-monkey.ru/topic/2817-динамическое-созданиеуничтожение/?do=findComment&comment=16461
    Free на мобильных платформах не делает ничего.
    В вашем коде компонент, естественно, будет продолжать находиться - ведь ссылку на него как минимум хранит его Owner, переданный в конструкторе.
  20. Like
    zairkz отреагировална Равиль Зарипов (ZuBy) в Application does not support this device   
    не поддерживается на интелах (официально), но можно
  21. Like
    zairkz отреагировална enatechno в Слишком большой размер приложения.   
    Вы используете пробел в названии проекта?
  22. Like
    zairkz отреагировална Равиль Зарипов (ZuBy) в Трудности при разработке на iOS   
    трудности не в разработке, а в публикации (сертификаты, миллион иконок, тестовые аккаунты для тестеров apple и всякие мелочи)
  23. Like
    zairkz отреагировална asviridenkov в Внутренние гиперссылки   
    THtPanel/THtLabel
    http://delphihtmlcomponents.com/
  24. Like
    zairkz отреагировална Равиль Зарипов (ZuBy) в Что выбрать VCL или FMX?   
  25. Like
    zairkz отреагировална krapotkin в Что выбрать VCL или FMX?   
    http://www.fmxexpress.com/mix-vcl-and-firemonkey-forms-in-delphi-xe5-firemonkey-on-windows/
    и видео
×
×
  • Создать...