小编Ren*_*ann的帖子

如何在显示子项时将子项动态添加到 TMenuItem

我有这样的菜单结构:

1. Option A
    1.1 Option B
        1.1.1 Option C
        1.1.2 Option D
    1.2 Option C
        1.2.1 Option B
        1.2.2 Option D
    1.3 Option D
        1.3.1 Option B
        1.3.2 Option C
2. Option B
    2.1 Option A
        2.1.1 Option C
        2.1.2 Option D
    2.2 Option C
        2.2.1 Option A
        2.2.2 Option D
    2.3 Option D
        2.3.1 Option A
        2.3.2 Option C
3. Option C
    3.1 Option A
        3.1.1 Option B
        3.1.2 Option D
    3.2 Option B
        3.2.1 Option A
        3.2.2 …
Run Code Online (Sandbox Code Playgroud)

delphi submenu

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

引用计数在shared_ptr中不起作用

以下代码导致运行时错误.

每个都shared_ptr拥有相同的内存,但每个内存的数量仍然是一个.

因此,每个共享指针都是不同的,所以当它们超出范围时,它们会尝试释放块,这会导致损坏堆.我的问题是如何避免这种情况?

只想添加这样的声明

shared_ptr<int> x(p);
Run Code Online (Sandbox Code Playgroud)

不可谈判我必须申报.

