【发布时间】:2011-07-05 08:09:08
【问题描述】:
我有一个名为 RCLowPass 的单元,它使用 Unit2。它使用对象 TForm2。
Unit2 也使用 RCLowPass。
Delphi 抱怨循环引用,因为一个模块需要另一个模块。
以下是相关单位的相关样本。
RCLowPass:
unit RCLowPass;
interface
uses
ComplexMath, ExtraMath, Unit2;
procedure SelectRCLowPassFilter;
implementation
{ This is why I need Unit2. }
procedure SelectRCLowPassFilter;
begin
// Setup form for RC Low Pass
TForm2.Prop1Name.Caption := 'R1';
TForm2.Prop1Name.Visible := true;
TForm2.Prop2Name.Caption := 'C1';
TForm2.Prop2Name.Visible := true;
TForm2.Prop3Name.Visible := false;
TForm2.Prop4Name.Visible := false;
TForm2.Prop5Name.Visible := false;
TForm2.Prop6Name.Visible := false;
TForm2.Prop7Name.Visible := false;
TForm2.Prop8Name.Visible := false;
TForm2.Prop1Value.Visible := true;
TForm2.Prop2Value.Visible := true;
TForm2.Prop3Value.Visible := false;
TForm2.Prop4Value.Visible := false;
TForm2.Prop5Value.Visible := false;
TForm2.Prop6Value.Visible := false;
TForm2.Prop7Value.Visible := false;
TForm2.Prop8Value.Visible := false;
end;
end.
单元2:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, RCLowPass, ExtCtrls;
var
Form2: TForm2;
implementation
uses RCLowPass;
{$R *.dfm}
{ This is why I need RCLowPass. }
procedure TForm2.Button1Click(Sender: TObject);
var
v : real;
begin
ShowMessage('Output of RC lowpass with R=1k, C=100n');
v := RCLowPassZAtFreq(1000, 100e-9, 10);
ShowMessage('@10Hz: ' + FormatFloat('#.########', v));
v := RCLowPassZAtFreq(1000, 100e-9, 10);
ShowMessage('@20Hz: ' + FormatFloat('#.########', v));
v := RCLowPassZAtFreq(1000, 100e-9, 20);
ShowMessage('@50Hz: ' + FormatFloat('#.########', v));
v := RCLowPassZAtFreq(1000, 100e-9, 50);
ShowMessage('@100Hz: ' + FormatFloat('#.########', v));
v := RCLowPassZAtFreq(1000, 100e-9, 100);
ShowMessage('@200Hz: ' + FormatFloat('#.########', v));
v := RCLowPassZAtFreq(1000, 100e-9, 200);
ShowMessage('@500Hz: ' + FormatFloat('#.########', v));
v := RCLowPassZAtFreq(1000, 100e-9, 500);
ShowMessage('@1000Hz: ' + FormatFloat('#.########', v));
v := RCLowPassZAtFreq(1000, 100e-9, 1000);
ShowMessage('@2000Hz: ' + FormatFloat('#.########', v));
v := RCLowPassZAtFreq(1000, 100e-9, 2000);
ShowMessage('@5000Hz: ' + FormatFloat('#.########', v));
v := RCLowPassZAtFreq(1000, 100e-9, 5000);
ShowMessage('@10000Hz: ' + FormatFloat('#.########', v));
end;
procedure SelectFilter(filter : integer);
begin
if filter = 0 then
SelectRCLowPassFilter();
end;
end.
如何修复循环引用?
【问题讨论】:
-
尝试将
Unit2的使用中的RCLowPass单元移动到Unit2单元的实现部分。 -
您的示例有缺陷,因为没有循环引用。由于您没有明确说明为什么在实际代码中
RCLowPass在RCLowPass的接口部分使用Unit2,因此无法建议您。 -
@RRUZ 现在我得到:
[DCC Error] RCLowPass.pas(29): E2096 Method identifier expectedforTForm2.Prop1Name.Caption := 'R1'和相关行。 -
@Thomas,这个问题太具体了,不知道以后会不会对别人有帮助。在 S.O 中存在更多关于
circular references的一般问题,例如 stackoverflow.com/questions/2644973/… 和 stackoverflow.com/questions/6579602/…,所以我认为如果你删除这个问题哪个更好:) -
@Thomas 我强烈建议您将 UI 代码移出执行过滤器的 RCLowPass 单元,并将其全部保留在 Unit2 中。
标签: delphi