小编dum*_*uch的帖子

如何计算两个WGS84坐标之间的方位角(北角)

我有两个WGS84坐标,纬度和经度(以度为单位).这些点相当靠近,例如相距仅一米.

有没有一种简单的方法来计算这些点之间的线的方位角,即向北的角度?

天真的方法是假设一个笛卡尔坐标系(因为这些点非常接近)并且只是使用

sin(a)= abs(L2-L1)/ sqrt(sqr(L2-L1)+ sqr(B2-B1))

a =方位角L1,L2 =经度B1,B2 =纬度

当坐标远离赤道时,误差将更大,因为两个纵向度之间的距离变得越来越小于两个纬度之间的距离(其保持不变).

我发现了一些非常复杂的公式,我并不是真的想要实现,因为它们对于那些非常接近的点看起来有点过分而且我不需要非常高的精度(两位小数就足够了,一个也许很好,因为那里是其他降低精度的因素,比如GPS返回的那些因素.

也许我可以根据纬度确定一个近似的纵向修正系数,并使用这样的东西:

sin(a)= abs(L2*f-L1*f)/ sqrt(sqr(L2*f-L1*f)+ sqr(B2-B1))

其中f是修正系数

任何提示?

(我不想为此使用任何库,特别是那些不需要运行时许可证的库.任何MPLed Delphi Source都会很棒.)

delphi geolocation geospatial

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

为什么在Delphi XE2 64bit中为HKEY_常量获得"常量表达式违反子范围边界"?

当我在Delphi XE2中为目标平台64位Windows编译以下代码时......

function HKeyToString(_HKey: HKey): string;
begin
  case _HKey of
    HKEY_CLASSES_ROOT: result := 'HKEY_CLASSES_ROOT'; // do not translate
    HKEY_CURRENT_USER: result := 'HKEY_CURRENT_USER'; // do not translate
    HKEY_LOCAL_MACHINE: result := 'HKEY_LOCAL_MACHINE'; // do not translate
    HKEY_USERS: result := 'HKEY_USERS'; // do not translate
    HKEY_PERFORMANCE_DATA: result := 'HKEY_PERFORMANCE_DATA'; // do not translate
    HKEY_CURRENT_CONFIG: result := 'HKEY_CURRENT_CONFIG'; // do not translate
    HKEY_DYN_DATA: result := 'HKEY_DYN_DATA'; // do not translate
  else
    Result := Format(_('unknown Registry Root Key %x'), [_HKey]);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

...我收到每个HKEY_-Constants的警告:"W1012常量表达式违反了子范围"

我检查了Winapi.Windows中的声明(在标识符上使用Ctrl + …

delphi 64-bit winapi delphi-xe2

9
推荐指数
1
解决办法
2572
查看次数

如何有效地处理多个插入数组?

我有一个动态分配的整数数组,我想在任意位置插入整数.超过250万的许多整数.

我的代码目前看起来像这样:

type
  TIntegerArr = array of Integer;

var
  FCount: Integer;
  FSortedList: TIntegerArr;

procedure Insert(_Value: Integer; _InsertPos: integer);
var
  OldList: TIntegerArr;
begin
  OldList := FSortedList;
  if Length(FSortedList) < FCount + 1 then begin
    OldList := FSortedList;
    FSortedList := nil;
    SetLength(FSortedList, FCount + 100);
    CopyMemory(@FSortedList[0], @OldList[0], SizeOf(Integer) * _InsertPos);
  end;
  MoveMemory(@FSortedList[_InsertPos + 1], @OldList[_InsertPos], SizeOf(Integer) * (FCount - _InsertPos));
  FSortedList[_InsertPos] := _Value;
  Inc(FCount);
end;
Run Code Online (Sandbox Code Playgroud)

(真正的代码是一个将FSortedList和FCount作为字段的类的方法.)

使用临时列表并使用Move而不是for循环来移动数据可以提高性能,因为它可以防止数组在必须增长时被复制两次(一次在现有阵列上的SetLength中,另一次在Move中) ).

但最坏的情况是Insert(SomeValue,0)仍然会移动所有现有值.

到目前为止,我一直在考虑在数组的开头引入一个偏移量,而不是每次在前面插入一个新值时都必须移动所有现有的值,我只能在偏移量达到0时才这样做. :

// simple case: inserting at Position 0:
if FOffset = 0 …
Run Code Online (Sandbox Code Playgroud)

arrays delphi delphi-2007 dynamic-arrays

9
推荐指数
1
解决办法
770
查看次数

有没有办法让Delphi VCL表格大小而不改变BorderStyle?

我花了很多时间尝试在GExperts中使Delphi 6/7 IDE的Tools/Environment Options对话框变得相当大.一切似乎工作正常,直到我发现将窗体的BorderStyle更改为bsSizable关闭并重新创建窗体的句柄,并在此过程中丢失调色板配置的列表框的内容.(之后Items项属性为空.)

更改表单的大小(通过设置高度和宽度)可以正常工作,但允许用户调整大小会遇到上述问题.

有没有办法在不改变BorderStyle的情况下使Delphi表格变得相当大?

delphi delphi-7 delphi-6

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

哪种方式是在Delphi中定义快捷方式的"正确"?

关于如何在Delphi程序中定义ShortCut有很多例子,但它们归结为两种不同的方式:

  1. 将任何scCtrl,scShift和scAlt常量添加到键的Ord()中
  2. 使用Menus.ShortCut函数

例如

Action.ShortCut := scCtrl + scShift + Ord('K');
// vs
Action.ShortCut := Menus.ShortCut(Word('K'), [ssCtrl, ssShift]);
Run Code Online (Sandbox Code Playgroud)

这两种方式中哪一种更可取?如果是的话,哪一个和为什么?

delphi keyboard-shortcuts

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

如何冻结程序的执行?

假设我有一个程序会占用处理器和/或硬盘,以至于几乎无法在该计算机上执行任何其他操作.现在我不想杀掉那个程序,因为它的作用是有用的(这是一个批处理作业,真的是CPU或磁盘很重,例如它可以压缩几千兆字节的数据文件)但是我需要做的很短的时间那台电脑上别的东西.外部程序有什么办法可以暂时冻结性能杀手?

它就像旧的DOS选项,在没有多任务处理的情况下在程序之间切换.

假设有问题的假设程序是第三方产品,我没有源代码,也没有办法告诉它暂停.

我知道我可以改变程序的优先级,例如在TaskManager中,但这还不够,我想冻结它.

我说的是Windows XP作为操作系统,并希望用Delphi编写解决方案.我拥有该机器的所有权利,因此我可以以管理员身份启动,替换文件,如果有必要,我也可以安装服务.

delphi performance windows-xp

8
推荐指数
3
解决办法
3200
查看次数

是否可以使用TypeKind = tkMethod为TRttiType创建TRttiMethod实例?

大家好:)这是我在stackoverflow的第一个问题:)