#include <iostream>
#include <memory>
using namespace std;
int main ()
{
  int* p = new int (10);
  shared_ptr<int> a (p);
  shared_ptr<int> b (p);
  shared_ptr<int> c (p);
  shared_ptr<int> d (p);
  cout<<"Count : "<<a.use_count()<<endl;
  cout<<"Count : "<<b.use_count()<<endl;
  cout<<"Count : "<<c.use_count()<<endl;
  cout<<"Count : "<<d.use_count()<<endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ reference-counting shared-ptr

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

覆盖SetEnabled与处理消息CM_ENABLEDCHANGED

有一个TFrame后代类如下:

TCustomHistoryFrame = class(TFrame)
  tbMainFunction: TToolBar;
  // there's more, of course, but that is irrelevant to the question
end;
Run Code Online (Sandbox Code Playgroud)

我注意到,当我Enabled将此框架的属性设置为时False,其组件tbMainFunction将不会(视觉上)被禁用.

我的第一个想法是覆盖虚方法TControl.SetEnabled.看看它的实现,我看到它在CM_ENABLEDCHANGED实际值不同时执行控制消息.

我不确定如何以Enabled正确的方式将框架的状态应用到工具栏.
常见的做法是什么?由于这个问题主要是以观点为基础的,所以让我重新说一下:

无论是重写SetEnabled还是处理都有哪些优点和缺点CM_ENABLEDCHANGED


事情,我想到了自己:

  • 覆盖SetEnabled:
    • 我必须重新检查新值是否与旧值不同.这将是一种冗余.(这对性能没有显着影响,但是 - 叫我一个头发分裂器 - 闻我.)
  • 处理CM_ENABLEDCHANGED:
    • 如何维护此消息的继承代码?在(TControl和)中有(至少)此消息的实现TWinControl.如果我在课堂上处理这些信息,他们还会被执行TCustomHistoryFrame吗?

delphi overriding message-queue delphi-10.1-berlin

3
推荐指数
1
解决办法
276
查看次数

DynArraySize()仅适用于649个整数元素的数组

我在Delphi 10.2 Update 2中遇到了与RTTI相关的问题,并且能够将其跟踪到更少的代码量(见下文).

我有一些TPersistent-descendant类TMyObj发布类型的属性TArray<Integer>.当我通过GetDynArrayProp()它接收它的值并通过它查询它的大小时,DynArraySize()只能达到649个元素的大小.在此特殊计数之上返回一些非常大的值.

请注意,我的数组是从一个实例生成TDictionary<Integer,Boolean>Keys拥有自己的财产ToArray的方法.我也尝试修改,TMyObj.GetDynArray以便它TArray<Integer>直接返回一个实例,它正常工作.因此,我认为这可能会以一些神秘的方式相关联.

我的使用有DynArraySize()什么问题?这种动态数组的神秘行为背后是什么?

program RTTIPropDynArray;

{$APPTYPE CONSOLE}

uses
  System.Classes, System.Generics.Collections, System.SysUtils, System.TypInfo;

type
  TMyDict  = TDictionary<Integer,Boolean>;
  TMyArray = TArray<Integer>;

  TMyObj = class(TPersistent)
  private
    FValues: TMyDict;
    function GetDynArray: TMyArray;
  public
    constructor Create(const ACount: Integer);
    destructor Destroy; override;
  published
    property DynArray: TMyArray read GetDynArray;
  end;

{ TMyObj }

constructor TMyObj.Create(const ACount: Integer);
begin
  FValues …
Run Code Online (Sandbox Code Playgroud)

delphi rtti dynamic-arrays delphi-10.2-tokyo

3
推荐指数
1
解决办法
138
查看次数

弱势和强势属性的例子

我开始使用Objective-C开发并尝试理解弱和强引用.我想我明白了,但我不确定...

让我们考虑一下代码:

@interface SomeClass {} 
@property (nonatomic, weak) NSString* propertyName;
@end
Run Code Online (Sandbox Code Playgroud)

现在,如果我在代码中的某个地方调用这样的东西:

NSString* s = someClassInstance.propertyName;

参考计数器不会递增.我的理解是否正确?

  • 疑问1:什么是参考计数器值propertyName

  • 怀疑2:那么......你能举例说明我什么时候可以获得对这个属性的强烈引用?我希望你知道我的意思或我不明白的东西......

我会得到弱参考.

reference-counting objective-c

2
推荐指数
1
解决办法
3197
查看次数

如何查询嵌入的OLE应用程序的显示名称

我想查询OLE应用程序的显示名称,它嵌入在我的Delphi XE4 Win32应用程序中.

TOleContainer使用类,容器可以包含不同的OLE应用程序(例如MS Word,MS Excel,...),具体取决于在其中编辑的文件.

我想要返回的是Microsoft Word 2007(或2010或2013或...)或至少Microsoft Word,因为它显示在普通Word实例的标题栏中.


编辑: TOndrej的回答非常有帮助.谢谢.

不幸的是,正如我在他的回答中的评论中所描述的那样,它没有显示真正的应用程序标题.我在SO上发现了这个问题.据说,我可以通过_Application.Caption属性访问主机应用程序的标题.我没有实例_Application,但IOleObject.Typecast(MyOleObjectInterface as _Application)失败了.

如何访问OleObject _Application

delphi excel ole ms-word

2
推荐指数
1
解决办法
276
查看次数

为什么我使用 foreach 总是得到 ArrayIndexOutOfBoundsException

我使用流将旧代码更改为新代码。但是当我启动tomcat时它不断出现

错误 osweb.servlet.DispatcherServlet - 上下文初始化失败 org.springframework.beans.factory.BeanDefinitionStoreException:无法读取候选组件类:文件 xxx(我的 FilePath)嵌套异常是 java.lang.ArrayIndexOutOfBoundsException:25091”

谁能告诉我是什么原因导致这个错误?我真的很感谢你的帮助。

/*old*/
for(String key:paramMap.keySet()){
    if(key.startsWith("NUMBER_OF_") ){
        String value = request.getParameter(key);
        if(value!=null && !value.equals("")){
            br.append(key.replace("NUMBER_OF_", "")).append(" = ")
                .append('"').append(value).append('"').append(" and ");
        }
    }
}

/*new*/
new ArrayList<>(paramMap.keySet()).stream().filter(p -> p.startsWith("NUMBER_OF_")).forEach(
    o ->{
        String value = request.getParameter(o);
        if(value!=null && !value.equals("")){
            br.append(o.replace("NUMBER_OF_", "")).append(" = ")
                .append('"').append(value).append('"').append(" and ");
        }
    });
Run Code Online (Sandbox Code Playgroud)

整个堆栈跟踪:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [D:\apache-tomcat-7.0.61\webapps\web\WEB-INF\classes\com\ais\brm\web\controllers\system\metadic\MetaDicManageController.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException
org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:260)
org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242)
org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84)
org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73)
org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1419)
org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1409)
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:184)
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:140)
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:111)
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390) …
Run Code Online (Sandbox Code Playgroud)

foreach indexoutofboundsexception java-stream

2
推荐指数
1
解决办法
1779
查看次数

Pascal指针改变其指向值

我是Pascal的新手,目前正在使用指针.我有2条记录,其中一条包含指向另一条记录类型的2条指针.

type
  WaypointRef = ^Waypoint;

  PathRef = ^Path;

  Waypoint = record
    id: integer;
    Name: string;
    pathRefs: array of PathRef;
  end;

  Path = record
    distance: integer;
    WaypointRefA, WaypointRefB: WaypointRef;
  end; 
Run Code Online (Sandbox Code Playgroud)

