Jump to content

UniColorComboBox


Recommended Posts

On 10/3/2021 at 9:43 PM, Sherzod said:

Try this.

Нужна какая-то настройка, чтобы скрывать прозрачность. Просто часто прозрачность не нужна.

И не хватает кнопки "Очистить", чтобы можно было выбрать значение "без цвета" (no color), типа NULL или NIL .

И не хватает мобильной версии.

Screenshot_1.jpg

Link to comment
Share on other sites

А как мне программно указать пустой цвет?

  comboColor2.AColor := Null;

Появляется ошибка: Could not convert variant of type (Null) into type (Int64).

 

Если я пишу:

comboColor2.AColor := TAlphaColorRec.Null;

То ничего не происходит вообще, цвет не меняется.

 

Link to comment
Share on other sites

18 minutes ago, x11 said:
comboColor2.AColor := TAlphaColorRec.Null;

То ничего не происходит вообще, цвет не меняется.

uColorComboBox.pas

procedure TUniColorComboBox.SetJSColor(AColor: TAlphaColor);
var
  Ident: Integer;
  ColorStr: string;
begin
  if AColor = claNull then
  begin
    JSCall('setValue', ['#00000000'])
  end
  else if AlphaColorToString(AColor).Chars[0] <> '#' then
    JSCall('setValue', [LowerCase(AlphaColorToString(AColor))])
  else
  begin
    ColorStr := AlphaColorToString(AColor);
    ColorStr := Copy(ColorStr, 4, 9) + Copy(ColorStr, 2, 2);
    JSCall('setValue', [ColorStr]);
  end;

end;

 

  • Thanks 1
Link to comment
Share on other sites

Еще небольшая проблемка.

Взял ваш стандартный пример CellDraw и указал там тот цвет, который можно выбрать из AColor этой новой компоненты:

 

вот кусок кода

procedure TMainForm.UniDBGrid1DrawColumnCell(Sender: TObject; ACol,
  ARow: Integer; Column: TUniDBGridColumn; Attribs: TUniCellAttribs);
begin
  if ACol=0 then
  begin
    Attribs.Color:=-13076753;//$E0E0E0;
    Attribs.Font.Style:=[fsBold];
  end;
...
...

т.е. указал: Attribs.Color:=-13076753;

На первой картинке результат и, как видите, цвет черный.

А на второй картинке - это как на самом деле выглядит выбранный синий цвет "-13076753".

 

 

 

Screenshot_6.jpg

Screenshot_7.jpg

Link to comment
Share on other sites

Так норм.

Attribs.Color:= TAlphaColorRec.ColorToRGB(TAlphaColor(-13076753)); 

т.е. компоненте не хватает несколько свойств, например свойства, которое бы возвращало именно TColor.

И свойства, которе бы возвращало имя цвета, как в справке https://docwiki.embarcadero.com/Libraries/Sydney/en/System.UITypes.TAlphaColorRec

 

было бы очень удобно

Screenshot_8.jpg

Link to comment
Share on other sites

Компонента сделана не совсем правильно.

Было бы удобней и практичней, если бы было 2 кнопки.

1. Выбрать цвет по имени из списка.

2. Выпадающее окно, как сейчас сделано.

Можно было бы самому добавить триггер, но свойства такого нет :(

Screenshot_2.jpg

Link to comment
Share on other sites

2 minutes ago, x11 said:

Компонента сделана не совсем правильно.

Cильно не критикуйте пожалуйста :)

5 minutes ago, x11 said:

