鉴于记录:
MyRecord = record
Company: string;
Address: string;
NumberOfEmplyees: integer;
Run Code Online (Sandbox Code Playgroud)
你能写一个函数调用吗?
function UpdateField(var FieldName: string; FieldValue: variant): bool;
Run Code Online (Sandbox Code Playgroud)
以便:
UpdateField('Company', 'ABC Co');
Run Code Online (Sandbox Code Playgroud)
将MyRecord.Company更新为'ABC Co'?
我找了一个例子,但我发现的一切都是为了数据库.任何指导我正确方向的帮助表示赞赏.
谢谢,查尔斯
我有一个自定义的TDatasetProvider,允许为它提供的任何数据创建新的字段.
所以,假设您在原始数据集上获得了以下字段:
您需要使用显示位图在DBGrid上选择它.好吧,你可以,因为我的DSP可以添加一个调用Selected
数据集数据的布尔字段.
我现在这样做的方式:
我真的不知道是否有更优雅(和更快)的方式来做到这一点.有另一种(更快和/或更优雅)的方式来获得这个结果?
在我正在工作的项目中,我有如下代码.
procedure TForm.EditBtnClick(Sender:TObject);
begin
// Mark is form variable. It's private
Mark = cdsMain.GetBookmark;
// blabalbal
.
.
.
end;
procedure TForm.OkBtnClick(Sender:TObject);
var
mistakes: Integer;
begin
//Validation stuff and transaction control
//removed to not clutter the code
If cdsMain.ChangeCount <> 0 then
mistakes := cdsMain.AppyUpdates(-1);
cdsMain.Refresh;
try
cdsMain.GotoBookmark(Mark);
// Yes, I know I would have to call FreeBookmark
// but I'm just reproducing
except
cdsMain.First;
end;
end;
Run Code Online (Sandbox Code Playgroud)
就个人而言,我没有太多使用书签 - 除了重新定位我只移动光标位置的数据集(创建列表,填充字符串列表等).如果我Refresh
,更新(特别是当过滤器可以使记录不可见),重新获取(Close
/ Open
)或修改数据集中的数据的任何操作时,我不使用书签.我更喜欢Locate
使用主键(TClientDataset
当然使用a …
我正在使用TcheckListBox控件,并希望在此使用第二列,但除了Columns和Header属性之外,我找不到插入多列内容的任何来源...
它看起来像一个noobie问题,但Delphi的帮助没有任何关于此的内容,我的搜索(在Google和SO上)带来了很多垃圾......
我只需要一个例子.
我有遗留代码(我没写它)总是包含编码属性,但重新编译到D2010,TXMLDocument不再包含编码.由于XML数据在标记和数据上都有重音字符,因此TXMLDocument.LoadFromFile只会抛出EDOMParseErros,表示在文件中找到了无效字符.相关代码:
Doc := TXMLDocument.Create(nil);
try
Doc.Active := True;
Doc.Encoding := XMLEncoding;
RootNode := Doc.CreateElement('Test', '');
Doc.DocumentElement := RootNode;
<snip>
//Result := Doc.XMl.Text;
Doc.SaveToXML(Result); // Both lines gives the same result
Run Code Online (Sandbox Code Playgroud)
在旧版本的Delphi中,生成以下行:
<?xml version="1.0" encoding="ISO-8859-1"?>
Run Code Online (Sandbox Code Playgroud)
在D2010上,生成:
<?xml version="1.0"?>
Run Code Online (Sandbox Code Playgroud)
如果我手动更改线路,所有工作都像过去几年一直工作.
更新:XMLEncoding是一个常量,定义如下
XMLEncoding = 'ISO-8859-1';
Run Code Online (Sandbox Code Playgroud) 我有以下代码.我想覆盖基础列表的Notify方法,以便能够在修改列表时创建一个事件.
TDescendantList = class(TObjectList<TSomeclass>)
private
<...>
protected
procedure Notify(const Value: T;
Action: TCollectionNotification); override;
<...>
end;
Run Code Online (Sandbox Code Playgroud)
如果我把Value: T
我在T上得到一个"未声明的标识符".
如果Value: TSomeClass
我得到"通知声明"与以前的声明不同".
Notify
是一种受保护的方法TObjectList<T: class>
.此方法不会出现在XE2 IDE的重写列表中.
这是实现这个的一些方法,或者我需要使用另一种方法,因为这是一个众所周知的砖墙?
我有一个Delphi程序,我正在研究这个程序如何在日志文件中打印自己的"虚拟大小",以便我可以看到它何时使用了太多内存.如何使用Delphi代码确定"虚拟大小"?
"虚拟大小"是指Process Explorer显示的值.普通任务管理器无法显示此值.它不是程序的内存使用,而是地址空间的使用.在Win32上,程序不能使用超过2 GB的地址空间.
PS:我使用的是Delphi 6,但其他版本的代码/信息也应该没问题.
我想使用TValue将字符串转换为枚举类型,我用谷歌搜索但我没有找到如何做到这一点.
type
TEnumTest = (etFirst, etSecond);
var
D: TEnumTest;
begin
D := StrToENumTest('etFirst');
end;
function StrToEnumTest(pStr:String):TEnumTest;
var
V: TValue;
begin
V := TValue.From<String>(pstr);
Result := V.AsType<TEnumTest>;
end;
Run Code Online (Sandbox Code Playgroud)
它不起作用.那肯定是我看不到的蠢事 - 但我没有找到它.我做错了什么?
我知道如何使用GetEnumValue.
编辑:@Warren,它在这里,因为这更容易发布代码:
TEnumUtils = class
class function GetAs<T>(pValor: String): T;
end;
class function TEnumUtils.GetAs<T>(pValor: String): T;
var
Tipo: PTypeInfo;
Temp: Integer;
PTemp: Pointer;
begin
Tipo := TypeInfo(T);
Temp := GetEnumValue(Tipo, pValor);
PTemp := @Temp;
Result := T(PTemp^);
end;
Run Code Online (Sandbox Code Playgroud)
用法:
type
TEnumTest = (etFirst, etSecond);
var
D: TEnumTest;
begin
D := …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在按钮中使用 Application.ActivateHint 来显示它的提示。
它根本不起作用,目标按钮中没有显示任何提示。
没有超出形式的容器。
procedure TForm1.btn2Click(Sender: TObject);
var
PosScr1: TPoint;
Btn_Test: TButton;
begin
Btn_Test := nil;
Btn_Test := TButton(Self.FindComponent('Btn_Test'));
if not Assigned(Btn_Test) then
begin
// Generated by GExperts "Component to Code"
// To clone the original target button
// and leave the method self-suficient for
// StackOverflow
Btn_Test := TButton.Create(Self);
with Btn_Test do
begin
Name := 'Btn_Test';
Parent := Self;
Left := 176;
Top := 56;
Width := 75;
Height := 25;
Hint := 'Testing';
Caption := 'Btn_Test';
ParentShowHint …
Run Code Online (Sandbox Code Playgroud) 我有一个Delphi 7应用程序,它有两个文档视图(例如,所见即所得HTML编辑可能有WYSIWYG视图和源视图 - 而不是我的真实应用程序).它们可以在单独的窗口中打开,也可以停靠在主窗口中的选项卡中.
如果我从其中一个单独的表单打开模式对话框,则主表单将显示在前面,并在Windows任务栏中显示为选定的窗口.假设主窗体是WYSIWYG视图,并且源视图被激活.您转到源视图中的特定点并插入图像标记.将出现一个对话框,允许您选择并输入图像所需的属性.如果WYSIWYG视图和源视图重叠,则WYSIWYG视图将显示在前面,并且隐藏源视图.一旦对话框被解除,源视图就会重新出现.
我已经尝试将所有者和ParentWindow属性设置为与其相关的表单:
dialog := TDialogForm.Create( parentForm );
dialog.ParentWindow := parentForm.Handle;
我该如何解决这个问题?我还应该尝试什么?
鉴于人们似乎对我的例子感到磕磕绊绊,也许我可以尝试一个更好的例子:一个文本编辑器,允许你同时打开多个文件.您打开的文件位于选项卡(如Delphi IDE中)或其自己的窗口中.假设用户调出拼写检查对话框或查找对话框.发生的情况是,如果文件正在其自己的窗口中进行编辑,则在显示模式对话框时,该窗口将以z顺序发送到主窗体下方; 关闭对话框后,它将返回到原始的z顺序.
注意:如果您正在使用Delphi 7并寻找此问题的解决方案,请在页面下方查看我的答案,看看我最终做了什么.
delphi ×10
delphi-2010 ×2
delphi-7 ×2
delphi-xe2 ×2
rtti ×2
dbexpress ×1
delphi-6 ×1
encoding ×1
generics ×1
inheritance ×1
tvalue ×1
txmldocument ×1
vcl ×1
windows ×1
xml ×1