Firemonkey Grille de Contrôle - le Style d'une Cellule basée sur une valeur (par l'intermédiaire de la OnGetValue appel de fonction)
Je suis à la recherche de solution recommandée au style d'une TGrid cellule qui est en cours d'élaboration par le OnGetValue appel (qui est appelé à peindre les cellules en vue). Pour le fond, une excellente réponse de Mike, a montré comment il suffit d'appliquer un tAlign propriété lorsque la cellule est créée; mais mon prochain défi est la coloration du contenu de la cellule.
L'objectif est de modifier les attributs de cellules (Police, style, couleur, etc...) de la valeur que je suis sur le point de retourner en tant que cellule de "Valeur". Dans l'exemple ci-dessous; il serait d'appliquer un style à la OnGetValue "valeur" qui est retourné. Il se pourrait bien que nous avons pour ce faire par l'intermédiaire d'un FM de la feuille de style; ou peut-on passer directement à l'TText attributs? Idéalement, les deux scénarios serait formidable - mais à ce stade je vais prendre la solution... (;->
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Objects, FMX.Grid,
FMX.Layouts, FMX.Edit;
type
TForm1 = class(TForm)
Grid1: TGrid;
Button1: TButton;
StyleBook1: TStyleBook;
procedure Grid1GetValue(Sender: TObject; const Col, Row: Integer;
var Value: Variant);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TStringColNum = class(TStringColumn)
private
function CreateCellControl: TStyledControl; override;
published
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
function TStringColNum.CreateCellControl: TStyledControl;
begin
Result:=TTextCell.Create(Self);
TTextCell(Result).TextAlign := TTextAlign.taTrailing;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Grid1.AddObject(TStringColumn.Create(Self));
Grid1.AddObject(TStringColNum.Create(Self)); // Right Aligned column?
Grid1.RowCount:=5000;
Grid1.ShowScrollBars:=True;
end;
procedure TForm1.Grid1GetValue(Sender: TObject; const Col, Row: Integer;
var Value: Variant);
begin
if Col=0 then
Value:='Row '+IntToStr(Row);
if Col=1 then
Value := 'Row '+IntToStr(Row);
// Apply style based on value ?
end;
end.
Merci beaucoup à l'avance,
Ian.
Salut Mike - Oui; sur place. J'ai deux scénarios, mais les deux sont le même principe. Un scénario est négatif, la valeur est affichée en ROUGE et l'autre scénario est "bold" un élément dans la liste (que je choisis - en raison hors de la grille de tenue des détails; l'important client, etc...). Merci à l'avance. Ian.
OriginalL'auteur Ian | 2012-02-13
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, des excuses. Dans ma réponse à votre dernière question, CreateCellControl devrait avoir appelé hérité de créer la cellule. J'ai modifié ma réponse.
Que pour cette question, j'ai téléchargé mon blogue sur FireMonkey Cellules - http://monkeystyler.com/blog/entry/firemonkey-grid-basics-custom-cells-and-columns - il recouvre la substance de la réponse précédente, et couvre également la création des cellules contrôles. Vous aurez besoin de lire que avant de votre procéder. Je vais attendre.
...
En arrière maintenant? Bon.
D'après l'exemple dans le billet de blog.
Sauf, que j'ai mis à jour le TFinancialCell d'hériter directement de TTextCell (ce qui, évidemment est un TEdit), ce qui fait beaucoup plus de sens et est beaucoup plus simple de style.
Donc, mise à jour de la TFinancialCell:
Code ci-dessus:
Et enfin, mise à jour le GetValue gestionnaire d'événement:
Salut Mike - un léger problème, j'ai noté à ce sujet? Tout se passe bien jusqu'à ce que je défilement de la fenêtre. Quand il défile, le rouge/gras sortir de la ligne et la synchronisation. Je ne suis pas sûr de cela est un repaint problème avec FM ou autre chose? Je peux poster mon code si le vôtre est bien? - Merci à l'avance, Ian.
Mon mauvais. Le style doit être appliqué de nouveau à partir de la méthode SetData, j'ai donc mis à jour le code ci-dessus pour en extraire une ApplyStyles méthode et l'appeler à partir d'ApplyStyle, SetData et SetIsImportant.
Comme pour les en-têtes, il devrait être facile. Dans vos colonnes constructeur ajouter if (Grille <> néant) et de la Grille.FHeader <> nul), puis de la Grille.FHeader.Les Articles[Index].TextAlign := TTextAlign.alTrailing; - Mais Fheader est un membre privé, de sorte que vous aurez à la sous-classe TGrid de l'exposer. (Et le TColumn ne pas l'exposer soit - il, en-Tête de la propriété est simplement une chaîne de caractères, pas un THeader).
Merci pour le modifier; pas de problème. J'ai encore l'air à obtenir un étrange problème lorsque je scroll cependant que certaines valeurs sont indiquées en gras de temps en temps car vous faites défiler, alors si vous faites défiler vers haut qu'ils ne le sont pas? J'ai également eu à changer le "ApplyStyling" à "TFinancialCell.ApplyStyling"; est-ce exact ou ai-je la cause du problème? - Merci Ian.
OriginalL'auteur Mike Sutton
Code ci-dessus est très bien pour les versions avant XE4, mais pour XE4 et XE5 ne fonctionne pas. La couleur et le style du texte n'est pas modifié.
C'est un code fixe pour XE4 et XE5:
OriginalL'auteur Alex Egorov