我是德尔福学习者。我正在寻找一些代码来转换Hue,Saturation和Value中的基本颜色。我在this forum得到了它,我已经实现了它:
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错误抛出
[DCC错误] Unit1.pas(150):E2035实际参数不足。
在下面的行:
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));
如何删除错误?
答案 0 :(得分:6)
我打算试着指导你自己如何解决这个问题。
步骤1:确定编译器错误的含义
坦率地说,这个错误是不言自明的。
实际参数不够
嗯,你没有传递足够的参数。但是,如果不明显,则键入错误消息文本,并在此情况下将错误代码E2035输入您喜欢的搜索引擎。这将引导您进入documentation for the compiler error,其中说:
当对过程或函数的调用给出的参数少于过程或函数声明中指定的参数时,会出现此错误消息。
还有一些例子可以证明它是如何发生的。这都是有用的信息。花些时间仔细阅读。
第2步:确定导致错误的代码行
有三个实例都是这样的:
Hue := RGBToHSV(GetRValue(Label1.Font.Color), GetGValue(Label1.Font.Color),
GetBValue(Label1.Font.Color));
第3步:将我们在第1步中学到的内容应用于失败的代码行
有4个函数/过程调用。检查每个参数。检查函数的声明对抗调用时传递的参数,即实际参数。
对于三个内部函数,参数计数匹配。但请查看对RGBToHSV
的调用。该函数有六个参数,但只传递了三个参数。
以上是面对您不理解的编译器错误时采用的一般过程。当您遇到其他不同的编译器错误时,您将能够应用此技术。
答案 1 :(得分:3)
procedure RGBToHSV(Const R, G, B: Real; Out H, S, V: Real);
您正在声明 6 参数,没有任何返回值,但您仅使用 3 参数调用它,将其返回值(不存在)分配给a变量。您应该将呼叫更改为仅一个:
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>
);