Можно было бы самому добавить триггер, но свойства такого нет :(

Вы имеете в виду пользовательский цвет.

Если да, то тогда используйте двойной клик.

Link to comment
Share on other sites

4 minutes ago, Sherzod said:

Cильно не критикуйте пожалуйста

я стараюсь

но я хочу и помочь, чтобы получилась хорошая, гибкая и удобная компонента

Link to comment
Share on other sites

Вам бы скрестить тот, код, который вы мне давали с выпадающим списком и именами цветов с этой новой компонентой. И добавить в uniGUI нормальную полноценную компоненту и мобильную в том числе.

Ведь в uniGUI нет полноценной компоненты выбора цвета.

Вы уже давно обещали :(

Screenshot_3.jpg

Screenshot_4.jpg

Link to comment
Share on other sites

На всякий случай примеры для конвертации Color/TAlphaColor/TAlphaColorRec

просто оставлю здесь

var
  Color: TColor;
begin
  TColorRec(Color).R := 123;
  TColorRec(Color).G := 113;
  TColorRec(Color).B := 13;
  Rectangle1.Fill.Color := Color;
end;

var
  Color: TAlphaColor;
begin
  TAlphaColorRec(Color).R := 123;
  TAlphaColorRec(Color).G := 113;
  TAlphaColorRec(Color).B := 13;
  TAlphaColorRec(Color).A := 126;
  Rectangle1.Fill.Color := Color;
end;

ses
  System.UITypes;

var
  Color: TAlphaColor  
begin
  Color := TAlphaColorF.Create(123/255, 113/255, 13/255, 126/255).ToAlphaColor;
end;

 

Link to comment
Share on other sites

On 10/5/2021 at 11:34 AM, Sherzod said:

Тогда, пожалуйста не используйте на данный момент. Эта ошибка в ядре, в js компоненте.

а как исправить эту ошибку?

'$anc0e5ea' is not a valid integer value.

я так понял, это когда прозрачность меняешь

Screenshot_9.jpg

Link to comment
Share on other sites

6 hours ago, Sherzod said:

Вы имеете в виду пользовательский цвет.

 

Подскажите, пожалуйста, а как вы сделали цикл по TAlphaColorRec, чтобы вставить их в свойство AColor?

Спасибо.

Screenshot_17.jpg

Link to comment
Share on other sites

23 hours ago, Sherzod said:

Вы имеете в виду пользовательский цвет.

 

а подскаждите еще, пожалуйста, как разукрасить каждую строку комбобокса в свой цвет?

Цвет указан в скобках....

 

вот я наполнил обычный uniCombobox

...
  comboColor3.Clear;
  System.UIConsts.GetAlphaColorValues(FillColorsCombo);


end;

procedure TfrdEditObject.FillColorsCombo(const S: String);
begin
  comboColor3.Items.Add(Format('%s (%x)', [s, StringToAlphaColor(s)]));
end;

Я понимаю., что как-то через событие AfterRender, но не знаю как.

Спасибо.

Screenshot_21.jpg

Link to comment
Share on other sites

На форме есть extUniColorCombobox (comboColor2) из которого можно выбрать кастомный любой цвет

+ стандартный uniCombobox (comboColor3) из которого можно выбрать именованный стандартный цвет (из Delphi-набора TAphaColorRec)

procedure TfrdEditObject.FillColorsCombobox;
begin
// наполнить стандартными цветами список, например, при старте формы/фрейма
  comboColor3.Clear;
  System.UIConsts.GetAlphaColorValues(FillColorsCombo);
end;

procedure TfrdEditObject.FillColorsCombo(const S: String);
begin
  // см справку
  // https://docwiki.embarcadero.com/Libraries/Sydney/en/System.UITypes.TAlphaColorRec
  // https://docwiki.embarcadero.com/Libraries/Sydney/en/System.UIConsts.GetAlphaColorValues
  
  comboColor3.Items.AddObject(Format('%s (%x)', [s, StringToAlphaColor(s)]), Pointer(StringToAlphaColor(s)));
end;

 

procedure TfrdEditObject.comboColor3Select(Sender: TObject);
begin
  //в comboColor3 выбираем стандартный именованный цвет
  // и присваиваем выбранное значение кастомному комбобоксу comboColor2, чтобы было видно визуально, что выбрано
  comboColor2.AColor := integer(comboColor3.Items.Objects[comboColor3.ItemIndex]);
end;

 

// вызвать процедуру наполнения comboColor3
...
...

procedure TfrdEditObject.SetColor(color: TColor);
Var
  AlphaColor: TAlphaColor;
  AColor: single;
  AStr: string;
begin
// установить прозрачность
  if color = 0 then
    Acolor := 0// если цвет не был выбран, то полностью прозрачный
  else
    Acolor := 1;// если цвет был выбран, то непрозрачный

  //конвертировать в AlphaColor из RGB, т.к. в базе храниться только RGB
  AlphaColor            := TAlphaColorF.Create(TColorRec(color).R/255, TColorRec(color).G/255, TColorRec(color).B/255, AColor).ToAlphaColor;
  comboColor2.AColor    := AlphaColor;

  // есть выбранный цвет начинается с #, а не с буквы, то такого имени у цвета нет и его нуждно добавить, чтобы
  // пользователь видел, что что-то выбрано
  AStr := AlphaColorToString(AlphaColor);
  if AStr.Chars[0] = '#' then
    comboColor3.Items.AddObject(Format('%s (%x)', [AStr, StringToAlphaColor(AStr)]), Pointer(StringToAlphaColor(AStr)));

  comboColor3.ItemIndex := comboColor3.items.IndexOfObject(Pointer(comboColor2.AColor));
end;

Вот такой костыль получился.

Если поможете это все связать в одну визуальную компоненту, будет все очень полезно.

Спасибо.

Screenshot_25.jpg

Link to comment
Share on other sites

Подскажите, как нарисовать цветной прямоугольник в комбобоксе опираясь на вот этот пример?

Значение цвета указано в скобках.

Или даже разукрасить фон строк комбобокса.

Цвета в кобобокс зщагружаются стандартным способом:

comboColor3.Items.AddObject(Format('%s (%x)', [s, StringToAlphaColor(s)]), Pointer(StringToAlphaColor(s)));

Screenshot_36.jpg

Link to comment
Share on other sites

  • 4 weeks later...

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...