[TLabel] OnMouseEnter/OnMouseLeave wollen nicht



  • Hallo

    Ich hab auf einer Form ein Label und wollte nun auf diese Events reagieren, aber es passiert einfach nichts. Ich hab absolut keine Erklärung dafür.
    Mein Programm bindet eine dll dynamisch ein. In dieser dll befindet sich ein Formular wo besagtes Label drauf ist, also eigentlich nichts sondeerlich exotisches.
    Hat jemand eine Ahnung woran das liegen könnte?

    Mfg

    MORL



  • Hat niemand eine Idee? 😞



  • Könnte von MORL stammen: "Ich programmiere gerade einen Text-Editor. Aber das geht nicht. Könnt ihr euch denken, was ich falsch mache?"



  • also bei winapi müsste man SS_NOTIFY setzen. kenn mich aber mit BCB überhaupt nicht aus. aber bestimmt findest du dort sowas ähnliches.



  • @WebFritzi: 😃 . Gut getrtoffen. Ich hab schon ein sehr gutes Talent dafür, Fragen präzise zu stellen, oder?

    Es hätte ja sein können, das es einen guten Grund dafür giebt, das die Labels nicht so funktionieren wie sie sollen. Fehlermeldungen giebt es keine und eine Lösung des Problems hat sich mir nicht erschlossen. Was hätte ich also anderes machen können, als hier zu fragen?

    Was könnte es sein?

    Vielleicht ein Bug des BCB?
    Vielleicht ein Bug der Kompo?
    Vielleicht ein Brainbug bei mir?
    Vielleicht ist meine Programmierung für'n Arsch?
    Vielleicht aber auch irgend was anderes?

    Hätte ja sein können, das dies ein bekanntes Problem ist....hmmmmm....dann hätte sich über die Suche etwas finden lassen sollen? Naja...
    Ich find es jedenfalls seltsam, das die Events nicht funktionieren und kann es mir auch nicht erklären.
    Falls noch jemand Ideeen haben sollte, woran es liegen könnte (Einstellungen im BCB, Einstellungen der Eigenschaften irgendwelcher Kompos, Verträglichkeit von verschiedenen Kompos, etc), würde ich mich freuen diese hier zu lesen. Es ist nämlich wichtig, das ich in meinem Programm auf diese Ereignisse reagiere.

    Mfg

    MORL



  • BCB6, TLabel auf TForm, MouseEnter/MouseLeave funktioniert hier wunderprächtig ...



  • Das funktioniert bei mir genauso gut(BCB 6 Enterprise), nur gerade in meinem aktuellen Projekt nicht.
    Wenn ich in einer der DLL'S eine neue Form erstelle, dort ein Label draufpacke und den OnMouseEnter - Event benutze, passiert garnix.
    Erstelle ich über File->New->Application ein neues Programm und mache dort das selbe, kann ich auf die Events reagieren.
    Sollte das vielleicht irgendwie mit der VErwendung von DLL's zu tun haben, das die Event-Handler nicht "laufen"?



  • Sollte das vielleicht irgendwie mit der VErwendung von DLL's zu tun haben, das die Event-Handler nicht "laufen"?

    Keine Ahnung 🙄 Hab noch nie ne Form in eine DLL gepackt, will das jetzt auch nicht explizit ausprobieren. Gehen denn die anderen Events, OnClick etc ?



  • Alle habe ich nicht ausprobiert, aber OnClick, OnMouseDown/Up und OnMouseMove funktionieren tadellos. Habs auch mit einer selber geschriebenen Komponente probiert, die auch diese Events hat, bei der hats auch net funktioniert. 😞

    Form sollte doch gleich Form und Label gleich Label sein, egal ob nun in einer DLL oder nich. Kann das vielleicht sein, das der die Messages irgendwie nich ordnungsgemäß behandelt?



  • Mit meiner Bemerkung meinte ich eigentlich, dass du mal Code zeigen sollst! Ist doch ganz klar.



  • Das Programm ist schon recht umfangreich, deshalb poste ich nicht alles.

    Hier das Hauptprogramm von dem aus die DLL's geladen werden.

    WINAPI WinMain(HINSTANCE hInstance, HINSTANCE , LPSTR , int iCmdShow)
    {
            char szAppClass[] = "Moa2SCRRuler";
            WNDCLASS wc;
    
            hIcon = LoadIcon(hInstance, "TRAYICON");
    
            wc.style                = CS_HREDRAW | CS_VREDRAW;
            //...füllen von wc.....
    
    	RegisterClass(&wc);
    
    	HWND hWnd = CreateWindow(szAppClass,
                                     "SCR-Ruler",
                                     WS_OVERLAPPEDWINDOW,
                                     0,
                                     0,
                                     0,
                                     0,
                                     NULL,
                                     NULL,
                                     hInstance,
                                     NULL);
    
    	ShowWindow(hWnd, SW_HIDE);        //SW_HIDE deshalb, weil dieses
                                                //Programm nur im Tray laufen soll
    	UpdateWindow(hWnd);
    
            MSG msg;
    	while(GetMessage(&msg, NULL, 0, 0))
    	{
                    TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	static NOTIFYICONDATA notifyIcon;
            int wmId;
    
    	switch (message){
                case WM_CREATE:         ReleaseCapture();
                                        SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,NULL);    //damit immer im vordergrund
    
                                           //Hier wird das TrayIcon gesetzt!
    
                                            bMenu[2]=DLLPanel->CreatePanel(hWnd);    //Laden der DLL über eine Schnittstellen-Unit (LinkDLL.cpp)
                                            return 0;
                    case WM_SYSTRAY:        switch(lParam)    //Nachricht vom Tray
                                            {
                                                    case WM_RBUTTONDOWN:    
                                //Hier wird das Popupmenü fürn Tray erstellt                                         }
                                            break;
                    case WM_ACTIVATE:       ShowWindow(hWnd,SW_HIDE);    //Fenster verstecken
                                            break;
                    case WM_COMMAND:        wmId = LOWORD(wParam);
                                            switch(wmId)
                                            {
                                                    //Behandlung der Tray Ereignisse                                        }
                                            break;
    		case WM_PAINT:          return 0;
    		case WM_DESTROY:        DestroyIcon(hIcon);
    			                PostQuitMessage (0);
    			                return 0;
    	}
    	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

    Okay soweit so gut. Ist sicher nicht der beste Code, aber es läuft 😃

    Hier nun die Schnittstellen-Unit, die, die DLL's läd und deren Funktionen aufruft

    h-Datei

    class TDLLPanel
    {
    private:
            typedef bool TCreatePanel(HANDLE);
    public:
            bool CreatePanel(HANDLE MainWin);();
    };
    

    cpp-Datei

    bool TDLLPanel::CreatePanel(HANDLE MainWin)
    {
     bool bResult=true;
     TCreatePanel* PCreate;
     PCreate = NULL;
     hPanel = LoadLibrary("Panel\\Panel.dll");
     if(hPanel != 0)
            PCreate = (TCreatePanel*)GetProcAddress(hPanel,"_CreatePanel");
     if(PCreate != NULL)
            PCreate(MainWin);
     else
            bResult=false;
     return bResult;
    }
    

    Die Funktion "CreatePanel" macht nix weiter, als die Form zu erstellen
    Panel.dll

    extern "C" __declspec(dllexport)void CreatePanel(HANDLE MainWin)
    {
     Application->Handle = MainWin;
     PanelWin = new TPanelWin(NULL);
     PanelWin->Show();
    }
    

    Auf diesem Form habe ich nun ein paar Labels platziert, bei denen ich nu gerne auf die besagten Events reagieren möchte. An sich sollte das doch keinen Unterschied machen, ob die Form nun aus einer DLL kommt oder nich.

    PS: Diese Code ist nur ein kleiner stark gekürtzter Auszug aus dem gesamten Programm, deshalb erscheint alles auch ein wenig wirr. Ich hoffe trotzdem, das man den Sinn der einzelnen Abschnitte nachvollziehen kann.


Anmelden zum Antworten