Лидеры
Популярный контент
Показан контент с высокой репутацией 06.03.2016 во всех областях
-
Да, потокобезопасный "классовый" метод. Однако, в связи с соседней темой есть важные дополнения: 1. этот метод не записывает преамбулу. 2. Для записи используется кодировка UTF8 3. Метод создает файл с эксклюзивным доступом к нему. Пока метод работает, попытка достучаться до файла (например из другого потока) провалится с выбросом исключения. Кроме того - нежелательно пользоваться методом TFile.AppendAllText без явного указания кодировки (буквально недавно здесь и здесь была куча споров. Жалко, половину комментариев потерли...)1 балл
-
В общем случае - никак. Если файл не содержит преамбулу (1-3 байта) - идентификатор кодировки, то предстоит только догадываться. Если содержит - посмотрите исходники TStringList или TFile.AppendAllText. Вкратце - для автоматического "угадывания" используемой кодировки задействуется TEncoding.GetBufferEncoding1 балл
-
[Android]Каталог, вывод в 2-3 колонки
Равиль Зарипов (ZuBy) отреагировал Andrey Efimov за вопрос
Отдельную тему создавайте (в правилах ясно указано: одна тема-один вопрос), здесь обсуждается другая тема.1 балл -
кстати, в D11 через месяц обещали какие-то вкусные плюшки как раз по ListView items, редактор и что-то там1 балл
-
listBoxItem управление цветом
Равиль Зарипов (ZuBy) отреагировал zairkz за вопрос
На ListView скролл значительно лучше и без лагов, и вообще очень мощный компонент, все равно, рано или поздно вы откажетесь от ListBOX. Кнопку можно разместить стандартным способам в настройках самой ListView. Если же вам нужно сто кнопок в одном Итеме, тогда да придется чуток заморочиться. Во первых надо в настройках ListView в ItemAppearance включить ImageListItemBottomDetailRightButton. Далее в ItemAppearanceObjects -> ItemObjects можете указывать любые настройки, через PlaseOffset.X - Y перемещать текст и детайл текст как хотите и куда хотите, тоже самое с картинкой и кнопкой, менять цвета и шрифты. Можете повесить обработчик в свойствах на OnItemClick, а также нажатие на саму кнопку OnButtonClick. При заполнении Item'ам присваивайте Tag и по ним ориентируйтесь. Далее для покраски Item'ов подключите Хелпер Zuby(все таки не хелпер, а измененный исходник TListView) FMX.ListView.zip, пропишите пару процедур: procedure myDefaultItemColor(const aLV: TListView; const aItemIndex: integer; const aUseCustomColor: Boolean = false); begin with aLV.Items[aItemIndex] do begin Data['aUseCustomColor'] := aUseCustomColor; end; end; /// <summary> устанавливаем кастомный цвет для Item'a </summary> procedure myCustomItemColor(const aLV: TListView; const aItemIndex: integer; const aCustomColor: TAlphaColor; const aUseCustomColor: Boolean = true); begin with aLV.Items[aItemIndex] do begin Data['aUseCustomColor'] := aUseCustomColor; Data['aCustomColor'] := aCustomColor; end; end; Далее к примеру заполняем ListView ListViewPoisk.BeginUpdate; for i := 0 to 15 do begin ListViewPoisk.Items.Insert(0); ListViewPoisk.Items[0].Tag := i; ListViewPoisk.Items[0].Text := 'X_text'; ListViewPoisk.Items[0].Detail := 'X_detail'; ListViewPoisk.Items[0].ButtonText := 'X_buttext'; ListViewPoisk.Items[0].Data['offer'] := 0; //Если нужно хранить не отображаемые данные. ListViewPoisk.Items[0].Bitmap.Assign(Image1.Bitmap); if i mod 2 = 0 then myCustomItemColor(ListViewPoisk, ListViewPoisk.Items[0].Index, TAlphaColors.Lime); // TAlphaColors.Lime можно заменить TAlphaColorF.Create(70 / 255, 130 / 255, 180 / 255, 155 / 255).ToAlphaColor; end; ListViewPoisk.EndUpdate;1 балл -
[TTabControl] При переключении Tabs исчезает вкладка
Равиль Зарипов (ZuBy) отреагировал zairkz за вопрос
Нет не было, но бывают такие аномальные явления, скорее всего из за вспышек на солнце или фаза луны не та. Исходник давай)1 балл -
[Android]Каталог, вывод в 2-3 колонки
Равиль Зарипов (ZuBy) отреагировал zairkz за вопрос
На ListView будет достаточно сложно это реализовать. Попробуйте TPresentedScrollBox и элементы стиля. Стиль нужен: к примеру: Вам необходимо фиксированные размеры панелек, например глобальные переменные ObjectHeight := 205; ObjectWidth := 160; PanHeight := 200; PanWidth := 148; Затем вычислить количество колонок на FormResize, тоже глобальные пр. procedure TForm_main.FormResize(Sender: TObject); begin PrColumns := Floor(Form_main.ClientWidth / ObjectWidth); AllMargins := (Form_main.ClientWidth - (PrColumns * PanWidth)) / (PrColumns + 1); end; Процедура заполнения, здесь только создания панелей в скроллбоксе, я использовал обычный button в виде панельки procedure TForm_main.LoadObject(); var x, i: integer; LT: TLayout; Butt: TButton; begin x := 0; for i := 0 to OBJ.Count - 1 do begin if x mod PrColumns = 0 then begin LT := TLayout.Create(PresentScrolBox); LT.Parent := PresentScrolBox; LT.Position.y := PresentScrolBox.ContentBounds.Height + 100; LT.Align := TAlignLayout.Top; LT.Height := ObjectHeight; LT.HitTest := false; end; Butt:= TButton.Create(LT); Butt.Parent := LT; Butt.Position.x := LT.Width; Butt.Height := PanHeight; Butt.Width := PanWidth; Butt.Align := TAlignLayout.Left; Butt.Margins.Top := (ObjectHeight - PanHeight) / 2; Butt.Margins.Bottom := (ObjectHeight - PanHeight) / 2; Butt.Margins.Left := AllMargins; Butt.StyleLookup := 'buttonx'; Butt.text := ''; Butt.tag := 55; //Пример Butt.TextSettings.WordWrap := True; Butt.OnTap := Form_main.ButObjTap; {$IFDEF MSWINDOWS} Butt.OnClick := Form_main.ButtObjectClick; {$ENDIF} Butt.OnApplyStyleLookup := Form_main.ObjectStyle; x := x + 1; end; end; LT := TLayout.Create(SB_Object); LT.Parent := SB_Object; LT.Position.y := SB_Object.ContentBounds.Height + 100; LT.Align := TAlignLayout.Top; LT.Height := 72; end; После создания заполнять данными необходимо в Butt.OnApplyStyleLookup := Form_main.ObjectStyle; procedure TForm_main.ObjectStyle(Sender: TObject); var i: integer; begin for i := 0 to 9 do if TButton(Sender).tag=i then begin TButton(TButton(Sender).FindStyleResource('btn_add')).tag := i; // TButton(TButton(Sender).FindStyleResource('btn_add')).text := ‘+’; TButton(TButton(Sender).FindStyleResource('btn_add')).OnClick := Form_main.But_Main_Add; TText(TButton(Sender).FindStyleResource('text')).text := 'i = '+inttostr(i); TText(TButton(Sender).FindStyleResource('obj_price')).text := ‘500’; TImage(TButton(Sender).FindStyleResource('img')).Bitmap.Assign(Какой нибудь битмап); break; end; end; Желательно данные и картинки загрузить сперва в Record, затем заполнять их в OnApplyStyleLookup. ХЗ может подойдет вариант, на слабых телефонах лагов не много, но и ListView на слабых подлагивает. Как вариант старое наше с Zuby приложение по доставке еды Gepard, не судите строго мы его забросили): https://play.google.com/store/apps/details?id=kz.vbaze.Gepard1 балл -
Как реализовать это?
Равиль Зарипов (ZuBy) отреагировал zairkz за вопрос
Нужен Timer и ListView Например в ListView -> OnUpdateObjects procedure TForm1.ListViewPoiskUpdateObjects(const Sender: TObject; const AItem: TListViewItem); var aTime: TListitemText; begin aTime := AItem.Objects.FindDrawable('time') as TListitemText; if aTime = nil then begin aTime := TListitemText.Create(AItem); aTime.Name := 'time'; aTime.PlaceOffset.X := 0; aTime.PlaceOffset.Y := 2; aTime.Font.Size := 14; aTime.TextVertAlign := TTextAlign.Center; aTime.TextAlign := TTextAlign.Center; end; aTime.Width := 72; aTime.Height := 20; //Двигаем Text итема с отступом AItem.Objects.TextObject.PlaceOffset.X := aTime.Width + 6; end; И таймер procedure TForm1.Timer1Timer(Sender: TObject); var i: integer; begin if ListView1.ItemCount > 0 then for i := 0 to ListView1.ItemCount - 1 do ListView1.Items[i].Data['time'] := FormatDateTime('ss сек.', Now); end;1 балл -
vkbdhelper - поднятие компонентов над клавиатурой
Равиль Зарипов (ZuBy) отреагировал kami за вопрос
Update. Исправили недостаток на Android 5. Большое спасибо Rusland за тестирование. Итоговый файл прикладываю. По прежнему не рекомендую использовать этот модуль, если создаваемые в runtime контролы ложатся напрямую на форму. Перед написанием претензий, пожалуйста прочитайте known issues в комментарии в начале файла. vkbdhelper.zip1 балл -
1 балл
-
SaveState вам в помощь. А вообще сперва лучше пользуйтесь поиском, это не сложно.1 балл