-
Постов
135 -
Зарегистрирован
-
Посещение
-
Победитель дней
12
Активность репутации
-
zairkz отреагировална Brovin Yaroslav в Возвращаясь к вопросу о подсчете высоты текста TListView
Вот пример вычисления высоты итема. ListViewVariableHeightItems2.zip
Я этот пример показывал на лонче в питере.
-
zairkz отреагировална Равиль Зарипов (ZuBy) в Возвращаясь к вопросу о подсчете высоты текста TListView
Решение может быть следующим: Этот текст без единого переноса, нужно добавить. Разделить текст на две части и посчитать их отдельно, после сложить и дать Itemу высоту
-
zairkz отреагировална Равиль Зарипов (ZuBy) в Возвращаясь к вопросу о подсчете высоты текста TListView
да поместить то не проблема, проблема избавиться от пустого места
LVItemHeight.rar
-
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;
-
zairkz отреагировална Равиль Зарипов (ZuBy) в кнопка поверх ListView
кидаешь TImage без Align'инов и на ресайзе выставляешь позицию кнопке
-
zairkz отреагировална AngryOwl в кнопка поверх ListView
И [brunnengi] и [ZuBy] оба правы.
В первом случае у TLayout нужно выключить свойсвто HitTest, чтобы сам TLayout не "перекрывал" клики мышь (или тапы) (TLayout позволит "выравнивать" несколько "кнопок" относительно друг друга проще)
Во втором случае - все проще (любой лишний компонент на форме, не важно - в составе чего он, - это дополнительная память, а главное - расходы на отрисовку. Порой нам кажется, что вроде на форме и "нет ничего", а если копнуть поглубже - там окажется море того, чего мы не видим, а отрисовывать то их прийдется!). Простой TImage, на мой взгляд, лучше.
Но, как мне кажется, в данном случае вовсе не обязательно обрабатывать выравнивание в событии OnResize.
Достаточно в DesignTime разместить TImage (все) где нужно и установить его (их) свойство Anchors = [akRight, akBottom] (для Вашего случая)
-
zairkz отреагировална Равиль Зарипов (ZuBy) в Возвращаясь к вопросу о подсчете высоты текста TListView
Да все верно, нужно отнять ширину скрола если он показан.
Для IOS/MacOS/Android ширина составляет 7 пикселей, для Windows - 16. узнать показан ли сейчас скрол думаю не сложно определить, высота контента > высоты компонента
-
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;
-
zairkz отреагировална AngryOwl в Возвращаясь к вопросу о подсчете высоты текста TListView
Добрый вечер!
Не вдавался в проверку кода самой процедуры TextHeight, но мне кажется, что именно в Вашем, конкретном, случае, Вы забываете, что передаете этой функции неверные параметры.
TextHeight(AItem.Text, TS, ListView1.Width) В качестве "ширины" по умолчанию Вы передаете значение ширины всего объекта TListView. При том как Ваш объект TListView имеет еще видимый TScrollBar (полосу прокрутки), ширину которой Вы не учитываете и не вычитаете из общей ширины TListView соответственно.
-
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;
-
zairkz получил реакцию от Kitty в [Android] Как свернуть приложение?
TAndroidHelper.Activity.moveTaskToBack(true); отправляет приложение в фон, где оно продолжает работать. и при повторном открытие открывается программа так как будто она и не закрывалась.
-
zairkz отреагировална alxsev в Кубики Кликомания (ClickoMania)
Платформа: Android
Тип устройства: смартфон, планшет
Разрешение экрана: любое
Описание:
Цель игры удалить как можно больше квадратиков на поле. Два и более квадратов одного цвета можно удалить на поле, когда они находятся рядом друг с другом. Они исчезают с доски и все остальные камни перемещаются вниз и влево, занимая освободившиеся поля. Если ходов больше нет - игра закончится.
В меню игры есть обычная игра и игра на время:
Новая игра - Классическая Кликомания. Удаляем кубики на поле. В игре после последнего хода автоматически начинается новая игра.
Игра на время - Игра с уровнями прохождений на время. За определенное время нужно набрать определенное количество очков. После набора этого количества вы переходите на новый уровень, где время меньше а набрать очков нужно больше.
Чем больше уровень, тем сложнее набирать очки.
В настройках игры выбирается размер игрового поля, цвета ячеек,звуковые эффекты, а так же наличие специальных камней и бомбочек.
Разрешения программы - только доступ в интернет для показа рекламного баннера внизу приложения.
Он не мешает игровому процессу!
Cсылки на Google Play
Версия игры с рекламой: Ссылка Платная версия игры без рекламы: Ссылка Изображения: -
zairkz получил реакцию от Равиль Зарипов (ZuBy) в [Android] Как свернуть приложение?
TAndroidHelper.Activity.moveTaskToBack(true); отправляет приложение в фон, где оно продолжает работать. и при повторном открытие открывается программа так как будто она и не закрывалась.
-
zairkz отреагировална krapotkin в Не запускается приложение под Android
думаю, просто связь с сервером нужно устанавливать самому, по кнопочке, а не оставлять на совести загрузчика формы
при старте любые серверные подключения должны быть Active=false!
-
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 поведение немного другое... (Выскакивает табличка с выбором лаунчера). Хотя не известно на всех устройствах так или только у меня...
В справке написано, что должен открываться домашний экран, по всей видимости, тем, у кого стоит несколько Лаунчеров даётся выбор.
-
zairkz отреагировална Равиль Зарипов (ZuBy) в Проиграть аудио
вот хорошая документация по андроид апи для создания полноценного плеера.
показано как использовать кастомные звуки.
а для чего нужны стандартные звуки?
-
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; Скинул как есть. На цэ желания переводить нет, так-что смотрите сами... Надеюсь разберетесь
-
zairkz отреагировална Kitty в [Корпоративное] контроль персонала
Мой опыт создания приложения для андроида в С++ Builder Берлин.
Приложение предназначено для контроля прихода-ухода персонала на работу. Знакомый руководитель стоматологического центра попросил.
Использовался этот маячок beacon:
Bytereal-iBeacon
Обязанности сотрудника при приходе и уходе с работы:
- сотрудник запускаем мобильное приложение
- далее подносит телефон к маячку
Мобильное приложение фиксирует отметку в базу данных SQL lite. Уведомляет пользователя в интерфейсе программы и дополнительным push уведомлением.
Отметки можно посмотреть на самом телефоне или выслать руководителю по почте. Телефон превращается во что-то вроде магнитной карты учета прихода-ухода с хранением данных. Интерфейс на прилагаемом рисунке.
Что положительного:
- Задача решена быстро на с++ и не надо тратить время на изучение чего-то другого. Для корпоративного решения то, что нужно.
- Студия упала во время разработки только два раза. В С++ Builder XE6-7 при наличии достаточного кол-ва кода в проекте для андроида студия падала каждые две минуты.
- Учитывая стоимость маячков это перспективная линия для всякого рода приложений связанных с биконами. Положительный опыт.
Что отрицательного:
- При попытке активировать TFDQuery в инспекторе объектов, возникает ошибка LiveBindings и уже нельзя сохранить проект. Только закрытие без сохранения и повторное открытие студии.
- Не удалось показать картинку на вкладке История. В дизайнере она есть, на устройстве странным образом исчезает. Не победила.
- Попытка удалить StyleBook и затем настроить новый, привела к тому, что в дизайнере все отлично, а на устройстве стилизация полностью исчезает. Не победила. Спасла резервная копия приложения.
- Были мысли расширить приложение, но в текущей версии C++ Builder невозможно создавать сервисы для андроида. Наличие сервиса позволило бы дополнительный не гласный контроль. Например, если человек отлучился уже в течение рабочего дня.
Судя по дорожной карте и в следующей версии С++ Builder 10.2 в пролете создания сервисов для андроида.
Выводы:
Больше всего времени я тратила не на программирование, а на пункты из отрицательного. Пытаясь понять, что происходит, но безуспешно.
Поскольку задача все же решена то, в общем, все хорошо, но без полного ощущения счастья.
Просьба:
Может что-то посоветуете еще по функционалу или интерфейсу для приложения такого типа? Может, есть что-то полезное, что можно добавить в такой тип мобильного приложения?
Спасибо.
-
zairkz отреагировална kami в [android] Как правильно удалять контролы в RunTime(2)?
Сперва - Release, потом = nil
http://fire-monkey.ru/topic/2817-динамическое-созданиеуничтожение/?do=findComment&comment=16461
Free на мобильных платформах не делает ничего.
В вашем коде компонент, естественно, будет продолжать находиться - ведь ссылку на него как минимум хранит его Owner, переданный в конструкторе.
-
zairkz отреагировална Равиль Зарипов (ZuBy) в Application does not support this device
не поддерживается на интелах (официально), но можно
-
zairkz отреагировална enatechno в Слишком большой размер приложения.
Вы используете пробел в названии проекта?
-
zairkz отреагировална Равиль Зарипов (ZuBy) в Трудности при разработке на iOS
трудности не в разработке, а в публикации (сертификаты, миллион иконок, тестовые аккаунты для тестеров apple и всякие мелочи)
-
zairkz отреагировална asviridenkov в Внутренние гиперссылки
THtPanel/THtLabel
http://delphihtmlcomponents.com/
-
-
zairkz отреагировална krapotkin в Что выбрать VCL или FMX?
http://www.fmxexpress.com/mix-vcl-and-firemonkey-forms-in-delphi-xe5-firemonkey-on-windows/
и видео