我目前有这个,它很糟糕:
type TpointArray = array [0..3] of Tpoint;
class function rotationTable.offsets(pType, rotState, dir: integer): TpointArray;
begin
Result[0] := point(1, 1);
Result[1] := point(1, 2);
Result[2] := point(1, 1);
Result[3] := point(1, 1);
end;
Run Code Online (Sandbox Code Playgroud)
但相反,我想做这样的事情:
class function rotationTable.offsets(pType, rotState, dir: integer): TpointArray;
begin
Result := [Point(1,1), Point(1,2), Point(1,1), Point(1,1)];
end;
Run Code Online (Sandbox Code Playgroud)
但是,在编译时,它抱怨[1,2,3,4]语法只适用于整数.
有没有办法实例化/初始化一个Tpoint数组,类似于我想要的方式?
我似乎无法通过搜索找到答案,所以这里......
我知道我可以通过利用这种类型的代码将Class对象一般传递给其他类:
public class ClsGeneric<TObject> where TObject : class
{
public TObject GenericType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后以这种方式构建:
ClsGeneric<MyType> someName = new ClsGeneric<MyType>()
Run Code Online (Sandbox Code Playgroud)
但是,我有一个应用程序,要求我打开一个表单,并以某种方式传递泛型类型以便在该表单中使用.我试图能够为许多不同的类类型重用此表单.
有谁知道这是否可能,如果可能,如何?
我已经使用Form构造函数进行了一些实验,但无济于事.
非常感谢,戴夫
更新:澄清我想要达到的结果是什么
更新:今年4月4日,我进一步前进,但我提供了解决方案的赏金.这就是我现在拥有的:
interface IFormInterface
{
DialogResult ShowDialog();
}
public class FormInterface<TObject> : SubForm, IFormInterface where TObject : class
{ }
public partial class Form1 : Form
{
private FormController<Parent> _formController;
public Form1()
{
InitializeComponent();
_formController = new FormController<Parent>(this.btnShowSubForm, new DataController<Parent>(new MeContext()));
}
}
public class FormController<TObject> where TObject : class
{
private …
Run Code Online (Sandbox Code Playgroud) TObject.InstanceSize返回8,但TObject没有声明任何数据成员.根据TObject.ClassType的实现,前4个字节可以解释为指向对象的TClass元数据的指针.任何人都知道其他4个字节的开销是什么?
编辑:显然这是D2009特有的.在旧版本中,它只有4个字节.
如今,一个很简单的问题来到我的脑海里,当我不得不重写TObject
的BeforeConstruction
方法:
为什么TObject
方法AfterConstruction
和BeforeConstruction
有public
知名度?
我希望他们是protected
.他们不是的原因是什么?
我无法想象调用AfterConstruction
或BeforeConstruction
不调用该类的构造函数或析构函数的有效目的.你呢?
我怎样才能使我的代码工作?:)我试图制定这个问题,但经过几次失败的尝试后,我认为你们会更快地发现问题,而不是阅读我的"解释".谢谢.
setCtrlState([ memo1, edit1, button1], False);
Run Code Online (Sandbox Code Playgroud)
_
procedure setCtrlState(objs: array of TObject; bState: boolean = True);
var
obj: TObject;
ct: TClass;
begin
for obj in objs do
begin
ct := obj.ClassType;
if (ct = TMemo) or (ct = TEdit) then
ct( obj ).ReadOnly := not bState; // error here :(
if ct = TButton then
ct( obj ).Enabled:= bState; // and here :(
end;
end;
Run Code Online (Sandbox Code Playgroud) 它适用于32位平台.但这里不是64位的例子
TVerbInfo = packed record
Verb: Smallint;
Flags: Word;
end;
var
VerbInfo: TVerbInfo;
strList : TStringList;
verb : Smallint;
flags : Word;
begin
strList := TStringList.create();
.....
verbInfo.verb := verb;
verbInfo.flags := flags;
strList.addObject('verb1',TObject(VerbInfo)); //invalid typecast happened here
end;
Run Code Online (Sandbox Code Playgroud)
谁能帮我?非常感谢你
我有一个程序,需要一个TObject类型的参数,如下所示:
MyProcedure (const AValue : TObject);
Run Code Online (Sandbox Code Playgroud)
我有一个Variant数组,我正在循环调用该过程,如下所示:
for i:=0 to High(myArray) do
MyProcedure (myArray[i]);
Run Code Online (Sandbox Code Playgroud)
编译器给出错误说:"不兼容的类型:TObject和Variant".
我该怎么做才能解决这个问题?
更多信息:到目前为止,我一直在变量数组中传递简单类型(字符串,数字,日期)(数组通常是不同类型的混合 - 我最终将它们作为参数传递给数据库存储过程).现在我还需要(在某些情况下)传递一个TObject.
传递值的最合适的数据类型/结构是什么,它可以包含简单类型和对象?我想我可以创建自己的TParam类型,它有两个字段,但我不确定确切的语法.有人有这方面的例子吗?
在声明类等时,"T" TObject
代表什么?模板?
例:
procedure TfrmMain.CaptureInfo1Click(Sender: TObject);
begin
frmCapture.Show;
end;
Run Code Online (Sandbox Code Playgroud) 根据我对此主题的有限知识,以下代码应该有效.但我没有预期的结果:
type
TClient = class(TObject)
Host: String;
end;
var
Clients: TThreadList;
const
Hosts: Array[0..5] of String = ('HOST1', 'HOST2', 'HOST3', 'HOST4', 'HOST5', 'HOST6');
var
I: Integer;
List: TList;
Client: TClient;
begin
try
for I := Low(Hosts) to High(Hosts) do
begin
Client := TClient.Create;
with Client Do
try
Host := Hosts[I];
List := Clients.LockList;
try
Clients.Add(Client);
finally
Clients.UnlockList;
end;
finally
Client.Free;
end;
end;
except
on E:Exception Do ShowMessage(E.Message);
end;
// RESULT TEST
List := Clients.LockList;
try
I := List.Count;
S := …
Run Code Online (Sandbox Code Playgroud) 我在Delphi 10.0 Seattle中TObject
为FireMonkey 添加值时遇到问题TListBox
.
将Integer
变量转换为TObject
指针时会引发异常.
我试过演员TFmxObject
没有成功.在Windows上,演员表就像一个魅力,但在Android上,它引发了异常.
这是我的代码:
var
jValue:TJSONValue;
i,total,id: integer;
date: string;
begin
while (i < total) do
begin
date := converteDate(jValue.GetValue('date' + IntToStr(i), ''));
id := StrToInt(jValue.GetValue('id' + IntToStr(i), ''));
ListBox1.Items.AddObject(date, TObject(id));
i := i + 1;
end;
end;
Run Code Online (Sandbox Code Playgroud) 我想知道如何在创建的列表中获得某个对象的位置。可以说它就像一个图形列表,您可以在其中单击对象。假设您右键单击一个对象并单击“刷新”,我如何获取该对象的位置,以便在整个列表刷新后(由于某种原因使用 clearlist 刷新)我回到列表中的相同位置? 如果列表长度为 1000 个对象,则刷新后尝试向下滚动到相同位置会很麻烦。
代码使用 Tobject 但我可以做类似 position:=integer(TObject."pointerinfo???"); 的事情吗?之后,当程序刷新时,例如将视图的位置设置为 currentview(pointer) 之类的指针?
实际上它不必是同一个对象,但是列表的相同“视图”会更好。
提前致谢