[教程]解析 Web 颜色(VCL)

这段代码支持的Web颜色格式为 #RRGGBB/#RGB 以及以Web标准名称命名的颜色(需要引用单元:qstring,graphutil):

function ParseWebColor(S: String;ADefColor:TColor=clBlack): TColor;
var
  p: PChar;
  c: array [0 .. 3] of Byte absolute Result;
  i: Integer;
begin
  Result := 0;
  p := PChar(S);
  i := 0;
  if p^ in ['a' .. 'z', 'A' .. 'Z'] then
  begin
    if IdentToColor('cl' + S, i) then
      Result := i
    else
    begin
      S := 'clWeb' + S;
      for I := 0 to High(WebNamedColors) do
      begin
        if CompareText(WebNamedColors[I].Name, S) = 0 then
        begin
          Result := WebNamedColors[I].Value;
          Exit;
        end;
      end;
      Result := ADefColor;
    end;
    Exit;
  end
  else if p^ = '#' then
  begin
    Inc(p);
    if Length(S) = 4 then // #RGB
    begin
      while p^ <> #0 do
      begin
        if IsHexChar(p^) then
        begin
          c[i] := (HexValue(p^) * 255) div 15;
          Inc(i);
          Inc(p);
        end
        else
          break;
      end;
    end
    else if Length(S) = 7 then
    begin
      while p^ <> #0 do
      begin
        if IsHexChar(p^) then
        begin
          c[i] := HexValue(p^);
          Inc(p);
          if p^ <> #0 then
          begin
            c[i] := (c[i] shl 4) + HexValue(p^);
            Inc(p);
          end;
          Inc(i);
        end
        else
          break;
      end;
    end;
  end;
  if i <> 3 then
    Result := ADefColor;
end;

比如#FF0000 和 #F00 都被解释为红色。

分享到: