Здравствуйте! Подскажите пожалуйста способ поменять цвет фона у ListViewItem'а. С ListBox'om все просто, можно через стили все сделать, добавить например RectAngle в стили, и использовать его в RunTime, а как же быть с ListViewItem, ведь это не контрол? Использую модуль из примеров MultiDetailAppearanceU прям то что мне нужно. Мб как-то туда можно добавить что-то? у меня ничего не получается в StyleBook (использую iOSBlack.fsf) в "listviewstyle.itembackground" есть свойство Color, но естественно оно меняет сразу у всех итемов стиль, и в рантайме не получается кстати поменять почему-то этот цвет.
unit MultiDetailAppearanceU;
interface
uses FMX.ListView, FMX.ListView.Types, System.Classes, System.SysUtils,
FMX.Types, System.UITypes, FMX.MobilePreview;
type
TMultiDetailAppearanceNames = class
public const
ListItem = 'MultiDetailItem';
ListItemCheck = ListItem + 'ShowCheck';
ListItemDelete = ListItem + 'Delete';
Detail1 = 'det1'; // Name of MultiDetail object/data
Detail2 = 'det2';
Detail3 = 'det3';
end;
implementation
uses System.Math, System.Rtti;
type
TMultiDetailItemAppearance = class(TPresetItemObjects)
public const
cTextMarginAccessory = 8;
cDefaultImagePlaceOffsetX = -3;
cDefaultImageTextPlaceOffsetX = 4;
cDefaultHeight = 80;
cDefaultImageWidth = 50;
cDefaultImageHeight = 70;
private
FMultiDetail1: TTextObjectAppearance;
FMultiDetail2: TTextObjectAppearance;
FMultiDetail3: TTextObjectAppearance;
procedure SetMultiDetail1(const Value: TTextObjectAppearance);
procedure SetMultiDetail2(const Value: TTextObjectAppearance);
procedure SetMultiDetail3(const Value: TTextObjectAppearance);
protected
function DefaultHeight: Integer; override;
procedure UpdateSizes; override;
function GetGroupClass: TPresetItemObjects.TGroupClass; override;
procedure SetObjectData(const AListViewItem: TListViewItem; const AIndex: string; const AValue: TValue; var AHandled: Boolean); override;
public
constructor Create; override;
destructor Destroy; override;
published
property Image;
property MultiDetail1: TTextObjectAppearance read FMultiDetail1 write SetMultiDetail1;
property MultiDetail2: TTextObjectAppearance read FMultiDetail2 write SetMultiDetail2;
property MultiDetail3: TTextObjectAppearance read FMultiDetail3 write SetMultiDetail3;
property Accessory;
end;
TMultiDetailDeleteAppearance = class(TMultiDetailItemAppearance)
private const
cDefaultGlyph = TGlyphButtonType.Delete;
public
constructor Create; override;
published
property GlyphButton;
end;
TMultiDetailShowCheckAppearance = class(TMultiDetailItemAppearance)
private const
cDefaultGlyph = TGlyphButtonType.Checkbox;
public
constructor Create; override;
published
property GlyphButton;
end;
const
cMultiDetail1Member = 'Detail1';
cMultiDetail2Member = 'Detail2';
cMultiDetail3Member = 'Detail3';
constructor TMultiDetailItemAppearance.Create;
begin
inherited;
Accessory.DefaultValues.AccessoryType := TAccessoryType.More;
Accessory.DefaultValues.Visible := True;
Accessory.RestoreDefaults;
Text.DefaultValues.VertAlign := TListItemAlign.Trailing;
Text.DefaultValues.TextVertAlign := TTextAlign.Leading;
Text.DefaultValues.Height := 76; // Item will be bottom aligned, with text top aligned
Text.DefaultValues.Visible := True;
Text.RestoreDefaults;
FMultiDetail1 := TTextObjectAppearance.Create;
FMultiDetail1.Name := TMultiDetailAppearanceNames.Detail1;
FMultiDetail1.DefaultValues.Assign(Text.DefaultValues); // Start with same defaults as Text object
FMultiDetail1.DefaultValues.Height := 56; // Move text down
FMultiDetail1.DefaultValues.IsDetailText := True; // Use detail font
FMultiDetail1.RestoreDefaults;
FMultiDetail1.OnChange := Self.ItemPropertyChange;
FMultiDetail1.Owner := Self;
FMultiDetail2 := TTextObjectAppearance.Create;
FMultiDetail2.Name := TMultiDetailAppearanceNames.Detail2;
FMultiDetail2.DefaultValues.Assign(FMultiDetail1.DefaultValues); // Start with same defaults as Text object
FMultiDetail2.DefaultValues.Height := 38; // Move text down
FMultiDetail2.RestoreDefaults;
FMultiDetail2.OnChange := Self.ItemPropertyChange;
FMultiDetail2.Owner := Self;
FMultiDetail3 := TTextObjectAppearance.Create;
FMultiDetail3.Name := TMultiDetailAppearanceNames.Detail3;
FMultiDetail3.DefaultValues.Assign(FMultiDetail2.DefaultValues); // Start with same defaults as Text object
FMultiDetail3.DefaultValues.Height := 20; // Move text down
FMultiDetail3.RestoreDefaults;
FMultiDetail3.OnChange := Self.ItemPropertyChange;
FMultiDetail3.Owner := Self;
// Define livebindings members that make up MultiDetail
FMultiDetail1.DataMembers :=
TObjectAppearance.TDataMembers.Create(
TObjectAppearance.TDataMember.Create(
cMultiDetail1Member, // Displayed by LiveBindings
Format('Data["%s"]', [TMultiDetailAppearanceNames.Detail1]))); // Expression to access value from TListViewItem
FMultiDetail2.DataMembers :=
TObjectAppearance.TDataMembers.Create(
TObjectAppearance.TDataMember.Create(
cMultiDetail2Member, // Displayed by LiveBindings
Format('Data["%s"]', [TMultiDetailAppearanceNames.Detail2]))); // Expression to access value from TListViewItem
FMultiDetail3.DataMembers :=
TObjectAppearance.TDataMembers.Create(
TObjectAppearance.TDataMember.Create(
cMultiDetail3Member, // Displayed by LiveBindings
Format('Data["%s"]', [TMultiDetailAppearanceNames.Detail3]))); // Expression to access value from TListViewItem
Image.DefaultValues.Width := cDefaultImageWidth;
Image.DefaultValues.Height := cDefaultImageHeight;
Image.RestoreDefaults;
GlyphButton.DefaultValues.VertAlign := TListItemAlign.Center;
GlyphButton.RestoreDefaults;
// Define the appearance objects
AddObject(Text, True);
AddObject(MultiDetail1, True);
AddObject(MultiDetail2, True);
AddObject(MultiDetail3, True);
AddObject(Image, True);
AddObject(Accessory, True);
AddObject(GlyphButton, IsItemEdit); // GlyphButton is only visible when in edit mode
end;
constructor TMultiDetailDeleteAppearance.Create;
begin
inherited;
GlyphButton.DefaultValues.ButtonType := cDefaultGlyph;
GlyphButton.DefaultValues.Visible := True;
GlyphButton.RestoreDefaults;
end;
constructor TMultiDetailShowCheckAppearance.Create;
begin
inherited;
GlyphButton.DefaultValues.ButtonType := cDefaultGlyph;
GlyphButton.DefaultValues.Visible := True;
GlyphButton.RestoreDefaults;
end;
function TMultiDetailItemAppearance.DefaultHeight: Integer;
begin
Result := cDefaultHeight;
end;
destructor TMultiDetailItemAppearance.Destroy;
begin
FMultiDetail1.Free;
FMultiDetail2.Free;
FMultiDetail3.Free;
inherited;
end;
procedure TMultiDetailItemAppearance.SetMultiDetail1(
const Value: TTextObjectAppearance);
begin
FMultiDetail1.Assign(Value);
end;
procedure TMultiDetailItemAppearance.SetMultiDetail2(
const Value: TTextObjectAppearance);
begin
FMultiDetail2.Assign(Value);
end;
procedure TMultiDetailItemAppearance.SetMultiDetail3(
const Value: TTextObjectAppearance);
begin
FMultiDetail3.Assign(Value);
end;
procedure TMultiDetailItemAppearance.SetObjectData(
const AListViewItem: TListViewItem; const AIndex: string;
const AValue: TValue; var AHandled: Boolean);
begin
inherited;
end;
function TMultiDetailItemAppearance.GetGroupClass: TPresetItemObjects.TGroupClass;
begin
Result := TMultiDetailItemAppearance;
end;
procedure TMultiDetailItemAppearance.UpdateSizes;
var
LOuterHeight: Single;
LOuterWidth: Single;
LInternalWidth: Single;
LImagePlaceOffset: Single;
LImageTextPlaceOffset: Single;
begin
BeginUpdate;
try
inherited;
// Update the widths and positions of renderening objects within a TListViewItem
LOuterHeight := Height - Owner.ItemSpaces.Top - Owner.ItemSpaces.Bottom;
LOuterWidth := Owner.Width - Owner.ItemSpaces.Left - Owner.ItemSpaces.Right;
if Image.ActualWidth = 0 then
begin
LImagePlaceOffset := 0;
LImageTextPlaceOffset := 0;
end
else
begin
LImagePlaceOffset := cDefaultImagePlaceOffsetX;
LImageTextPlaceOffset := cDefaultImageTextPlaceOffsetX;
end;
Image.InternalPlaceOffset.X := GlyphButton.ActualWidth + LImagePlaceOffset;
if Image.ActualWidth > 0 then
Text.InternalPlaceOffset.X :=
Image.ActualPlaceOffset.X + Image.ActualWidth + LImageTextPlaceOffset
else
Text.InternalPlaceOffset.X :=
0 + GlyphButton.ActualWidth;
MultiDetail1.InternalPlaceOffset.X := Text.InternalPlaceOffset.X;
MultiDetail2.InternalPlaceOffset.X := Text.InternalPlaceOffset.X;
MultiDetail3.InternalPlaceOffset.X := Text.InternalPlaceOffset.X;
LInternalWidth := LOuterWidth - Text.ActualPlaceOffset.X - Accessory.ActualWidth;
if Accessory.ActualWidth > 0 then
LInternalWidth := LInternalWidth - cTextMarginAccessory;
Text.InternalWidth := Max(1, LInternalWidth);
MultiDetail1.InternalWidth := Text.InternalWidth;
MultiDetail2.InternalWidth := Text.InternalWidth;
MultiDetail3.InternalWidth := Text.InternalWidth;
finally
EndUpdate;
end;
end;
type
TOption = TCustomListView.TRegisterAppearanceOption;
const
sThisUnit = 'MultiDetailAppearanceU'; // Will be added to the uses list when appearance is used
initialization
// MultiDetailItem group
TCustomListView.RegisterAppearance(
TMultiDetailItemAppearance, TMultiDetailAppearanceNames.ListItem,
[TOption.Item], sThisUnit);
TCustomListView.RegisterAppearance(
TMultiDetailDeleteAppearance, TMultiDetailAppearanceNames.ListItemDelete,
[TOption.ItemEdit], sThisUnit);
TCustomListView.RegisterAppearance(
TMultiDetailShowCheckAppearance, TMultiDetailAppearanceNames.ListItemCheck,
[TOption.ItemEdit], sThisUnit);
finalization
TCustomListView.UnregisterAppearances(
TArray<TCustomListView.TItemAppearanceObjectsClass>.Create(
TMultiDetailItemAppearance, TMultiDetailDeleteAppearance,
TMultiDetailShowCheckAppearance));
end.
Вопрос
xenon54
Здравствуйте! Подскажите пожалуйста способ поменять цвет фона у ListViewItem'а. С ListBox'om все просто, можно через стили все сделать, добавить например RectAngle в стили, и использовать его в RunTime, а как же быть с ListViewItem, ведь это не контрол? Использую модуль из примеров MultiDetailAppearanceU прям то что мне нужно. Мб как-то туда можно добавить что-то? у меня ничего не получается
в StyleBook (использую iOSBlack.fsf) в "listviewstyle.itembackground" есть свойство Color, но естественно оно меняет сразу у всех итемов стиль, и в рантайме не получается кстати поменять почему-то этот цвет.
unit MultiDetailAppearanceU; interface uses FMX.ListView, FMX.ListView.Types, System.Classes, System.SysUtils, FMX.Types, System.UITypes, FMX.MobilePreview; type TMultiDetailAppearanceNames = class public const ListItem = 'MultiDetailItem'; ListItemCheck = ListItem + 'ShowCheck'; ListItemDelete = ListItem + 'Delete'; Detail1 = 'det1'; // Name of MultiDetail object/data Detail2 = 'det2'; Detail3 = 'det3'; end; implementation uses System.Math, System.Rtti; type TMultiDetailItemAppearance = class(TPresetItemObjects) public const cTextMarginAccessory = 8; cDefaultImagePlaceOffsetX = -3; cDefaultImageTextPlaceOffsetX = 4; cDefaultHeight = 80; cDefaultImageWidth = 50; cDefaultImageHeight = 70; private FMultiDetail1: TTextObjectAppearance; FMultiDetail2: TTextObjectAppearance; FMultiDetail3: TTextObjectAppearance; procedure SetMultiDetail1(const Value: TTextObjectAppearance); procedure SetMultiDetail2(const Value: TTextObjectAppearance); procedure SetMultiDetail3(const Value: TTextObjectAppearance); protected function DefaultHeight: Integer; override; procedure UpdateSizes; override; function GetGroupClass: TPresetItemObjects.TGroupClass; override; procedure SetObjectData(const AListViewItem: TListViewItem; const AIndex: string; const AValue: TValue; var AHandled: Boolean); override; public constructor Create; override; destructor Destroy; override; published property Image; property MultiDetail1: TTextObjectAppearance read FMultiDetail1 write SetMultiDetail1; property MultiDetail2: TTextObjectAppearance read FMultiDetail2 write SetMultiDetail2; property MultiDetail3: TTextObjectAppearance read FMultiDetail3 write SetMultiDetail3; property Accessory; end; TMultiDetailDeleteAppearance = class(TMultiDetailItemAppearance) private const cDefaultGlyph = TGlyphButtonType.Delete; public constructor Create; override; published property GlyphButton; end; TMultiDetailShowCheckAppearance = class(TMultiDetailItemAppearance) private const cDefaultGlyph = TGlyphButtonType.Checkbox; public constructor Create; override; published property GlyphButton; end; const cMultiDetail1Member = 'Detail1'; cMultiDetail2Member = 'Detail2'; cMultiDetail3Member = 'Detail3'; constructor TMultiDetailItemAppearance.Create; begin inherited; Accessory.DefaultValues.AccessoryType := TAccessoryType.More; Accessory.DefaultValues.Visible := True; Accessory.RestoreDefaults; Text.DefaultValues.VertAlign := TListItemAlign.Trailing; Text.DefaultValues.TextVertAlign := TTextAlign.Leading; Text.DefaultValues.Height := 76; // Item will be bottom aligned, with text top aligned Text.DefaultValues.Visible := True; Text.RestoreDefaults; FMultiDetail1 := TTextObjectAppearance.Create; FMultiDetail1.Name := TMultiDetailAppearanceNames.Detail1; FMultiDetail1.DefaultValues.Assign(Text.DefaultValues); // Start with same defaults as Text object FMultiDetail1.DefaultValues.Height := 56; // Move text down FMultiDetail1.DefaultValues.IsDetailText := True; // Use detail font FMultiDetail1.RestoreDefaults; FMultiDetail1.OnChange := Self.ItemPropertyChange; FMultiDetail1.Owner := Self; FMultiDetail2 := TTextObjectAppearance.Create; FMultiDetail2.Name := TMultiDetailAppearanceNames.Detail2; FMultiDetail2.DefaultValues.Assign(FMultiDetail1.DefaultValues); // Start with same defaults as Text object FMultiDetail2.DefaultValues.Height := 38; // Move text down FMultiDetail2.RestoreDefaults; FMultiDetail2.OnChange := Self.ItemPropertyChange; FMultiDetail2.Owner := Self; FMultiDetail3 := TTextObjectAppearance.Create; FMultiDetail3.Name := TMultiDetailAppearanceNames.Detail3; FMultiDetail3.DefaultValues.Assign(FMultiDetail2.DefaultValues); // Start with same defaults as Text object FMultiDetail3.DefaultValues.Height := 20; // Move text down FMultiDetail3.RestoreDefaults; FMultiDetail3.OnChange := Self.ItemPropertyChange; FMultiDetail3.Owner := Self; // Define livebindings members that make up MultiDetail FMultiDetail1.DataMembers := TObjectAppearance.TDataMembers.Create( TObjectAppearance.TDataMember.Create( cMultiDetail1Member, // Displayed by LiveBindings Format('Data["%s"]', [TMultiDetailAppearanceNames.Detail1]))); // Expression to access value from TListViewItem FMultiDetail2.DataMembers := TObjectAppearance.TDataMembers.Create( TObjectAppearance.TDataMember.Create( cMultiDetail2Member, // Displayed by LiveBindings Format('Data["%s"]', [TMultiDetailAppearanceNames.Detail2]))); // Expression to access value from TListViewItem FMultiDetail3.DataMembers := TObjectAppearance.TDataMembers.Create( TObjectAppearance.TDataMember.Create( cMultiDetail3Member, // Displayed by LiveBindings Format('Data["%s"]', [TMultiDetailAppearanceNames.Detail3]))); // Expression to access value from TListViewItem Image.DefaultValues.Width := cDefaultImageWidth; Image.DefaultValues.Height := cDefaultImageHeight; Image.RestoreDefaults; GlyphButton.DefaultValues.VertAlign := TListItemAlign.Center; GlyphButton.RestoreDefaults; // Define the appearance objects AddObject(Text, True); AddObject(MultiDetail1, True); AddObject(MultiDetail2, True); AddObject(MultiDetail3, True); AddObject(Image, True); AddObject(Accessory, True); AddObject(GlyphButton, IsItemEdit); // GlyphButton is only visible when in edit mode end; constructor TMultiDetailDeleteAppearance.Create; begin inherited; GlyphButton.DefaultValues.ButtonType := cDefaultGlyph; GlyphButton.DefaultValues.Visible := True; GlyphButton.RestoreDefaults; end; constructor TMultiDetailShowCheckAppearance.Create; begin inherited; GlyphButton.DefaultValues.ButtonType := cDefaultGlyph; GlyphButton.DefaultValues.Visible := True; GlyphButton.RestoreDefaults; end; function TMultiDetailItemAppearance.DefaultHeight: Integer; begin Result := cDefaultHeight; end; destructor TMultiDetailItemAppearance.Destroy; begin FMultiDetail1.Free; FMultiDetail2.Free; FMultiDetail3.Free; inherited; end; procedure TMultiDetailItemAppearance.SetMultiDetail1( const Value: TTextObjectAppearance); begin FMultiDetail1.Assign(Value); end; procedure TMultiDetailItemAppearance.SetMultiDetail2( const Value: TTextObjectAppearance); begin FMultiDetail2.Assign(Value); end; procedure TMultiDetailItemAppearance.SetMultiDetail3( const Value: TTextObjectAppearance); begin FMultiDetail3.Assign(Value); end; procedure TMultiDetailItemAppearance.SetObjectData( const AListViewItem: TListViewItem; const AIndex: string; const AValue: TValue; var AHandled: Boolean); begin inherited; end; function TMultiDetailItemAppearance.GetGroupClass: TPresetItemObjects.TGroupClass; begin Result := TMultiDetailItemAppearance; end; procedure TMultiDetailItemAppearance.UpdateSizes; var LOuterHeight: Single; LOuterWidth: Single; LInternalWidth: Single; LImagePlaceOffset: Single; LImageTextPlaceOffset: Single; begin BeginUpdate; try inherited; // Update the widths and positions of renderening objects within a TListViewItem LOuterHeight := Height - Owner.ItemSpaces.Top - Owner.ItemSpaces.Bottom; LOuterWidth := Owner.Width - Owner.ItemSpaces.Left - Owner.ItemSpaces.Right; if Image.ActualWidth = 0 then begin LImagePlaceOffset := 0; LImageTextPlaceOffset := 0; end else begin LImagePlaceOffset := cDefaultImagePlaceOffsetX; LImageTextPlaceOffset := cDefaultImageTextPlaceOffsetX; end; Image.InternalPlaceOffset.X := GlyphButton.ActualWidth + LImagePlaceOffset; if Image.ActualWidth > 0 then Text.InternalPlaceOffset.X := Image.ActualPlaceOffset.X + Image.ActualWidth + LImageTextPlaceOffset else Text.InternalPlaceOffset.X := 0 + GlyphButton.ActualWidth; MultiDetail1.InternalPlaceOffset.X := Text.InternalPlaceOffset.X; MultiDetail2.InternalPlaceOffset.X := Text.InternalPlaceOffset.X; MultiDetail3.InternalPlaceOffset.X := Text.InternalPlaceOffset.X; LInternalWidth := LOuterWidth - Text.ActualPlaceOffset.X - Accessory.ActualWidth; if Accessory.ActualWidth > 0 then LInternalWidth := LInternalWidth - cTextMarginAccessory; Text.InternalWidth := Max(1, LInternalWidth); MultiDetail1.InternalWidth := Text.InternalWidth; MultiDetail2.InternalWidth := Text.InternalWidth; MultiDetail3.InternalWidth := Text.InternalWidth; finally EndUpdate; end; end; type TOption = TCustomListView.TRegisterAppearanceOption; const sThisUnit = 'MultiDetailAppearanceU'; // Will be added to the uses list when appearance is used initialization // MultiDetailItem group TCustomListView.RegisterAppearance( TMultiDetailItemAppearance, TMultiDetailAppearanceNames.ListItem, [TOption.Item], sThisUnit); TCustomListView.RegisterAppearance( TMultiDetailDeleteAppearance, TMultiDetailAppearanceNames.ListItemDelete, [TOption.ItemEdit], sThisUnit); TCustomListView.RegisterAppearance( TMultiDetailShowCheckAppearance, TMultiDetailAppearanceNames.ListItemCheck, [TOption.ItemEdit], sThisUnit); finalization TCustomListView.UnregisterAppearances( TArray<TCustomListView.TItemAppearanceObjectsClass>.Create( TMultiDetailItemAppearance, TMultiDetailDeleteAppearance, TMultiDetailShowCheckAppearance)); end.19 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.