Paulo RB

Archive for fevereiro, 2012

Aumentando o limite de recursão em Python

by paulorb on fev.17, 2012, under Python

Para saber o limite atual use:

sys.getrecursionlimit() 

Para aumentar o limite use

sys.setrecursionlimit() 

 

http://docs.python.org/library/sys.html#sys.setrecursionlimit

Leave a Comment :, more...

T4 Language

by paulorb on fev.17, 2012, under C#, EF

Um bom artigo sobre T4 Language. Muito interessante e no final mostra algumas extenções para o vs.

http://msdn.microsoft.com/en-us/data/gg558520

Leave a Comment : more...


Detecção de UserAgent Cliente Side / iPhone

by paulorb on fev.13, 2012, under iPhone

Dica de como detectar em client side o UserAgent.  No exemplo verificamos se ele é Iphone

    if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))) {
    window.location = "http://www.paulorb.com.br";
    }
    
Leave a Comment more...


C++/CLI out

by paulorb on fev.08, 2012, under C++/CLI

Dica Rápida: como especificar o atributo out em C++/CLI

    using namespace System::Runtime::InteropServices;
    void Test([Out] ClasseTest^% x);
    
Leave a Comment : more...

Windows Messages em C++/CLI Form

by paulorb on fev.07, 2012, under C++/CLI

Quando precisamos usar funções que trabalham com os windows messages, como PostMessage e SendMessage temos sempre que lembrar que programas em windows são baseados em eventos que são tratados no Message Loop como no exemplo abaixo:


    #include <Windows.h>

    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

    int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    PSTR szCmdLine,
    int iCmdShow
    )
    {
    static TCHAR szAppName [] = TEXT("HelloWindows");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndClass;

    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    wndClass.lpfnWndProc = WndProc;
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.hInstance = hInstance;
    wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = szAppName;

    if (!RegisterClass(&wndClass))
    {
    MessageBox(NULL, TEXT("Error registering class."), szAppName, MB_ICONERROR);
    return 0;
    }

    hwnd = CreateWindow(szAppName,
    TEXT("The Hello Windows Native Programming"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    NULL,
    NULL,
    hInstance,
    NULL
    );

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }

    return msg.wParam;
    }

    LRESULT CALLBACK WndProc(
    HWND hwnd,
    UINT message,
    WPARAM wParam,
    LPARAM lParam
    )
    {
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;

    switch (message)
    {
    case WM_PAINT:
    hdc = BeginPaint(hwnd, &ps);
    GetClientRect(hwnd, &rect);

    DrawText(hdc, TEXT("Hello, Windows Native Programming!"), -1, &rect,
    DT_SINGLELINE | DT_CENTER | DT_VCENTER);

    EndPaint(hwnd, &ps);
    return 0;

    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
    }

Agora vamos imaginar o seguinte cenario, você está desenvolvendo uma aplicação em C++/CLI que se  integrará com uma API externa em .net , essa API tem uma propriedade chamada windowHandle onde você  precisa passar um Handle válido de uma janela, o objetivo dessa API é te fornecer uma forma de receber requisições assincronas por isso tem um evento Changed que sera chamado sempre que uma nova requisição chegar, o problema que irei relatar nesse post é o de que não é so criar uma janela  e chamar o metodo Show e esperar os eventos chegarem.    Veja o exemplo abaixo essa foi a primeira tentativa que NAO FUNCIONOU, o metodo VariableValue_Changed nunca é chamado.

Form ^formDispather = gcnew Form();
API::Variable::VariableComp declaredAPI;
 declaredAPI = gcnew API::Variable::VariableComp();
 declaredAPI->WindowHandle = formDispather->Handle;
 declaredAPI->Changed += gcnew System::EventHandler(this,&NameOftheClass::VariableValue_Changed);
 formDispather->Show();

Olhe agora a milionesima tentativa que funcionou. Perceba a diferença!

Form ^formDispather = gcnew Form();
API::Variable::VariableComp declaredAPI;
 declaredAPI = gcnew API::Variable::VariableComp();
 declaredAPI->WindowHandle = formDispather->Handle;
 declaredAPI->Changed += gcnew System::EventHandler(this,&NameOftheClass::VariableValue_Changed);
Application::Run(formDispather);

Perceba que a diferença é so que no primeiro que não funcionou eu usei o metodo Show do Form e no segundo que funcionou eu usei o Application::Run eis agora a explicação de porque funcionou: o aplication run inicia uma “aplication message loop” que trata as window messages enquanto o metodo show somente não faz isso. Isso me custou horas e horas de alguns colegas. Referencia para nunca cometer esse erro: http://msdn.microsoft.com/pt-br/library/ms157901(v=vs.90).aspx

Leave a Comment :, more...

EventHandler em C++/CLI

by paulorb on fev.06, 2012, under C++/CLI

Uma dica interessante de algo que não achei muita documentação na net, como usar EventHandler em C++/CLI. Vou mostrar a diferença entre as implementações em C# e C++/CLI

Em C#:


this.TestComponent.Changed += new EventHandler(VariableValue_Changed);

void Event::VariableValue_Changed(Object sender , EventArgs e){ ... }

Em C++/CLI


this->TestComponent->Changed += gcnew System::EventHandler(this, &NameOfTheClass::VariableValue_Changed);

void Event::VariableValue_Changed(System::Object^ sender , System::EventArgs^ e){
...
}
Leave a Comment : more...

Server-generated keys não são suportadas no SQL Server Compact com EF

by paulorb on fev.02, 2012, under C#, EF

O SQL Server Compact não suporta  Server-generated keys ou seja se quando você criar o arquivo SDF, e for criar a tabela você deve prestar atenção ao criar a chave-primária. Olhe a figura abaixo um exemplo de um exemplo de como configurar.

Na figura setamos o datatype como   BigInt  colocamos como unico e como chave primária. E o mais importante setamos o Identity como false ou seja NÃO queremos que as chaves sejam auto-incrementadas algo que o EF no SQL Server Compact não suporta, nós então  faremos isso manualmente.

No codigo o ID deverá ser preenchido manualmente, algumas soluções para isso.


using (BDEntitiesCont db = new BDEntitiesCont())                {

Tasks t = new Tasks();

t.id = (new Random().Next(1,10000) );

...

}

ou algo melhor


using (BDEntitiesCont db = new BDEntitiesCont())                {

Tasks t = new Tasks();

t.id = DateTime.UtcNow.Ticks;

...

}

Referencias

http://technet.microsoft.com/en-us/library/cc835494.aspx

http://erikej.blogspot.com/2010/04/solutions-to-server-generated-keys-and.html

http://msdn.microsoft.com/pt-br/library/bb738536.aspx

Leave a Comment : more...

Re-throw Exception sem criar objeto de Exception

by paulorb on fev.01, 2012, under C++, C++/CLI

Dica rápida:   veja a situação abaixo


try{

//something

}catch(Exception^ e) {

return false;
 }

Se você não usa o Objeto tratador da exception então não DECLARE-O.

Solução:


try{

//something

}catch(...) {

return false;
}

E se precisar passar a diante qualquer exception use:

 


try{

//something

}catch(...) {

throw;
}

Referencia: http://msdn.microsoft.com/en-us/library/6dekhbbc(v=vs.80).aspx

Leave a Comment more...

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Calendário

fevereiro 2012
S T Q Q S S D
« jan   mar »
 12345
6789101112
13141516171819
20212223242526
272829