TStringGrid per rechtsklick markieren



  • tag,

    ich möchte das bei rechtklick in einer TSringGrid ein popup aufgeht (was ja passiert) aber er auch die zeile(zelle) markiert.

    weiss einer hilfe?



  • Im MouseDown-Event per TStringGrid::MouseToCell die Zellen-Koordinaten ermitteln und anschliessend Row und Col des StringGrids entsprechend setzen. Letzteres sollte ggf. auch über Selection funktionieren.



  • void __fastcall TForm1::StringGrid1MouseUp(TObject *Sender,
    TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    long Column, Row;
    StringGrid->MouseToCell(X, Y, Column, Row);
    Caption=IntToStr(Column);
    }

    also Column sind bei mir richtige Koordinaten .. was mach ich denn falsch?



  • Keine Ahnung, dazu müsstest du uns erstmal verraten, was das Problem ist.



  • Das Column Koordinaten sind und keine Indexe der StringGrid?
    Normal wenn ich die Borland Hilfe verstanden habe, sollten aus dem X, Y die ich bei MouseUp erhalte Col und Row rauskommen damit ich damit die Cell ansprechen kann .. wenn ich nur 2 zeilen/3 spalten habe glaub ich nicht das 500 nen Index einer Spalte ist.

    😞



  • void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
      int col, row;
      StringGrid1->MouseToCell(X, Y, col, row);
      StringGrid1->Col = col;
      StringGrid1->Row = row;
    }
    


  • vielen dank ..

    also es liegt an "long" .. wenn ich wie du "int" nehme klappt es .. sobald "long" dann nicht mehr ..



  • sorry das ich dich nochmal belästige 🙂

    void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender, 
          TMouseButton Button, TShiftState Shift, int X, int Y) 
    { 
      int col, row; 
    
      try
      {
        StringGrid1->MouseToCell(X, Y, col, row); 
      }
      catch(???)
      {
        StringGrid1->Col = col; 
        StringGrid1->Row = row; 
      }
    }
    

    was muss bei ??? rein damit der nachfolgende code ausgeführt wird?
    da wenn ich in StringGrid klicke und dort keine Celle ist eine Exception ausgeführt wird...



  • Was dort rein muss verrät dir die Exception-Meldung. Alternativ einfach ... eintragen, damit werden alle Exceptions abgefangen. Siehe auch die FAQ unter "Drucker".

    if (Button == mbRight)
    {
      int col, row;
      try
      {
        StringGrid1->MouseToCell(X, Y, col, row);
        if (col >= StringGrid1->FixedCols && row >= StringGrid1->FixedRows)
        {
          StringGrid1->Col = col;
          StringGrid1->Row = row;
        }
      }
      catch(EInvalidGridOperation &E)
      {
        // optional Fehlermeldung ausgeben
        //ShowMessage("Fehler! " + E.Message);
      }
    }
    

    In diesem Beispiel sind die Abfragen doppelt gemoppelt. Auf das try/catch könnte verzichtet werden, da bei einem Click ausserhalb der Zellen für col und row jeweils -1 zurückgegeben wird, was ja immer kleiner als FixedCols und FixedRows ist.



  • danke .. vielen dank 🙂


Anmelden zum Antworten