1

我是德尔福学习者。我正在寻找一些代码来转换色调、饱和度和值的基本颜色。我在这个论坛上得到了它,我已经实现了它:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Math;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure HSVToRGB(Const H, S, V: Real; Out R, G, B: Real);
const
  SectionSize = 60/360;
var
  F: real;
  P, Q, T: real;
  Section: real;
  SectionIndex: integer;
begin
  if H < 0 then
    begin
      R:= V;
      G:= R;
      B:= R;
    end
  else
    begin
      Section:= H/SectionSize;
      SectionIndex:= Floor(Section);
      F:= Section - SectionIndex;
      P:= V * ( 1 - S );
      Q:= V * ( 1 - S * F );
      T:= V * ( 1 - S * ( 1 - F ) );
      case SectionIndex of
        0:
          begin
            R:= V;
            G:= T;
            B:= P;
          end;
        1:
          begin
            R:= Q;
            G:= V;
            B:= P;
          end;
        2:
          begin
            R:= P;
            G:= V;
            B:= T;
          end;
        3:
          begin
            R:= P;
            G:= Q;
            B:= V;
          end;
        4:
          begin
            R:= T;
            G:= P;
            B:= V;
          end;
        else
          begin
            R:= V;
            G:= P;
            B:= Q;
          end;
      end;
    end;
end;


procedure RGBToHSV(Const R, G, B: Real; Out H, S, V: Real);
var
  Range: real;
  RGB: array[0..2] of real;
  MinIndex, MaxIndex: integer;
begin
  RGB[0]:= R;
  RGB[1]:= G;
  RGB[2]:= B;

  MinIndex:= 0;
  if G < R then MinIndex:= 1;
  if B < RGB[MinIndex] then MinIndex:= 2;

  MaxIndex:= 0;
  if G > R then MaxIndex:= 1;
  if B > RGB[MaxIndex] then MaxIndex:= 2;

  Range:= RGB[MaxIndex] - RGB[MinIndex];

  if Range = 0 then
    begin
      H:= -1;
      S:= 0;
      V:= R;
    end
    else
      begin
        case MaxIndex of
          0:
            begin
              H:= (G-B)/Range;
            end;
          1:
            begin
              H:= 2 + (B-R)/Range;
            end;
          2:
            begin
              H:= 4 + (R-G)/Range;
            end;
        end;
        S:= Range/RGB[MaxIndex];
        V:= RGB[MaxIndex];
        H:= H * (1/6);
        if H < 0 then H:= 1 + H;
      end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Hue, Saturation, Value: real;
  Red, Green, Blue: integer;
begin
  Red := GetRValue(Label1.Font.Color);
  Green := GetGValue(Label1.Font.Color);
  Blue := GetBValue(Label1.Font.Color);
  Hue := RGBToHSV(GetRValue(Label1.Font.Color), GetGValue(Label1.Font.Color), GetBValue(Label1.Font.Color));
  Saturation := RGBToHSV(GetRValue(Label1.Font.Color), GetGValue(Label1.Font.Color), GetBValue(Label1.Font.Color));
  Value := RGBToHSV(GetRValue(Label1.Font.Color), GetGValue(Label1.Font.Color), GetBValue(Label1.Font.Color));
  ShowMessage (FloatToStr(Hue) +','+ FloatToStr(Saturation)+',' + FloatToStr(Value));
end;

end.

在编译时 Delphi 抛出 3 Error as
[DCC Error] Unit1.pas(150): E2035 Not enough actual parameters。
在以下几行:

Hue := RGBToHSV(GetRValue(Label1.Font.Color), GetGValue(Label1.Font.Color), GetBValue(Label1.Font.Color));

Saturation := RGBToHSV(GetRValue(Label1.Font.Color), GetGValue(Label1.Font.Color), GetBValue(Label1.Font.Color));

Value := RGBToHSV(GetRValue(Label1.Font.Color), GetGValue(Label1.Font.Color), GetBValue(Label1.Font.Color));

如何删除错误?

4

2 回答 2

6

我将尝试向您介绍如何自己解决此类问题。

第 1 步:找出编译器错误的含义

坦率地说,这个错误是不言自明的。

实际参数不够

好吧,你没有传递足够的参数。但是,如果不是很明显,则将错误消息文本和错误代码(在这种情况下为 E2035)输入到您喜欢的搜索引擎中。这将引导您查看编译器错误的文档,其中显示:

当调用过程或函数提供的参数少于过程或函数声明中指定的参数时,会出现此错误消息。

还有一些例子可以证明它是如何发生的。这都是有用的信息。花一些时间仔细阅读它。

步骤 2:识别导致错误的代码行

三个实例看起来都像这样:

Hue := RGBToHSV(GetRValue(Label1.Font.Color), GetGValue(Label1.Font.Color), 
  GetBValue(Label1.Font.Color));

第 3 步:将我们在第 1 步中学到的知识应用于失败的代码行

有 4 个函数/过程调用。检查每个参数。根据调用时传递的参数(即实际参数)检查函数的声明。

对于三个内部函数,参数计数匹配。但是看看对RGBToHSV. 该函数有六个参数,但您只传递了三个。


以上是遇到您不理解的编译器错误时采用的一般过程。当您遇到其他不同的编译器错误时,您将能够应用此技术。

于 2013-07-23T21:07:51.790 回答
3
procedure RGBToHSV(Const R, G, B: Real; Out H, S, V: Real);

您声明了6 个参数,没有任何返回值,但您仅使用3 个参数调用它,将其返回值(不存在)分配给一个变量。您应该将调用更改为一个:

RGBToHSV(
  GetRValue(Label1.Font.Color),
  GetGValue(Label1.Font.Color),
  GetBValue(Label1.Font.Color),
  <variable that will hold Hue value>,
  <variable that will hold Saturation value>,
  <variable that will hold Value value>
);
于 2013-07-23T20:57:14.593 回答