Delphi 7将参数从integer更改为shortint

kq4fsx7k  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(222)

我遇到了一个问题,在IDE中关闭并重新打开文件会将我的数据集的参数(tparam)从integer更改为shortint。如果我将它们更改为integer,它看起来会保存,但一旦关闭并重新打开,它又会恢复为shortint。Delphi 是否有办法将参数从Integer更改为Shortint
我在这里发现了类似的问题http://www.delphigroups.info/2/1/284088.html
它似乎是一个错误,但有**有一些时尚的变通办法吗?**升级 Delphi 版本是不是我可以做的事情在这一刻。(复制步骤概述在第二次编辑)
编辑:
如果将值类型更改为integer,只需在表单上放置一个TQUERY,然后在其中放置一个带有参数的sql语句,即可实现此操作。保存并重新打开值类型,然后将其更改为shortint。
再次编辑:
在 Delphi 7中,创建一个新的应用程序。在表单上放置一个TQUery。编辑SQL脚本,类似于'select * from table where id =:idnumber。接下来编辑参数。选择idnumber,并将VALUE.TYPE更改为Integer。此时,您可以保存文件并关闭。当您重新打开文件时,再次转到参数,选择idnumber,它将保持ftInteger类型,但value.type将为Shortint。这是我希望保持整数的部分,但不幸的是,它将被转换为shortint。

h43kikqp

h43kikqp1#

我可以解释您看到的行为,它不是bug。(顺便说一句,您的问题是误导性的。根据编辑和注解,您的实际问题是“ Delphi 7将Parameter.Value.Type从integer更改为shortint”,这根本不是一回事。)
您正在检查Param.ValueValue.Type,它没有存储在.dfm文件中。Value.Type是在表单从dfm流入并读取Value时设置的,或者是在运行时设置Value时设置的。
我可以按照你的步骤来演示这一点:
在一个新的空白表单上放置一个TQuery。在TQuery.SQL中添加一些SQL。我使用了SELECT Id FROM SomeTable WHERE Id = :id
TQuery.Params中单击...,然后在Parameter Editor对话框出现时单击id参数。在对象检查器中单击Value,然后将Value.Type更改为Integer
保存项目和窗体,然后关闭它们。重新打开项目,右键单击窗体,然后从上下文菜单中选择View as Text。您将看到Query1组件的以下内容:

object Query1: TQuery
  SQL.Strings = (
    'select id from sometable where id = :id')
  Left = 152
  Top = 80
  ParamData = <
    item
      DataType = ftInteger
      Name = 'id'
      ParamType = ptInput
      Value = 0
    end>
end

注意,在ParamData中,没有Value.Type;这是因为它是在读取Value时设置的,而不是在保存表单时存储的。
现在,再次右键单击,选择View as Form。返回Query1.Parameters,编辑Value,并将其设置为一个较高的数字(我使用了123456789)。
保存表单,然后再次保存View as Text。请注意Query1信息:

object Query1: TQuery
  SQL.Strings = (
    'select id from sometable where id = :id')
  Left = 152
  Top = 80
  ParamData = <
    item
      DataType = ftInteger
      Name = 'id'
      ParamType = ptInput
      Value = '123456789'
    end>
end

请注意,仍然没有存储Value.Type。请检查对象检查器以查找ValueType,它现在显示为String,尽管参数.DataType仍然为ftInteger。这是由于IDE的流机制看到引号并相应地设置了Value.Type所致。
同样,它对正在运行的应用程序没有影响。IDE中的Value.Type并不重要。
有趣的附注:在如上所述将Value.Type显示为String之后,如果您再次将表单显示为文本,请删除Value属性周围的'字符和View as Form,然后再次检查参数的Value.Type,它将变为Integer。这进一步表明它是在流处理过程中设置的,而在设计阶段则没有意义。

fquxozlt

fquxozlt2#

如果您正在寻找一种简单的方法来转换具有相同图像(字节数)的变量类型,请使用absolute关键字:

function wordToSmallInt(w : word) : smallInt; inline;
   {$WARN UNSAFE_CODE OFF}
   s : smallInt absolute w;
   {$WARN UNSAFE_CODE ON}
begin
   result := s;
end;

当然,这对于具有相同大小的所有数据类型都是类似的。

相关问题