Лидеры
Популярный контент
Показан контент с высокой репутацией 07.06.2016 во всех областях
-
Возвращаясь к вопросу о подсчете высоты текста TListView
Rusland и 4 других отреагировал Brovin Yaroslav за вопрос
Вот пример вычисления высоты итема. ListViewVariableHeightItems2.zip Я этот пример показывал на лонче в питере.5 баллов -
StringGrid + StringColumn + выравнивание
Евгений Корепов и 4 других отреагировал Равиль Зарипов (ZuBy) за вопрос
отрисовать самому? 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;5 баллов -
Возвращаясь к вопросу о подсчете высоты текста TListView
Brovin Yaroslav и 3 других отреагировал Евгений Корепов за вопрос
Делать было нечего, дело было вечером... Вот попробовал, свою процедуру чуть изменил, добавил константы ширины скроллбара из ListView unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListView.Types, FMX.ListView, FMX.TextLayout, System.StrUtils; const {$IFDEF IOS} DefaultScrollBarWidth = 7; {$ELSE} {$IFDEF MACOS} DefaultScrollBarWidth = 7; {$ENDIF} {$ENDIF} {$IFDEF MSWINDOWS} DefaultScrollBarWidth = 16; {$ENDIF} {$IFDEF ANDROID} DefaultScrollBarWidth = 7; {$ENDIF} type TForm1 = class(TForm) ListView1: TListView; procedure FormCreate(Sender: TObject); procedure ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem); private { Private declarations } public { Public declarations } FTextLayout : TTextLayout; procedure CalculateTListViewItemHeight(Sender: TObject); end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); Var AText : String; begin FTextLayout := TTextLayoutManager.DefaultTextLayout.Create; AText:= 'FMX.Dialogs.MessageDlg - RAD Studio API Documentation ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + 'docwiki.embarcadero.com/.../en/FMX.Dialogs.MessageDlg ' + 'Перевести эту страницу ' + '11 февр. 2016 г. - function MessageDlg(const AMessage: string; const ADialogType: TMsgDlgType; const ... extern DELPHI_PACKAGE int __fastcall MessageDlg _DEPRECATED_ATTRIBUTE1("Use FMX.DialogService methods") ' + 'Перевести эту страницу ' + '11 февр. 2016 г. - function MessageDlg(const AMessage: string; const ADialogType: TMsgDlgType; const ... extern DELPHI_PACKAGE int __fastcall MessageDlg _DEPRECATED_ATTRIBUTE1("Use FMX.DialogService methods") ' + 'Перевести эту страницу ' + '11 февр. 2016 г. - function MessageDlg(const AMessage: string; const ADialogType: TMsgDlgType; const ... extern DELPHI_PACKAGE int __fastcall MessageDlg _DEPRECATED_ATTRIBUTE1("Use FMX.DialogService methods") ' + 'Перевести эту страницу ' + '11 февр. 2016 г. - function MessageDlg(const AMessage: string; const ADialogType: TMsgDlgType; const ... extern DELPHI_PACKAGE int __fastcall MessageDlg _DEPRECATED_ATTRIBUTE1("Use FMX.DialogService methods") ' + '(const System::UnicodeString AMessage, const ... Warning: MessageDlg is deprecated. ***'; with ListView1.Items.Add do Text:=AText; with ListView1.Items.Add do Text:= ReverseString(AText); with ListView1.Items.Add do Text:= AText; end; procedure TForm1.ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem); begin CalculateTListViewItemHeight(AItem); end; procedure TForm1.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 - DefaultScrollBarWidth, 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; end.4 балла -
Возвращаясь к вопросу о подсчете высоты текста TListView
Brovin Yaroslav и 3 других отреагировал AngryOwl за вопрос
Что же касается самой функции, кажется можно чуть проще (где-то на форуме уже вроде был такой код) и он прекрасно работает: 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;4 балла -
Возвращаясь к вопросу о подсчете высоты текста TListView
HyperZen и 2 других отреагировал Равиль Зарипов (ZuBy) за вопрос
Да все верно, нужно отнять ширину скрола если он показан. Для IOS/MacOS/Android ширина составляет 7 пикселей, для Windows - 16. узнать показан ли сейчас скрол думаю не сложно определить, высота контента > высоты компонента3 балла -
И [brunnengi] и [ZuBy] оба правы. В первом случае у TLayout нужно выключить свойсвто HitTest, чтобы сам TLayout не "перекрывал" клики мышь (или тапы) (TLayout позволит "выравнивать" несколько "кнопок" относительно друг друга проще) Во втором случае - все проще (любой лишний компонент на форме, не важно - в составе чего он, - это дополнительная память, а главное - расходы на отрисовку. Порой нам кажется, что вроде на форме и "нет ничего", а если копнуть поглубже - там окажется море того, чего мы не видим, а отрисовывать то их прийдется!). Простой TImage, на мой взгляд, лучше. Но, как мне кажется, в данном случае вовсе не обязательно обрабатывать выравнивание в событии OnResize. Достаточно в DesignTime разместить TImage (все) где нужно и установить его (их) свойство Anchors = [akRight, akBottom] (для Вашего случая)3 балла
-
Возвращаясь к вопросу о подсчете высоты текста TListView
Brovin Yaroslav и 2 других отреагировал AngryOwl за вопрос
Добрый вечер! Не вдавался в проверку кода самой процедуры TextHeight, но мне кажется, что именно в Вашем, конкретном, случае, Вы забываете, что передаете этой функции неверные параметры. TextHeight(AItem.Text, TS, ListView1.Width) В качестве "ширины" по умолчанию Вы передаете значение ширины всего объекта TListView. При том как Ваш объект TListView имеет еще видимый TScrollBar (полосу прокрутки), ширину которой Вы не учитываете и не вычитаете из общей ширины TListView соответственно.3 балла -
Возвращаясь к вопросу о подсчете высоты текста TListView
HyperZen и ещё один отреагировал Равиль Зарипов (ZuBy) за вопрос
Решение может быть следующим: Этот текст без единого переноса, нужно добавить. Разделить текст на две части и посчитать их отдельно, после сложить и дать Itemу высоту2 балла -
Достаточно Hittest=true (он по умолчанию у Label=false)2 балла
-
Прочитать DNS запрос в idUDPServer
Rusland и ещё один отреагировал Евгений Корепов за вопрос
Для начал у вас не правильно работает function ReplaceSpecSymbol, она оставляет спецсимволы в конце строки. Вот накидал правильно работающую: function ReplaceSpecSymbol(S: String): String; var Count : Integer; begin Count:=0; Result:=''; while True do begin Count:=Ord(S.Chars[0]); Result:=Result+S.Substring(1,Count)+'.'; S:=S.Remove(0,Count+1); if Ord(S.Chars[0])=0 Then break; end; Result:=Result.TrimRight(['.']); end; После этого в вашем проекте нормально все ресолвится, но что отсылать в ответ на lookup я не имею представления. Не знаю как заставить IdDNSResolver отдать данные в сыром формате, надо искать и читать документацию. Вот код процедуры, но надо разобраться что слать: procedure TMainForm.IdUDPServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); var S, Domain: String; I : Integer; ABuffer : TIdBytes; begin S:=ReplaceSpecSymbol(BytesToString(AData,12)); Memo_Log.Lines.Add(S); if Pos('in-addr.arpa',S)=0 then begin IdDNSResolver.Resolve(S); for I := 0 to IdDNSResolver.QueryResult.Count-1 do if IdDNSResolver.QueryResult[I].RecType = qtA then begin S:=TARecord(IdDNSResolver.QueryResult[I]).IPAddress; Memo_Log.Lines.Add('IdDNSResolver: '+S); end; // Вот дальше не знаю что именно пересылать // ABuffer:=DNSHeader.GenerateBinaryHeader; // ABuffer:=IdDNSResolver.PlainTextResult; // ABuffer:=ABuffer+IdDNSResolver.InternalQuery; // ABuffer:=IdDNSResolver.InternalQuery; ABinding.Send(ABuffer); end; Вы можете поразбираться с помощью простейшего DNS прокси, по крайней мере будете видеть что идет в запросе и что в ответе. Код ниже, только пропишите глобальную переменную ALocalPort : Integer, для запоминания забинденного порта на 127.0.0.1 procedure TMainForm.IdUDPServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); Const ExternalDNSHost = '8.8.8.8'; LocalHost = '127.0.0.1'; begin if ABinding.PeerIP.Equals(LocalHost) then // если запрос с локального, пересылаем на внешний dns begin ALocalPort:=ABinding.PeerPort; IdUDPServer.SendBuffer(ExternalDNSHost,53,AData); end; if ABinding.PeerIP.Equals(ExternalDNSHost) then // если с внешнего, пересылаем на локальный IdUDPServer.SendBuffer(LocalHost,ALocalPort,AData); exit; end; в коммандной строке используйте "nslookup -retry=1 -timeout=30 google.ru 127.0.0.1 " (один повтор запроса, чтоб не засирать отладку и таймаут сколько нужно секунд, что не отвалился запрос пока будете разбираться)2 балла -
Возвращаясь к вопросу о подсчете высоты текста TListView
Brovin Yaroslav и ещё один отреагировал Евгений Корепов за вопрос
Так весь проект целиков и выложил. В форме только апперанс у ListView выставил в Custom. А куда дели Parent? Это важное свойство хранящее родителя. Может как то переименовали? P.S. Вы можете AListView заменить за свой конкретный ListView, доступ через парент сделал для красоты и универсальности, если несколько ListView в проекте...2 балла -
Короче, нащупал линию поведения. поместил код в OnUpdatingObjects и поставил AHandled:=True; Срабатывает он теперь не при Items.Add, а при первом обращении к Item.Objects ! Будьте внимательны P.S. ItemAppearance можно ставить любой2 балла
-
Возвращаясь к вопросу о подсчете высоты текста TListView
zairkz и ещё один отреагировал Равиль Зарипов (ZuBy) за вопрос
да поместить то не проблема, проблема избавиться от пустого места LVItemHeight.rar2 балла -
Возвращаясь к вопросу о подсчете высоты текста TListView
zairkz и ещё один отреагировал Евгений Корепов за вопрос
Возможно вы не учитывате свойство 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;2 балла -
кнопка поверх ListView
zairkz и ещё один отреагировал Равиль Зарипов (ZuBy) за вопрос
кидаешь TImage без Align'инов и на ресайзе выставляешь позицию кнопке2 балла -
Возможно. Дополнительный файл .so отличается от Вашего тем, что пробел заменен на _. Хотел проверить, но Delphi не дает мне создать проект с пробелом в имени.2 балла
-
Описание TfgFlipView - слайдер изображений
Алмаз Амангельды отреагировал Brovin Yaroslav за тема
Описание: Назначение: Компонент - слайдер, предназначенный для отображения по очереди картинок из набора Поддерживаемые платформы: Windows, OSX, iOS, Android Демо проект: Samples\FlipViewDemo\FlipViewDemo.dproj Доступен с версии: XE8 Возможности: Два принципиально отличающихся способа смены изображения: Эффекты (21 эффект) и сдвиги (горизонтальный и вертикальный)- Mode. Доступно редактирование скорости смены изображений (SlideOptions.Duration) и направления (SlideOptions.Direction) для режима смены изображения путем сдвига. Доступно редактирование скорости смены изображений (EffectOptions.Duration) и эффекта (EffectOptions.Kind) для режима смены изображения при помощи эффектов. Контролирование начала и окончания процесса смены изображений: OnStartChanging, OnFinishChanging Доступен режим Слайдшоу, когда изображения меняются с интервалом (SlideShowOptions.Duration) Для эффектов возможно выбора случайного эффекта на каждый слайд Пролистывание изображений жестом - pan (swype) Отлавливание момент нажатия на слайд OnImageClick Управление видимостью кнопок смены слайдов ShowNavigationButtons1 балл -
Я реализовал пример работы с микрофоном и таймером в Android сервисе, как указано в теме вопроса. Каждый раз, когда вы отправляете в сервис StartCommand или сервис перезапускается, включается запись с микрофона, и сохраняется в каталог с музыков в файл "myrecord.3gp". Надеюсь, мой пример поможет вам создать новые полезные решения. В этом случае пожалуйста делитесь ими с участниками нашего сообщества. Для отладки своих программ на Android используйте запись в LOGI и чтение при помощи monitor.bat (PlatformSDKs\android-sdk-windows\tools). uses ... AndroidApi.JNI.Media, // JMediaRecorder AndroidApi.Timer, // Timer ...; Const TimerInterval = 1000; TimerCounterSecLimit = 10; type TDM = class(TAndroidService) ... private FTimerHandle: Integer; FRecording: Boolean; procedure StartRecord; procedure StopRecord; procedure StartTimer; procedure StopTimer; public FAudioRec: JMediaRecorder; end; procedure Log(const Fmt: string; const Params: array of const); overload; var Msg: string; M: TMarshaller; begin Msg := Format(Fmt, Params); LOGI(M.AsUtf8(Msg).ToPointer); end; procedure Log(const Source: string); overload; var M: TMarshaller; begin LOGI(M.AsUtf8(Source).ToPointer); end; procedure TDM.AndroidServiceCreate(Sender: TObject); begin FTimerHandle := 0; FTimerCounter := 0; FRecording := false; end; procedure TDM.AndroidServiceDestroy(Sender: TObject); begin StopTimer; StopRecord; end; function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin if Intent.getAction.equalsIgnoreCase(StringToJString('StopIntent')) then begin StopTimer; StopRecord; Result := TJService.JavaClass.START_NOT_STICKY; // don't reload service Log('- service stoped', []); end else begin if not FRecording then begin Log('... sound record to be started', []); StartRecord; StartTimer; end; Result := TJService.JavaClass.START_STICKY; // rerun service if it stops Log('+ Service started', []); end; end; procedure TDM.StartRecord; begin StopRecord; FAudioRec := TJMediaRecorder.Create; FAudioRec.setAudioSource(TJMediaRecorder_AudioSource.JavaClass.MIC); FAudioRec.setOutputFormat(TJMediaRecorder_OutputFormat.JavaClass.THREE_GPP); FAudioRec.setAudioEncoder(TJMediaRecorder_AudioEncoder.JavaClass.AMR_NB); FAudioRec.setOutputFile(StringToJString(TPath.Combine(TPath.GetSharedMusicPath, 'myrecord.3gp'))); try FAudioRec.Prepare(); FAudioRec.start; FRecording := True; Log('+ Start record to %s', [TPath.Combine(TPath.GetSharedMusicPath, 'myrecord.3gp')]); except on E: Exception do Log('- Error in mic recording: %s', [E.Message]); end; end; procedure TDM.StopRecord; begin if Assigned(FAudioRec) then begin if FRecording then begin FRecording := false; try FAudioRec.stop(); FAudioRec.release(); Log('- Mic recording is stoped'); except on E: Exception do Log('- Error in mic stop recording: %s', [E.Message]); end; end; end else begin FRecording := false; end; end; procedure TDM.WaitComplete(TimerId: Integer); begin if FTimerCounter < TimerCounterSecLimit then begin Log('+++ Timer is triggered %d time.', [FTimerCounter]); inc(FTimerCounter); end else StopTimer; end; procedure TDM.StartTimer; begin FTimerCounter := 0; if FTimerHandle = 0 then begin FTimerHandle := AndroidTimerCreate; AndroidTimerSetInterval(FTimerHandle, TimerInterval); end; AndroidTimerSetHandler(WaitComplete); Log('+ Timer started', []); end; procedure TDM.StopTimer; begin if FTimerHandle > 0 then begin Log('... MIC recording to be stopped'); StopRecord; AndroidTimerSetHandler(nil); Log('- Timer stoped', []); end; end; end.1 балл
-
Возвращаясь к вопросу о подсчете высоты текста TListView
HyperZen отреагировал Brovin Yaroslav за вопрос
Сразу не могу вам ответить. Но могу предположить, что итем умеет отображать не только текст и имеет возможность различных вариантов расположения отображаемых данных. Именно по этому и нельзя заранее знать, какой способ вы будите использовать.1 балл -
Возвращаясь к вопросу о подсчете высоты текста TListView
HyperZen отреагировал Евгений Корепов за вопрос
У меня не заработал на XE8 к сожалению код. Но принцип тот же самый, разве что не совсем понятно что за "m" // Get layout height Result := Round(Layout.Height); // Add one em to the height Layout.Text := 'm'; Result := Result + Round(Layout.Height); Заметил странность, если установить размер шрифта отличный от стандартного, к примеру 11,99 или 12,01, то все начинает нормально работать, текст влазит. Но размер шрифта на экране в полтора раза меньше "стандартного". Не знаю какой стандартный, но точно не 12, больше похож на 14 или 15. Может из за этого и косяк? В недрах FMX расчет ведется с "стандартным" шрифтом 12, а на экране отрисовывается гораздо более крупным.1 балл -
Возвращаясь к вопросу о подсчете высоты текста TListView
HyperZen отреагировал Евгений Корепов за вопрос
Подтверждаю что на андроиде этот код косячит, выдает высоту процентов на 10-15 меньше нужной. Осталось разобраться почему в других моих проектах все работает нормально. Может действительно из за большого текста с сплошными строками накапливается ошибка? P.S. Заменил текст на кусок из книги, та же самая фигня, обрезает снизу.1 балл -
[Android]Галерея картинок
Kitty отреагировал Равиль Зарипов (ZuBy) за вопрос
У Ярослава есть такой компонент + жесты и будет чудо вот еще рекомендации, чтобы все работало через жесты1 балл -
Электросчетчики "Меркурий" - Отправка (получение) данных с IP адреса
Rusland отреагировал Евгений Корепов за вопрос
А с каким именно прибором вы хотите установить связь? С их роутером VR-006 или с преобразователями интерфейсов VR-001-5 ? Роутер, как я понял настраивается как прозрачный шлюз на преобразователи интерфейсов? Тупо пересылает пакеты, а преобразователи интерфейсов пересылают обратно? Если все так, то протокол TCP/IP. Компонет TIdTCPClient, а лучше TIdTCPServer. Если вы умеете общаться с счетчиком по USB, то есть вариант проще - найдите дешевый телефон с поддержкой OTG (можно найти за тысячи полторы), китайский OTG переходник с подзарядкой и втыкайте USB преобразователя интерфейса (или счетчика, если есть такие) прямо в смартфон. На телефоне пишите приложение, которое будет работать с счетчиком по USB, а отдавать данные как вам удобнее, от смс и email, до http сервера и push сообщения. Весь этот колхоз будет раза в три дешевле колхоза с приведенного вами сайта. Хотя на сайте штуки прикольные, подумаю о покупке некоторых изделий.1 балл -
Проблема решена! Всем спасибо! type TAppearanceObjectsHelper = class helper for TAppearanceObjects function GetParentControl: TControl; property ParentControl: TControl read GetParentControl; end; function TAppearanceObjectsHelper.GetParentControl: TControl; begin Result := OwnerControl; end; Function GetParent(const AListItem: TListViewItem): TListView; begin result := AListItem.Objects.Appearance.ParentControl as TListView; end; И, соответственно, код уважаемого Евгения Корепова претерпевает незначительные изменения: if (Sender is TListViewItem) then begin AListItem := Sender as TListViewItem; if (GetParent(AListItem) is TListView) then AListView:=GetParent(AListItem) as TListView Else Exit; ....1 балл
-
Не помню как там TListView, но наверняка есть что-то типа TListView(_ваш_список_).VScrollBar.Width Точно не буду утверждать, что так. Но получить текущую ширину скрола, думаю, можно. И обойтись без констант. З.Ы. Кстати, они все-равно прописаны в константах, где-то в глобальных модулях...1 балл
-
[TEdit ]смещение текста
Kitty отреагировал Равиль Зарипов (ZuBy) за вопрос
это зависит значит от конкретной модели/клавиатуры попробуйте вырезать все символы #13#10 из текста, при нажатии на Enter1 балл -
Возвращаясь к вопросу о подсчете высоты текста TListView
HyperZen отреагировал Равиль Зарипов (ZuBy) за вопрос
ну так циклом по списку и плюсуйте)1 балл -
Возвращаясь к вопросу о подсчете высоты текста TListView
HyperZen отреагировал Равиль Зарипов (ZuBy) за вопрос
<TListView>.Items.Count * на_высоту_одного_айтема = высота контента <TListView>.Height = высота компонента1 балл -
Ошибки нет, и кликабельности тоже нет. Х Ставил.1 балл
-
кнопка поверх ListView
Равиль Зарипов (ZuBy) отреагировал walexw за вопрос
Вариант ZuBy подошел. Если положить кнопки на панель, то панель закрывает последние строки и по ним не сделать клик. Убирающуюся панель не стал делать, мне надо чтобы кнопка всегда была видна, не убиралась. Круглый имидж запихнул в угол списка, он нормально работает и не мешает выбрать нижнюю строчку. ZuBy спасибо!1 балл -
TScrollbar размер слайдера(ползунка)
Pax Beach отреагировал Brovin Yaroslav за вопрос
Как это не зависит? ScrollBar1.ViewportSize := 50; ScrollBar1.Max := 200; В итоге ползунок по ширине равен 1/4 ширины скроллбара.1 балл -
Новые свойства TImage в Berlin
Евгений Корепов отреагировал Равиль Зарипов (ZuBy) за вопрос
Эти свойства были (в Seattle точно) BitmapMargins - это отступы отрисовки битмапа на холсте MarginsWrapMode - Это используется при изменении BitmapMargins и указывает что делать с этими отступами как-то так, поэксперементируйте. иногда очень весело выглядит1 балл -
Работа со звуком. Запись разговора на телефон
Евгений Корепов отреагировал Pax Beach за вопрос
Данная задача реализуется при помощи Android Services и Broadcast Recievers. Искать можно по ключевым словам "android service audio Recorder" здесь, например вот. Пожалуйста поделитесь полученным решением с нашим сообществом. P.S.: здесь я опубликовал свое решения для записи звука микрофона с таймером при запуске сервиса.1 балл -
Поворот устройства и listView
AngryOwl отреагировал Равиль Зарипов (ZuBy) за вопрос
в конце заполнения ListView нужно сделать <TListView>.Resize;1 балл -
Тут всё зависит от устройства. Обычно к таким устройствам идет в комплекте SDK, и напрямую по TCP/IP с ними никто не работает. Чаще всего это набор функций в DLL, иногда набор ActiveX-контролов, один раз видел как устройство определяется как сетевой диск и работа с его памятью идет как обычная работа с файлами. Но, если Вы все-таки хотите с ним работать напрямую - то у Вас, как минимум, должно быть описание протокола обмена данными с этим устройством - а там уже решать что использовать. Если устройство поддерживает HTTP протокол - то использовать какой-либо HTTP клиент (TIdHTTPClient, TNetHTTPClient и т.п.), если нет - что-то типа TIdTCPClient.1 балл
-
Я не проверял, но попробуйте следующее FMX.Types.VKAutoShowMode := TVKAutoShowMode.Never;1 балл