Also, you can try to use this approach:
1. Uses ... UniStrUtils;
2.
procedure TMainForm.DoRefreshChart;
function InterGetColor: string;
var vStatus: string;
begin
vStatus := DataSource3.DataSet.FieldByName('STATUS').AsString;
if vStatus = 'PENDENTE' then
Result := '#9c9c9c'
else if vStatus = 'GERADO' then
Result := '#0000FF'
else if vStatus = 'ENVIADO' then
Result := '#008080'
else if vStatus = 'RECEBIDO' then
Result := '#800080'
else if vStatus = 'PROCESSADO' then
Result := '#008000'
else if vStatus = 'ERRO' then
Result := '#FF0000'
else if vStatus = 'CANCELADO' then
Result := '#800000'
else if vStatus = 'IGNORADO' then
Result := '#808000';
end;
var
I: Integer;
ColorsStr: string;
begin
UniPie3DSeries1.Clear;
UniPie3DSeries1.Colors.Clear;
with DataSource3.DataSet do
begin
First;
while not Eof do
begin
UniPie3DSeries1.Colors.Add(InterGetColor);
UniPie3DSeries1.Add('1', FieldByName('ID_DETAIL').AsString);
Next;
end;
ColorsStr := '[';
with UniPie3DSeries1 do
for I := 0 to Colors.Count - 1 do
ColorsStr := ColorsStr + '"'+Colors[I]+'",';
ColorsStr := RemoveTrailingChar(ColorsStr, ',');
ColorsStr := ColorsStr + ']';
end;
with UniChart1 do
begin
JSInterface.JSAssign('colors', [JSInterface.JSStatement(ColorsStr)]);
JSInterface.JSCall('chart.series[0].setRenderer', [JSInterface.JSFunction('sprite, record, attributes, index, store',
' if (record) {'+
' if ('+ JSName +'.colors[index]) {'+
' attributes.fill = '+ JSName +'.colors[index];'+
' }'+
' }'+
' return attributes;'
)]);
end;
UniChart1.RefreshData;
end;