在Delphi XE2 RTTI中我们有TRttiMethod类,它具有CreateImplementation()动态创建过程或函数的功能,它具有相同的签名和与其正文相同的方法.

使用TRttiContext.getMethods()/ getMethod()我们可以获得类方法的集合 - TRttiMethod的集合.

文档说(http://docwiki.embarcadero.com/VCL/en/RTTI.TRttiMethod)不要直接创建TRTTiMethod,并使用getMethods()来获取其实例.

所以,如果我们有TRTTIMethod实例,我们可以动态创建具有相同签名的方法,并在以后调用它.

问题是..例如,我们有TNotifyEvent ... TRttiContext.getType(typeinfo(TNotifyEvent))返回TRttiType具有typekind =的实例对象tkMethod.我们知道TNotifyEvent的签名是对象的过程(sender:TObject);

有可能得到TRttiMethod这个吗?我想为事件动态创建eventHandler,TRttiMethod.CreateImplementation() 或者可能有另一种方法动态创建方法实现?

PS:想法是创建类似事件链的东西.在编译时,我们不知道事件类型/签名,因此我们可以使用泛型,如TEvenChain <TNotifyEvent>.Chain在已注册的事件处理程序上有集合,因为我们在编译时不知道处理程序类型,我们必须动态创建它,并且该处理程序只获取其参数并使用它们调用已注册的处理程序.

更新: 这里是一些代码(想法是创建事件处理程序链):

procedure TMainForm.FormCreate(Sender: TObject);
begin
    FEventChain := TNotifyChain.Create();
    FEventChain.AddHandler(event1);
    FEventChain.AddHandler(event2);   

    TestButton.OnClick := FEventChain.EventHandler;
end;
Run Code Online (Sandbox Code Playgroud)

Event1&event2(sender : TObject)形式的方法; 它不是一般示例(T在这种情况下是NotifyEvent/TChain <TNotifyEvent>) TEventChain.EventHandlerTNotifyEvent

TNotifyChain

TNotifyChain = class(TObject)
  strict private
    FEvent : TNotifyEvent;
    FItems : TList<TNotifyEvent>;

    FCtx : TRttiContext; …
Run Code Online (Sandbox Code Playgroud)

delphi rtti delphi-xe2

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

我可以将扩展记录的方法分配给Delphi中的事件吗?

给出以下记录类型:

type
  TMyRecord = record
  private
    procedure SomeMethod(_Sender: TObject);
  end;
Run Code Online (Sandbox Code Playgroud)

应该可以将此方法指定为事件处理程序吗?

var
  MyRecord: TMyRecord;
begin
  Button1.OnClick := MyRecord.SomeMethod;
end;
Run Code Online (Sandbox Code Playgroud)

在Delphi 2007中,我在分配后得到内部编译器错误C1264.

我不确定Record方法的内部结构是否满足分配给事件指针的要求.

编辑:正如David Heffernan所指出的,这是Delhpi 2007中的编译器错误.我最终使用了以下解决方法:

type
  TMyRecord = record
  private
    procedure SomeMethod(_Sender: TObject);
    function GenerateNotifyEvent(_CodePtr: pointer): TNotifyEvent;
  end;

function TMyRecord.GenerateNotifyEvent(_CodePtr: pointer): TNotifyEvent;
var
  Method: TMethod;
begin
  Method.Data := @Self;
  Method.Code := _CodePtr;
  Result := TNotifyEvent(Method);
end;

var
  MyRecord: TMyRecord;
begin
  Button1.OnClick := MyRecord.GenerateNotifyEvent(@TMyRecord.SomeMethod);
end;
Run Code Online (Sandbox Code Playgroud)

不像简单的任务那么好,但足够好.我只是希望我可以简单地更新到更新版本的Delphi,其中修复了该错误.

delphi delphi-2007

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

如何在所有应用程序的每个窗口中绘制或添加自定义按钮?

我见过几个工具在Windows的所有应用程序的所有窗口的标题栏上添加自定义按钮和/或绘图.怎么做的?Delphi中的一个例子的额外点.

编辑:我发现dotNET的东西是这样的:http: //www.thecodeking.co.uk/2007/09/adding-caption-buttons-to-non-client.html#.VdmioEDenqQ

windows delphi winapi

7
推荐指数
2
解决办法
1174
查看次数

Delphi"default"关键字,旧版Delphi版本中包含Record类型

我在Delphi Detours库中有这个代码,我正在尝试移植:

type
  TInstruction = record
    Archi: Byte; { CPUX32 or CPUX64 ! }
    AddrMode: Byte; { Address Mode }
    Addr: PByte;
    VirtualAddr: PByte;
    NextInst: PByte; { Pointer to the Next Instruction }
    OpCode: Byte; { OpCode Value }
    OpType: Byte;
    OpKind: Byte;
    OpTable: Byte; { tbOneByte,tbTwoByte,... }
    OperandFlags: Byte;
    Prefixes: Word; { Sets of Prf_xxx }
    ...
  end;

var
  Inst: TInstruction;
begin
  ...
  Inst := default (TInstruction); // <-
  Inst.Archi := CPUX;
  Pvt := PPointer(AIntf)^; // vTable !
  PCode …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-7 delphi-5

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