小编ste*_*nix的帖子

PHP运行时类修改

所以我希望能够在运行时添加/删除类方法.在你告诉我oop中可怕的实践之前,它可能是,但我并不在乎.我希望能够做到这一点的原因是因为我希望应用程序非常模块化,所以一些插件可以扩展一些基类并添加方法而不会杀死主应用程序.

例如,假设我有以下课程:

class User {
    protected $Id;
    protected $Name;
    protected $Password;
    protected $PostsPerPage;
 }
Run Code Online (Sandbox Code Playgroud)

而且,一些插件增加了用户更改其可见性设置的可能性,为类添加了一个$ Visible属性.该课程将成为:

class User {
    protected $Id;
    protected $Name;
    protected $Password;
    protected $PostsPerPage;
    protected $Visible;
 }
Run Code Online (Sandbox Code Playgroud)

这可以通过__get和__set来实现,但最常见的实现是获取和设置运行时生成的属性,并且为每个添加的属性编写伪getter和setter是一件麻烦事,并且使用__set是一个没有 - 不,我认为.

我的另一个想法是将用户设置单独存储在另一个数组中,如$ UserVisiblitySettings [userid],但这使得事情不像我希望的那样.

接下来的想法是创建一个帮助类,如下所示:

class UserHelper {
    public function SetVisiblity($user_object,value);
}
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用__get和__set来实现"朋友"方法/类,但这听起来太过于苛刻.如果我这样走,也可以重载__call,__ get和__set.另外我不太确定这是一个好的OOP实践,它看起来也很难看.

我的最后一个想法是通过使用eval()在运行时动态创建类的一些功能(这是我可以提出的唯一有效的eval使用).基本上,从文件中获取类定义,执行一些简单的括号查找以找到类的开始和结束括号并将其发送到eval.

使用runkit是不可能的,因为它已经过时了,我宁愿不强迫用户安装一些扩展.

当我查看我的想法时,最简单的一个和更少的cpu密集似乎是重载_call并添加方法在类中注册的方法.

请不要"不要这样做"的任何想法.

php oop reflection class dynamic

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

如何写一个能够foreach的类

自从Visual Studio添加了对foreach扩展的支持以来,已经有一段时间了