所有航路点都保存在一个阵列中.现在,当我试图读出路径的值时,我得到了神秘的结果:

writeln(waypoints[0].pathRefs[0]^.distance);
writeln(waypoints[1].pathRefs[0]^.distance);
Run Code Online (Sandbox Code Playgroud)

两者都应该打印相同的值,但它们不会.然而,更神秘的是,即使我尝试以下内容:

writeln(waypoints[0].pathRefs[0]^.distance);
writeln(waypoints[0].pathRefs[0]^.distance);
writeln(waypoints[0].pathRefs[0]^.distance);
Run Code Online (Sandbox Code Playgroud)

我得到2个不同的值.(正确的 - 先是173 - 然后是2次.)

waypoints[0].pathRefs[0]^
Run Code Online (Sandbox Code Playgroud)

总是指向同一个地址,因此我很困惑.我希望有人知道这个问题.

编辑:2似乎是默认值,因为如果我在路径创建时没有将任何值保存到"距离",它也会返回2.

EDIT2:这里是航点和路径创建的代码.我认为一定有失败.我现在可能会因设备内部的程序而混淆设计.我只是在试验.

procedure buildWaypoint(Name: string);

  procedure addWaypoint(w: Waypoint);
  var
    lngth: integer;
  begin
    lngth := Length(waypoints);
    SetLength(waypoints, lngth + 1);
    waypoints[lngth] := w;
  end;

var
  w: Waypoint;
begin
  w.id := id;
  id := id + 1;

  w.Name := …
Run Code Online (Sandbox Code Playgroud)

delphi pascal pointers

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

如何确定是否为窗口控件处理了 WM_SETREDRAW?

我使用 Windows 消息 WM_SETREDRAW(请参阅MSDN)来锁定某些控件的重绘。通常,它是成对发送的。
但是在某些情况下,我不能保证这一点(例如,当它由第三方视觉组件的一个 - 通常,但不是每次,成对 - 回调事件触发时)。

如果至少一个控件已被锁定,则已经有一个计数器可以全局锁定各种操作。当消息不是成对发送时,会违反此计数器。

因此,我正在寻找一种可能性来检查控件是否已被锁定。我也很欣赏解决这个问题的替代想法。
先感谢您。

这些是我用于发送的包装例程WM_SETREDRAW

function IsValidWinControlToUnLock(const WinControl: TWinControl): Boolean;
begin
  Result := Assigned(WinControl) and
           (WinControl.Handle <> 0) and
           ControlIsVisible(WinControl); // assure the control and all its ancestors (via Parent) are visible
end;                        

function LockWinControl(const WinControl: TWinControl): Boolean;
begin
  Result := IsValidWinControlToUnLock(WinControl);
  if not Result then exit;

  Inc(MyGlobalLockCounter);

  WinControl.Perform(WM_SETREDRAW, 0);
end;                         

function UnlockWinControl(const WinControl: TWinControl): Boolean;
begin                        
  Result := IsValidWinControlToUnLock(WinControl);
  if not Result then exit;

  WinControl.Perform(WM_SETREDRAW, 1);

  Dec(MyGlobalLockCounter); …
Run Code Online (Sandbox Code Playgroud)

winapi

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

Python生命长度

我正在尝试在python中创建一个程序,告诉你你已经活了多少天.我目前的代码是:

import datetime
from datetime import timedelta

year = int(input('Enter the year'))
month = int(input('Enter the month'))
day = int(input('Enter the day'))
date1 = datetime.date(year, month, day)

now = datetime.datetime.now().date()

days = now - date1
print days
Run Code Online (Sandbox Code Playgroud)

目前它打印的数字是天数然后0:00:00.例如:5914 days, 0:00:00.有谁知道如何摆脱0:00:00

python datetime python-2.7

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

delphi 7上的错误无效指针操作

procedure searchAndReceipt;
var
  amt, counter, check: integer;
  gtinStore, qtyStore: array of integer;
  totalCost: real;
begin
  check     := 0;
  totalCost := 0.0;

  write('Enter how many products you are purchasing: ');
  repeat
    readln(amt);
    if (amt > 11) and (amt <= 0) then
      writeln ('Please re-enter how many products are you purchasing with a value between 1-10')
    else
      check:= 1;
  until check = 1;

  SetLength(gtinStore, amt);
  SetLength(qtyStore, amt);
  SetLength(receiptArray, amt);

  for counter:=1 to amt do
  begin
    write('Enter a GTIN code: ');
    repeat
      readln(gtinStore[counter]); …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-7

0
推荐指数
1
解决办法
598
查看次数