我只是试图让单独的单元挂起来使我的代码更加封装.我正在尝试将我的方法的公共/私有声明整理出来,所以我可以从其他使用的单元中调用它们testunit.在这个例子中,我想hellofromotherunit公开,但stickletters私人.
unit testunit;
interface
uses
Windows, Messages, Dialogs;
implementation
function stickletters(a,b:string):string;
begin
result:=a+b;
end;
procedure hellofromotherunit();
begin
showmessage(stickletters('h','i'));
end;
end.
Run Code Online (Sandbox Code Playgroud)
我似乎无法从其他单位复制私人/公共结构,如:
Type
private
function stickletters(a,b:inter):integer;
public
procedure hellofromotherunit();
end
Run Code Online (Sandbox Code Playgroud) Var
A : Array [1..4] of Integer;
B : Array [1..4] of Integer;
Begin
A := B;
Run Code Online (Sandbox Code Playgroud)
不会起作用,因为loren-pechtel 在这里说 问题是A和B对我来说是不同的单位.那么,有没有办法从另一个类中的现有类型定义类型定义?
我们使用不同供应商的几个组件包,其中两个都在其目录结构中提供了"regexp.pas"单元.
现在的问题是,无论我们编译它们的顺序如何,其中一个抱怨使用错误版本的各种其他单元编译单元.
有没有办法正确处理这个问题?
我有以下两个类:
TcmTPDataPanel = class(TcmTPBasePanel)
Database: TnxDatabase;
Session: TnxSession;
private
FDataConnector: TcmTPDataConnector;
MyNxDataBase: TnxDatabase;
MyNxSession: TnxSession;
MyRefNxDataBase: TnxDatabase;
protected
procedure Disconnect; virtual; abstract;
procedure Refresh; virtual;
procedure Requery; virtual; abstract;
public
procedure Connect;
published
property DataConnector: TcmTPDataConnector read FDataConnector write
FDataConnector;
end;
TcmTPDataConnector = class(TComponent)
private
FDatabase: TnxDatabase;
FObservers: TList;
FTableForCategories: TnxTable;
FTableForItemCategoryLinks: TnxTable;
FTableForItems: TnxTable;
procedure SetTableForItemCategoryLinks(const Value: TnxTable);
protected
procedure IterateObservers;
public
constructor Create;
destructor Destroy; override;
procedure Register(Instance: TcmTPDataPanel);
procedure Unregister(Instance: TcmTPDataPanel);
published
property Database: TnxDatabase read FDatabase …Run Code Online (Sandbox Code Playgroud) 我有问题.我会试着解释一下.
我有一个单元,有一个类,可能会有新的功能.
D3BF4E849ACC45249B990F802EFB1F15\UnitFile1.pas 8DC8977E7A7B469AACFE3CC77CA7075E\UnitFile1.pas
它们都有相同的类:IClass_1 = class
我使用代码编号为这个文件的不同版本.
另一个单元文件(UnitFile2.pas)使用该单元文件(UnitFile1.pas).
此外,第二个单元文件(UnitFile2.pas)具有不同的版本.
F94C439C822E490DB228F2C16EF2C190\UnitFile2.pas 14CEEFAFF1D64DDD8CBDEDD334D4A3FF\UnitFile2.pas
它们都有相同的类:IClass_2 = class(IClass_1)
现在问题开始了;
"F94C439C822E490DB228F2C16EF2C190\UnitFile2.pas"需要"D3BF4E849ACC45249B990F802EFB1F15\UnitFile1.pas"
"14CEEFAFF1D64DDD8CBDEDD334D4A3FF\UnitFile2.pas"需要"8DC8977E7A7B469AACFE3CC77CA7075E\UnitFile1.pas"
但文件名是相同的(我需要一个像这样的系统.所以它们是相同的).在单元文件中,delphi不允许我这样写;
在文件F94C439C822E490DB228F2C16EF2C190\UnitFile2.pas; 在'D3BF4E849ACC45249B990F802EFB1F15\UnitFile1.pas'中使用UnitFile1;
我希望我能说出我的问题.如何告诉编译器我想要使用哪个单元文件的路径?(我使用的是Delphi-7)
在我的程序的Unit2中,我有以下代码:
TValue = Record
NewValue,
OldValue,
SavedValue : Double;
end;
TData = Class(TObject)
Public
EconomicGrowth : TValue;
Inflation : TValue;
Unemployment : TValue;
CurrentAccountPosition : TValue;
AggregateSupply : TValue;
AggregateDemand : TValue;
ADGovernmentSpending : TValue;
ADConsumption : TValue;
ADInvestment : TValue;
ADNetExports : TValue;
OverallTaxation : TValue;
GovernmentSpending : TValue;
InterestRates : TValue;
IncomeTax : TValue;
Benefits : TValue;
TrainingEducationSpending : TValue;
End;
Run Code Online (Sandbox Code Playgroud)
然后我在Var中声明Data:TData.
当我尝试在Unit1中执行以下操作时:
ShowMessage(FloatToStr(Unit2.Data.Inflation.SavedValue));
Run Code Online (Sandbox Code Playgroud)
我收到一条EAccessViolation消息.有没有办法从Unit1访问存储在'Data'中的数据而不会出错?
在下面的单元中,我在IMPLEMENTATION部分声明了一个变量 - 该单元的本地变量.我还有一个在TYPE部分声明的过程,该过程接受一个参数并将该参数分配给有问题的局部变量.这个TFrame的每个实例都通过一个唯一的变量传递passMeTheVar.
我想要它做的是为帧的每个实例保留它自己的变量版本,与其他变量不同,并使用它来定义它的运作方式.然而,似乎正在发生的是所有实例都使用相同的值,即使我明确地将每个实例传递给另一个变量.
即:
Unit FlexibleUnit;
interface
uses
//the uses stuff
type
TFlexibleUnit=class(TFrame)
//declarations including
procedure makeThisInstanceX(passMeTheVar:integer);
private
//
public
//
end;
implementation
uses //the uses
var myLocalVar;
procedure makeThisInstanceX(passMeTheVar:integer);
begin
myLocalVar:=passMeTheVar;
end;
//other procedures using myLocalVar
//etc to the
end;
Run Code Online (Sandbox Code Playgroud)
现在在另一个Form中的某个地方,我将这个Frame放到了Design窗格上,有时在一个Form上有两个这样的框架,并在适当的位置声明它等等.每个都是独一无二的:
ThisFlexibleUnit : TFlexibleUnit;
ThatFlexibleUnit : TFlexibleUnit;
Run Code Online (Sandbox Code Playgroud)
当我做一个:
ThisFlexibleUnit.makeThisInstanceX(var1); //want to behave in way "var1"
ThatFlexibleUnit.makeThisInstanceX(var2); //want to behave in way "var2"
Run Code Online (Sandbox Code Playgroud)
它们似乎都共享相同的变量"myLocalVar".
原则上,我做错了吗?如果这是正确的方法那么这是调试我所拥有的东西(这个问题太大而无法发布),但如果这在原则上不正确那么有没有办法做我建议的事情?
编辑:
好的,所以这里学到的教训是类定义就是这样.许多类可以放在一个单元中,该Type部分中所有类的所有实例共享单元的实现部分.
我需要编写一些Delphi代码,但我之前没有使用Delphi的经验.我见过人们编写一些代码,称为unit1或unit2使用其中的代码导入它.那么,我可以将该单元视为Java或C#中的类吗?
我有类型的区别单位具有相同的名称,我有一个字符串中的单位名称.我需要访问该单元的特定类型.我怎么做?
例:
unit Unit1
type
TFooType = (
bar1,
bar2
);
Run Code Online (Sandbox Code Playgroud)
那么,我有另一个单位
unit Unit2
type
TFooType = (
foo1,
foo2,
foo3
);
Run Code Online (Sandbox Code Playgroud)
而且,在我的代码中的某处,我有一个字符串变量"UnitName",其中包含值"Unit1",我想通过变量访问Unit1的"TFooType"类型.
我正在使用Delphi 2007
对不起,我的英语不好.
提前致谢.
delphi ×9
delphi-units ×9
class ×2
variables ×2
definition ×1
delphi-7 ×1
instances ×1
local ×1
parameters ×1
pascal ×1
path ×1
private ×1
public ×1
reference ×1
types ×1
uses-clause ×1