ListBox, StringGrid oder ...?



  • Hallo,

    wie kann ich einen mehrspaltigen auswahl bereich erstellen der einen Kopf hat in dem die spallten überschrifften stehen und bei einem click auf einem eintrag die ganze zeile makiert wird.

    Ich habe einen Versuch mit einem StringGrid unternommen der auch funktioniert hat allerdings gibt es probleme einen ausgewählten eintrag auszuwerten. Ist ein StrigGrid überhaupt der richtige Weg oder gibt es vieleicht schon eine Komponente die ich nicht kenne welchen mein problem lösen würde?



  • TListView wäre vielleicht noch eine Alternative. Wenn Du allerdings schon Probleme mit einem TStringGrid hast, wirst Du mit einem TListView nicht allzu weit kommen.
    Vielleicht kannst Du die Probleme mit dem StringGrid näher beschreiben, dann können wir Dir bestimmt eher helfen.



  • webmaster1987 schrieb:

    ... allerdings gibt es probleme einen ausgewählten eintrag auszuwerten...

    was für Probleme sind das?



  • ich hab zuerst keine möglichkeit gefunden die makierung zu identifitzeren ob es eintarg 1 oder 7 oder so ist meine ich damit.

    ich habe dann eine int variable deklariert und mit der onSelectCell metode den ausgewählten eintrag (die zeilen nummer) gespeichert. So konnte ich jetzt auf den eintrag zugreifen. allerdings kam mir diese vorgehensweise komisch vor deshalb wollte ich zur sicherheit mal nachfragen ob es nich doch eine Komponente gibt die dafür ausgelegt ist.



  • Hallo

    siehe den Event OnSelectCell für genaue Funktionen beim Auswählen einer Zell oder die Eigenschfaten Row/Col, wenn du im Nachhinein die aktuellen Indexe wissen willst.

    bis bald
    akari



  • void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
          int ARow, bool &CanSelect)
    {
    if(ARow==0)
    {
       TStringGrid *grid=dynamic_cast<TStringGrid*>(Sender);
       CanSelect=false;
       TGridRect rect;
       rect.Left = ACol;
       rect.Top = 1;
       rect.Right = ACol;
       rect.Bottom = grid->RowCount;
       grid->Selection = rect;
    }
    }
    

    Fixed Cols und Rows auf 0
    goRangeSelect raus
    goDrawFocusSelected rein



  • wenn du schon dynamic_cast brauchst, solltest du den Zeiger auf gültigkeit überprüfen..



  • BigNeal schrieb:

    wenn du schon dynamic_cast brauchst, solltest du den Zeiger auf gültigkeit überprüfen..

    Unsinnig, wenn man dynamic_cast in einem Ereignis vom StringGrid verwendet.
    Was soll da schiefgehen ? 🙄



  • Hallo

    wenn du dir da sicher bist (was ja auch in dem fall richtig ist), dann kannst du ja sttatt desen auch besser static_cast nehmen, was keine Laufzeit-Überprüfung durchführt.

    bis bald
    akari



  • 😮 Danke Leute

    Aber ganz so komplex brauchte ich es gar nich, ich habe jetzt einfach die option goRowSelect auf true gestellt und jetzt kann ich wie ich weiter oben schon geschrieben hab an den index kommen und damit dann auch an die daten der zeile.

    ps: was bewirk dieser quelltext?

    void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
          int ARow, bool &CanSelect)
    {
    if(ARow==0)
    {
       TStringGrid *grid=dynamic_cast<TStringGrid*>(Sender);
       CanSelect=false;
       TGridRect rect;
       rect.Left = ACol;
       rect.Top = 1;
       rect.Right = ACol;
       rect.Bottom = grid->RowCount;
       grid->Selection = rect;
    }
    }
    

    Fixed Cols und Rows auf 0
    goRangeSelect raus
    goDrawFocusSelected rein



  • dynamic_caster schrieb:

    Unsinnig, wenn man dynamic_cast in einem Ereignis vom StringGrid verwendet.
    Was soll da schiefgehen ? 🙄

    Es ist möglich, dass die funktion auch von anderen Klassen aufgerufen wird.
    Kann man das bei seinem Programm zu 100% ausschliessen, dan kann man auf die gültigkeits-abfrage des Zeigers verzichten. dan ist es aber Unsinnig ein dynamic_cast zu nehmen, da somit die grosse stärke des dynamic_cast verlohren geht. Ohne die Gültigkeitsabfrage ist der dynamic_cast nur ein teurer static_cast

    also man nimmt entweder

    TStringGrid *StringGrid = static_cast<TStringGrid*>(Sender);
    

    oder

    TStringGrid *StringGrid = dynamic_cast<TStringGrid*>(Sender); 
    if(StringGrid)
    {
        ...
    }
    

Anmelden zum Antworten