小编Fab*_*ujo的帖子

有没有办法在知道字段名称和值的记录中更新字段

鉴于记录:

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'?

我找了一个例子,但我发现的一切都是为了数据库.任何指导我正确方向的帮助表示赞赏.

谢谢,查尔斯

delphi rtti delphi-7

20
推荐指数
2
解决办法
2474
查看次数

将数据从数据集结构移动到另一个数据库的更快方法(在TDatasetProvider中)

我有一个自定义的TDatasetProvider,允许为它提供的任何数据创建新的字段.

所以,假设您在原始数据集上获得了以下字段:

  • 顾客ID
  • 名称
  • 年龄

您需要使用显示位图在DBGrid上选择它.好吧,你可以,因为我的DSP可以添加一个调用Selected数据集数据的布尔字段.

我现在这样做的方式:

  1. 创建2个TClientDataset对象(Origin和Target)
  2. 在Origin中,我加载从InternalGetRecords方法的参数获得的数据(我覆盖它)
  3. 在Tar​​get中,我创建了从Origin数据集定义的fielddef,并添加了开发人员在设计时创建的fielddef
  4. 在Tar​​get上执行CreateDataset
  5. 并且,逐行(和逐个字段),我将数据从Origin数据库复制到Target数据集
  6. 最后,将Data变量作为InternalGetRecords的返回值返回.

我真的不知道是否有更优雅(和更快)的方式来做到这一点.有另一种(更快和/或更优雅)的方式来获得这个结果?

delphi tclientdataset tdatasetprovider

12
推荐指数
1
解决办法
1万
查看次数

TDataset书签有效期多长时间?

在我正在工作的项目中,我有如下代码.

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 …

delphi tclientdataset dbexpress

10
推荐指数
3
解决办法
5778
查看次数

我如何在TCheckListBox上使用多个列?

我正在使用TcheckListBox控件,并希望在此使用第二列,但除了Columns和Header属性之外,我找不到插入多列内容的任何来源...

它看起来像一个noobie问题,但Delphi的帮助没有任何关于此的内容,我的搜索(在Google和SO上)带来了很多垃圾......

我只需要一个例子.

delphi tchecklistbox

10
推荐指数
2
解决办法
9083
查看次数

如何使TXMLDocument(使用MSXML实现)始终包含编码属性?

我有遗留代码(我没写它)总是包含编码属性,但重新编译到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)

xml delphi encoding txmldocument delphi-2010

9
推荐指数
2
解决办法
4778
查看次数

如何继承通用的虚方法?

我有以下代码.我想覆盖基础列表的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 generics inheritance delphi-xe2

7
推荐指数
1
解决办法
460
查看次数

使用delphi确定进程虚拟大小

我有一个Delphi程序,我正在研究这个程序如何在日志文件中打印自己的"虚拟大小",以便我可以看到它何时使用了太多内存.如何使用Delphi代码确定"虚拟大小"?

"虚拟大小"是指Process Explorer显示的值.普通任务管理器无法显示此值.它不是程序的内存使用,而是地址空间的使用.在Win32上,程序不能使用超过2 GB的地址空间.

PS:我使用的是Delphi 6,但其他版本的代码/信息也应该没问题.

windows delphi delphi-6

6
推荐指数
2
解决办法
854
查看次数

使用TValue将字符串转换为枚举类型?

我想使用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)

delphi rtti delphi-2010 tvalue

5
推荐指数
2
解决办法
7853
查看次数

我在使用 Application.ActivateHint 时缺少什么?

我正在尝试在按钮中使用 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 vcl delphi-xe2

5
推荐指数
0
解决办法
205
查看次数

多种形式的Delphi应用程序和对话框

我有一个Delphi 7应用程序,它有两个文档视图(例如,所见即所得HTML编辑可能有WYSIWYG视图和源视图 - 而不是我的真实应用程序).它们可以在单独的窗口中打开,也可以停靠在主窗口中的选项卡中.

如果我从其中一个单独的表单打开模式对话框,则主表单将显示在前面,并在Windows任务栏中显示为选定的窗口.假设主窗体是WYSIWYG视图,并且源视图被激活.您转到源视图中的特定点并插入图像标记.将出现一个对话框,允许您选择并输入图像所需的属性.如果WYSIWYG视图和源视图重叠,则WYSIWYG视图将显示在前面,并且隐藏源视图.一旦对话框被解除,源视图就会重新出现.

我已经尝试将所有者和ParentWindow属性设置为与其相关的表单:

dialog := TDialogForm.Create( parentForm );
dialog.ParentWindow := parentForm.Handle;

我该如何解决这个问题?我还应该尝试什么?

鉴于人们似乎对我的例子感到磕磕绊绊,也许我可以尝试一个更好的例子:一个文本编辑器,允许你同时打开多个文件.您打开的文件位于选项卡(如Delphi IDE中)或其自己的窗口中.假设用户调出拼写检查对话框或查找对话框.发生的情况是,如果文件正在其自己的窗口中进行编辑,则在显示模式对话框时,该窗口将以z顺序发送到主窗体下方; 关闭对话框后,它将返回到原始的z顺序.

注意:如果您正在使用Delphi 7并寻找此问题的解决方案,请在页面下方查看我的答案,看看我最终做了什么.

delphi delphi-7

4
推荐指数
1
解决办法
7170
查看次数