Pointer auf Komponente übergeben, wie?



  • Hallo,

    ich möchte gerne für eine "isMouseOver" Funktion einen Pointer auf eine Komponente übergeben. Leider klappt das alles nicht so wie gedacht 😞

    Ich habe eine Funktion:

    bool __fastcall TfMain::isMouseOverComponent(TWinControl * Handle)
      {
      TPoint P;
      P = Mouse->CursorPos;
      P = Handle->ScreenToClient(P);
    
      struct cField
        {
        int x;
        int y;
        };
    
      cField p1, p2;
    
      p1.x = Handle->Left;
      p1.y = Handle->Top;
    
      p2.x = p1.x + Handle->Width;
      p2.y = p1.y + Handle->Height;
    
      if ((P.x >= p1.x && P.y >= p1.y) && (P.x <= p2.x && P.y <= p2.y))
        {
        return true;
        }
      else
        {
        return false;
        }
      }
    

    welche ich wie folgt aufrufe:

    if (isMouseOverComponent((TWinControl)leAuftragx->Handle) == true)
          {
          setAuftraXEdit(true);
          setAuftraNrEdit(false);
          }
    

    allerdings bekomme ich immer ein Fehlermeldung um die Ohren gehauen, die mir mitteilt, dann void * nicht in TWinControll gewandelt werden kann.
    Ich möchte eigentlich nur einen Pointer auf die Komponente kriegen, und anschliesend über den Pointer auf Methoden (ScreenToClient()) der Komponente auf die der Pointer zeigt zugreifen.
    Wie kann ich das machen!!

    Danke!



  • hallo clip

    was ist "leAuftragx" ?

    wenns ein TWinControl bzw. davon abgeleitet wurde, probier mal

    if (isMouseOverComponent((TWinControl)leAuftragx) == true)
    

    anstatt

    if (isMouseOverComponent((TWinControl)leAuftragx->Handle) == true)
    

    vielleicht klappts dann ja

    Meep Meep



  • weil Control->Handle nun mal ein void-Zeiger und kein Zeiger auf ein TWinControl ist!

    warum übergibst du das control nicht direkt (z.B. IsMouseOver(Button))? sollte mit allem gehen, was von TWinControl erbt.



  • leAuftragX ist ein TLabeledEdit. Ich möchte aber auch Edits, und eine ComboBox übergeben. Da ich nur auf Eigenschaften zugreife die alle dieser Komponenten habe, dürfte es ja eingentlich kein Problem geben.

    @Sunday:
    ich probiere es mal aus, es schein tzu gehen.

    @Meep:
    Dann will der Bcb die Variable mit bew instantiiert haben....



  • Super geht 😃 Danke!

    Ich musste nur noch den Parent mit übergeben, dann funst alles:

    Code:

    bool __fastcall TfMain::isMouseOverComponent(TWinControl * Handle, TWinControl * Parent)
      {
      TPoint P;
      P = Mouse->CursorPos;
      P = Parent->ScreenToClient(P);
    
      struct cField
        {
        int x;
        int y;
        };
    
      cField p1, p2;
    
      p1.x = Handle->Left;
      p1.y = Handle->Top;
    
      p2.x = p1.x + Handle->Width;
      p2.y = p1.y + Handle->Height;
    
      if ((P.x >= p1.x && P.y >= p1.y) && (P.x <= p2.x && P.y <= p2.y))
        {
        return true;
        }
      else
        {
        return false;
        }
      }
    

    Aufruf:

    if (isMouseOverComponent(leAuftragx, gbAunu) == true)
          {
          setAuftraXEdit(true);
          setAuftraNrEdit(false);
          }
    


  • Aus der Hilfe des BCB:

    Beschreibung

    Die Eigenschaft Handle gibt das Fenster-Handle des zugrundeliegenden Microsoft Windows-Bildschirmobjekts zurück. Verwenden Sie die Eigenschaft Handle, um die VCL-API zu umgehen und direkt auf das zugrundeliegende Fenster zuzugreifen.

    Greifen Sie während einer Streaming-Operation oder der Komponentenerstellung nicht auf die Eigenschaft Handle zu. Das zugrundeliegende Fenster existiert erst, nachdem die Eigenschaft Handle erstmals referenziert wurde. Wenn dies geschieht, wird die Methode HandleNeeded automatisch aufgerufen.

    Handle ist eine schreibgeschützte Eigenschaft.

    Noch Fragen) 😉


Anmelden zum Antworten