vector<int> v(3)
for each (int i in v) {
  printf("%d\n",i);
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何使任何类能够使用foreach.我需要实现一些接口吗?

c++ foreach iterator visual-studio

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

Python装饰器添加类级变量

我有2类A和B:

class A(object):
    x = 0

class B(object):
    y = 0
Run Code Online (Sandbox Code Playgroud)

如何通过使用装饰器使B继承A的类级别变量(在本例中为x)?有可能吗?装饰后,B的预期行为(如果可能)如下所示:

class B(object):
    x = 0
    y = 0
Run Code Online (Sandbox Code Playgroud)

注意:如果有人希望/需要知道为什么我问这个问题,那只是使SQLAlchemy的具体表继承在代码中看起来更好,尽管我可以看到很多这种情况的用例。

python inheritance metaprogramming decorator python-decorators

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

色盲辅助算法

有哪些算法可以帮助色盲人士获取辅助功能?我猜颜色减少可能有所帮助,但老实说,除了智能手机应用程序(甚至不是纸张),我在互联网上找不到太多信息.

理由:最近,我的CRT显示器停止输出洋红色,所以经过一些研究后,这似乎与一个有三角形的人看到的有点类似.基本上,红色光谱中的任何东西都将以蓝色阴影输出.虽然我可以买一台新的显示器,但我想知道基于软件的修复; 这种情况让我对构建可访问的应用程序感兴趣.

algorithm accessibility colors

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

在Windows中隐藏控件

我无法弄清楚如何隐藏子窗口(控件),更具体地说是GroupBox和PushButton.我认为使用SW_HIDE作为第二个参数的ShowWindow()可以完成这项工作,但它根本不起作用.然而SW_SHOW工作正常.我有两个控件的正确窗口句柄,所以这不是问题.

我用谷歌搜索,所有我能找到的人都在询问如何隐藏对话框,而不是控件.基于MFC的应用程序,不适用于此处.我使用的是纯Windows API,没有MFC.

我错了什么?

编辑:更多信息:我正在为WinApi控件编写一些简单的类包装器.除其他方法外,WindowsControl类还具有以下显示和隐藏Control的方法:

void Show() {
    ShowWindow(this->_hWnd,SW_SHOWNOACTIVATE);
}

void Hide() {
    ShowWindow(this->_hWnd,SW_HIDE);
}
Run Code Online (Sandbox Code Playgroud)

每个控件都继承自WindowsControl.

这个图像有窗口布局,所以你准确理解我在做什么:http://i.stack.imgur.com/PHQnH.png

当用户在"芯片组"静态控件内部单击时,它将加载给定Tile的信息(存储在数组中,但这是无关紧要的).根据设置,它将隐藏左侧的"编辑位墙"按钮并显示其后面的空GroupBox或反之.为了清楚这是我的windows api包装器没有问题,我得到了正确的HWND.虽然ShowWindow可能无法从不是父代的窗口过程中调用(这很奇怪).

EDIT2:在Visual Studio 2008中使用C++,没有MFC,没有WTL,没有CLR,没有.NET

EDIT3:我会发布更多代码,这样更容易

在静态窗口过程中,我像这样处理WN_LBUTTONDOWN:

case WM_LBUTTONDOWN: {
  ...
  update_tiledata(c, l)


void update_tiledata(GroupBox * c, ListView* l ) {
    ...

   if (chp_copy.Tiles[selectedTile].Pass() == PT_BITWALL) {
          c->Controls(CTL_BTNEDITBIT)->Show();
          c->Controls(CTL_FRPHOLD)->Hide();
   } else {

          c->Controls(CTL_FRPHOLD)->Show();
          c->Controls(CTL_BTNEDITBIT)->Hide();
   }
   update_edits();
}
Run Code Online (Sandbox Code Playgroud)

如前所述,ommited代码没有对类进行任何影响,使用正确的HWND调用带有SW_HIDE IS的ShowWindow,但没有任何事情发生.

windows winapi controls hide showwindow

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

自定义控件和Windows消息

我在纯Windows API中进行了自定义Splitter控件.它由4个控件组成:主容器,分离器和2个窗格.

现在我需要挂钩到windows程序,以便找出其中一个子控件正在移动或调整大小,所以我使用了SetWindowsHookEx.我在我的钩子程序中得到WM_SIZE消息就好了,但是没有从我的Splitter的子窗口中捕获WM_MOVE消息.

我尝试将一个子窗口添加到Groupbox(我知道这不是他们应该使用的方式)只是为了查看WM_MOVE消息是否被钩子程序捕获,而且它们是.

那我在这里错过了什么?我需要将什么添加到我的Splitter窗口过程中才能发送WM_MOVE?或者是我在其他地方的错误?

PS:SetWindowPos可以在这些子窗口上运行,它只是没有捕获WM_MOVE.

编辑:根据要求,这是Splitter窗口类的完整代码:http://pastebin.com/Lgvb0Vfv

以下是重要的代码部分:

LRESULT WINAPI AnchorProc(int nCode, WPARAM wParam, LPARAM lParam) {
    CWPRETSTRUCT* theMessage = (CWPRETSTRUCT*)lParam;

    if (theMessage->message == WM_MOVE) printf ("!");
}    
Run Code Online (Sandbox Code Playgroud)

在主窗口的WM_CREATE之后的某个时间:

SetWindowsHookEx(WH_CALLWNDPROCRET,AnchorProc,NULL,GetCurrentThreadId());

// groupbox

HWND gb = CreateWindowEx(0,"button",NULL,BS_GROUPBOX|WS_CHILD,0,0,200,200,hwndMain,0,hInst,NULL);
HWND but = CreateWindowEx(0,"button",NULL,BS_PUSHBUTTON|WS_CHILD,0,0,40,40,gb,0,hInst,NULL);

// custom control

HWND split = CreateWindowEx(0,"FSplitterClass",NULL,WS_CHILD,200,0,200,200,hwndMain,0,hInst,NULL);
HWND pane1 = (HWND)SendMessage(split,WM_SPGETPANE,0,0);
HWND but1 = CreateWindowEx(0,"button",NULL,BS_PUSHBUTTON|WS_CHILD,0,0,40,40,pane1,0,hInst,NULL);

SetWindowPos(but, NULL, 1,1,0,0,SWP_NOSIZE|SWP_NOZORDER); // triggers WM_MOVE …
Run Code Online (Sandbox Code Playgroud)

c windows hook winapi

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