CheckBox in StringGrid-Zelle einbinden



  • Hallo, wie kann ich eine Checkbox in eine StringGridZelle einbinden?
    Danke.

    (Es geht um Borland C++ Builder)



  • Ein anderes Grid nehmen, das Custom Controls unterstützt. Ich kann als kostenlose Lösung KGrid empfehlen.



  • Hallo

    Als Alternative kannst du dir auch selber für das StringGrid einen Inplace-Editor schreiben. Hier wird es am Beispiel einer ComboBox erklärt.

    bis bald
    akari



  • Hi,

    sicher geht es auch noch viel eleganter als in meinem hier gezeigten Code-Beispiel, aber so geht es auch.
    Natürlich kann man auch hier noch viel optimieren, aber das soll ja auch nur ein Beispiel sein.

    Benötigt wird nur ein Timer mit Interval 10 ms, ein StringGrid und eine CheckBox.

    Im OnTimer-Event dann folgenden Code platzieren:

    void __fastcall TfrmMain::Timer1Timer(TObject *Sender)
    {
    int Col = 2; //<= gewünschte Spalte in der die CheckBox gezeigt werden soll
    int Row = 2; //<= gewünschte Zeile in der die CheckBox gezeigt werden soll
    TRect Rect;
    TPoint Point;
    
    	//Standard-Größe der Zellen festlegen
    	frmMain->StringGrid1->DefaultColWidth = 100;
    	frmMain->StringGrid1->DefaultRowHeight = 25;
    
    	//Aktuelle Position (Top, Left) des StringGrids ermitteln
    	Point.x = frmMain->StringGrid1->Left;
    	Point.y = frmMain->StringGrid1->Top;
    
    	//Die Position (in Pixel) im StringGrid der 
    	//gewünschten Zelle ermitteln
    	Rect = frmMain->StringGrid1->CellRect(Col, Row);
    
    	//StringGrid-Position und Zellen-Position addieren
    	Point.x += Rect.Left + 5;  // plus 5 damit CheckBox mittig gezeigt wird
    	Point.y += Rect.Top + 5;   // plus 5 damit CheckBox mittig gezeigt wird
    
    	//Wenn sich die Zelle, in der die CheckBox angezeigt
    	//werden soll, im sichtbaren Bereich befindet, dann
    	//wird die CheckBox in ( bzw. über ) der jeweiligen Zelle
    	//angezeigt
    	if(Row >= frmMain->StringGrid1->TopRow  &&
    		Col >= frmMain->StringGrid1->LeftCol)
    	  {
    			//CheckBox sichtbar
    			frmMain->CheckBox1->Visible = true;
    
    			//CheckBox an gewünschter Position platzieren
    			frmMain->CheckBox1->Top = Point.y;
    			frmMain->CheckBox1->Left = Point.x;
    	  }
    	  else
    		 {
    			//CheckBox ausblenden, wenn Zelle nicht sichtbar
                frmMain->CheckBox1->Visible = false;
             }
    }
    

    Gruß
    Andreas



  • Gismo2007 schrieb:

    Benötigt wird nur ein Timer mit Interval 10 ms, ein StringGrid und eine CheckBox.

    Uah. Sowas tut man nicht.

    Ich verstehe nicht, warum Leute sich darum drücken, eine 3rd-party-Komponente zu installieren, die das Problem nicht nur ohne irgendwelche dirty hacks wie deinen Vorschlag, sondern praktisch ohne zusätzlichen Programmcode erledigen kann. Muß so eine Art Resonanzüberhöhung der Faulheit sein.





  • Man kann die CheckBoxen auch selbst zeichnen
    wie Blazek Jaroslav das hier mit einer DBGrid macht

    http://www.c-plusplus.net/forum/topic,12215.html



  • audacia schrieb:

    Gismo2007 schrieb:

    Benötigt wird nur ein Timer mit Interval 10 ms, ein StringGrid und eine CheckBox.

    Uah. Sowas tut man nicht.

    Ich verstehe nicht, warum Leute sich darum drücken, eine 3rd-party-Komponente zu installieren, die das Problem nicht nur ohne irgendwelche dirty hacks wie deinen Vorschlag, sondern praktisch ohne zusätzlichen Programmcode erledigen kann. Muß so eine Art Resonanzüberhöhung der Faulheit sein.

    a) Wenn man kostenlose Borland Versionen verwendet geht das nicht.
    b) Wenn man im Team arbeitet muss jeder jedesmal alle Komponenten des jeweils anderen installieren.
    c) Stabilität von 3rd-party Komponenten ist generell unbekannt.

    Wobei ich auch sagen muss, dass ich bevor ich das gezeigte Beispiel mit dem Timer verwenden würde es lieber auf ne Checkbox verzichten würde.



  • Morle schrieb:

    audacia schrieb:

    Gismo2007 schrieb:

    Benötigt wird nur ein Timer mit Interval 10 ms, ein StringGrid und eine CheckBox.

    Uah. Sowas tut man nicht.

    Ich verstehe nicht, warum Leute sich darum drücken, eine 3rd-party-Komponente zu installieren, die das Problem nicht nur ohne irgendwelche dirty hacks wie deinen Vorschlag, sondern praktisch ohne zusätzlichen Programmcode erledigen kann. Muß so eine Art Resonanzüberhöhung der Faulheit sein.

    a) Wenn man kostenlose Borland Versionen verwendet geht das nicht.
    b) Wenn man im Team arbeitet muss jeder jedesmal alle Komponenten des jeweils anderen installieren.
    c) Stabilität von 3rd-party Komponenten ist generell unbekannt.

    Danke.....

    Morle schrieb:

    Wobei ich auch sagen muss, dass ich bevor ich das gezeigte Beispiel mit dem Timer verwenden würde es lieber auf ne Checkbox verzichten würde.

    Dieser "dirty hack" funktioniert auch ohne Timer 😃

    void __fastcall TfrmMain::FormCreate(TObject *Sender)
    {
    	//Standard-Größe der Zellen festlegen
    	frmMain->StringGrid1->DefaultColWidth = 110;
    	frmMain->StringGrid1->DefaultRowHeight = 25;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmMain::CheckBox1MouseDown(TObject *Sender,
    	  TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    	if(Button == mbLeft)
    	  {
    		  if(frmMain->CheckBox1->Checked == false)
    			 frmMain->CheckBox1->Checked = true;
    		  else
    			 frmMain->CheckBox1->Checked = false;
    	  }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmMain::StringGrid1DrawCell(TObject *Sender, int ACol,
    	  int ARow, TRect &Rect, TGridDrawState State)
    {
    int Col = 2; //<= gewünschte Spalte in der die CheckBox gezeigt werden soll
    int Row = 2; //<= gewünschte Zeile in der die CheckBox gezeigt werden soll
    
    	frmMain->CheckBox1->Parent = frmMain->StringGrid1;
    
    	//Die Position im StringGrid (in Pixel) der
    	//gewünschten Zelle ermitteln
    	Rect = frmMain->StringGrid1->CellRect(Col, Row);
    
    	if(Row >= frmMain->StringGrid1->TopRow  &&
    		Col >= frmMain->StringGrid1->LeftCol)
    	  {
    			//CheckBox an gewünschter Position platzieren
    			frmMain->CheckBox1->Top = Rect.Top + 5;
    			frmMain->CheckBox1->Left = Rect.Left + 5;
    
    			//CheckBox sichtbar
    			frmMain->CheckBox1->Visible = true;
    			frmMain->CheckBox1->Repaint();
    	  }
    	  else
    		 {
    			//CheckBox ausblenden, wenn Zelle nicht sichtbar
    			frmMain->CheckBox1->Visible = false;
    		 }
    }
    //---------------------------------------------------------------------------
    

    Gruß
    Andreas



  • Morle schrieb:

    a) Wenn man kostenlose Borland Versionen verwendet geht das nicht.

    Okay, bei Software, die nicht für den kommerziellen Einsatz gedacht ist, ist es auch unerheblich, wie viel Flickschusterei jetzt dahintersteckt.

    Morle schrieb:

    b) Wenn man im Team arbeitet muss jeder jedesmal alle Komponenten des jeweils anderen installieren.

    Wenn man im Team arbeitet, ist das kein Einzelfall, und man kann sich schnell auf eine Komponenten-Suite einigen, die wenigstens die Grundlagen abdeckt. Und ich meine, ein gutes Grid gehört dazu.

    Morle schrieb:

    c) Stabilität von 3rd-party Komponenten ist generell unbekannt.

    Nö.

    Aber bitte, jeder wie er will. Solange ich nicht eure Software warten muß, ist mir das egal 😉



  • audacia schrieb:

    Morle schrieb:

    b) Wenn man im Team arbeitet muss jeder jedesmal alle Komponenten des jeweils anderen installieren.

    Wenn man im Team arbeitet, ist das kein Einzelfall, und man kann sich schnell auf eine Komponenten-Suite einigen, die wenigstens die Grundlagen abdeckt. Und ich meine, ein gutes Grid gehört dazu.

    Da liegt doch der Knackpunkt. Ein gutes Grid mag dazu gehören, aber man nimmt doch nicht eine komplette Komponentensuite nur weil man eine Funktion davon gebrauchen kann. Sonst hat man ganz schnell ganz viele Komponenten, die man nur 1x braucht.

    audacia schrieb:

    Morle schrieb:

    c) Stabilität von 3rd-party Komponenten ist generell unbekannt.

    Nö.

    Also Borland ist noch nicht mal 100% stabil (zumindest gilt das für die älteren Versionen; ich komme nicht in den Genuss neuere einsetzen zu können), wie können es dann die Komponenten per se sein? Die Komponenten, die man so findet, sind oftmals Freeware und unterliegen keinerlei Qualitätskontrolle (ob das für das hier im Thread genannte Grid auch gilt, weiss ich nicht). Viele Libraries kompilieren nicht mal mit dem Borland C++ Compiler (hier: auch wieder meine Version) und die Autoren testen in den seltensten Fällen mit dem Borland Compiler - wenn Du den Betatester spielen willst, bitte gern.

    Und nein, es ist kein Argument, dass es in $aktuelleVersion funktioniert. Ich kann nicht mal eben irgendwelche Dinge mit $aktuelleVersion kompilieren. Die Seiteneffekte sind ohne gründliche Tests gar nicht abzusehen.
    Übrigens verstärkt dein Hang dazu direkt irgendwelche Komponenten einzusetzen die Abhängigkeit von bestimmten Versionen noch. Es ist doch gar nicht garantiert, dass irgendeine Komponente mit irgendeiner anderen (neueren) Borland-Version dann auch funktioniert.

    audacia schrieb:

    Aber bitte, jeder wie er will. Solange ich nicht eure Software warten muß, ist mir das egal 😉

    Ich glaube wenn Du das was Du hier immer so schreibst wirklich durchziehen kannst, dann hast Du wirklich Glück so nahe am Idealzustand entwicklen zu können oder du entwickelst alleine.



  • Morle schrieb:

    Da liegt doch der Knackpunkt. Ein gutes Grid mag dazu gehören, aber man nimmt doch nicht eine komplette Komponentensuite nur weil man eine Funktion davon gebrauchen kann. Sonst hat man ganz schnell ganz viele Komponenten, die man nur 1x braucht.

    Klar. Mein Punkt ist: ein gutes Grid kann eben auch Controls in Zellen plazieren.

    Morle schrieb:

    audacia schrieb:

    Morle schrieb:

    c) Stabilität von 3rd-party Komponenten ist generell unbekannt.

    Nö.

    Also Borland ist noch nicht mal 100% stabil (zumindest gilt das für die älteren Versionen; ich komme nicht in den Genuss neuere einsetzen zu können), wie können es dann die Komponenten per se sein?

    Das habe ich nicht gesagt. Ich widersprach deiner Behauptung, daß "die Stabilität unbekannt" sei. Die meisten 3rd-party-Komponenten sind schon eine Weile auf dem Markt, und man kann sich durch ein paar Minuten Recherche z.B. Embarcadero-Newsgroups gut informieren, was ihre Stärken und Schwächen sind.

    Morle schrieb:

    Viele Libraries kompilieren nicht mal mit dem Borland C++ Compiler (hier: auch wieder meine Version) und die Autoren testen in den seltensten Fällen mit dem Borland Compiler

    Bei visuellen Komponenten geht es auch um Delphi-Quelltext. Und der funktioniert meistens im C++Builder.

    Morle schrieb:

    Übrigens verstärkt dein Hang dazu direkt irgendwelche Komponenten einzusetzen die Abhängigkeit von bestimmten Versionen noch.

    Natürlich, wenn du Stabilität und Zukunftssicherheit brauchst und möglichst keine Zeit dafür verschwenden willst, dann nimmst du eben ein kommerzielles Komponenten-Package, bei dem die Zukunft einigermaßen gesichert ist, etwa von DevExpress oder TMS. Da bekommst du unglaubliche Mengen an Funktionalität, und das beste ist: du mußt es nicht selbst zum Laufen bringen. Schon hast du wertvolle Zeit gespart.

    Morle schrieb:

    Ich glaube wenn Du das was Du hier immer so schreibst

    Was schreibe ich denn hier immer so? Im Moment ist mein Anliegen nur, daß man das Rad nicht neuerfinden sollte. Besonders dann nicht, wenn das Ersatzrad nur holpert.



  • audacia schrieb:

    Morle schrieb:

    Ich glaube wenn Du das was Du hier immer so schreibst

    Was schreibe ich denn hier immer so?

    Bitte jetzt nicht falsch verstehen, ich schätze deine Beiträge sehr und sie helfen in viele Fällen auch wirklich weiter, aber: Wenn Du schreibst "bei mir in meiner aktuellen Version funktioniert XY" oder "es gibt dort die Funktion XY" so ist meistens für mich nicht mehr als rein informativ, weil ich nicht upgraden kann.

    Das selbe gilt dann auch für empfohlene Komponenten: Die wenigsten Leute dürften hier Anwendungen komplett neu entwickeln. Da sucht jemand eben eine Möglichkeit eine Checkbox in ein Stringgrid zu platzieren und will vielleicht nicht die Anwendung deswegen direkt mit einem neuen Komponentenpackage aufblähen.
    Wenns nur um eine einzige Funktion geht fallen damit auch alle kostenpflichtigen Komponenten raus (Kosten/Nutzen).

    audacia schrieb:

    Im Moment ist mein Anliegen nur, daß man das Rad nicht neuerfinden sollte. Besonders dann nicht, wenn das Ersatzrad nur holpert.

    Da stimme ich dir absolut zu.



  • Morle schrieb:

    Bitte jetzt nicht falsch verstehen

    Keine Sorge, ich freue mich, wenn sich jemand die Zeit nimmt, mich konstruktiv zu kritisieren 🙂

    Morle schrieb:

    aber: Wenn Du schreibst "bei mir in meiner aktuellen Version funktioniert XY" oder "es gibt dort die Funktion XY" so ist meistens für mich nicht mehr als rein informativ, weil ich nicht upgraden kann.

    Ja, die Problematik ist mir bekannt. Natürlich kann man nicht immer upgraden, schon aus finanziellen Gründen. Allerdings sollte man festhalten, daß der beste Weg zur Flexibilitätserhaltung tatsächlich stetige Upgrades sind. Lieber häufig an kleine Änderungen anpassen als plötzlich mit der Summe aller Probleme auf einmal konfrontiert zu werden. Außerdem treten dann Prozesse wie die Projektkonvertierung, das "Nachziehen" von Drittkomponenten oder das Installieren der gemeinsamen Komponenten-Suite so häufig auf, daß man sie notgedrungen automatisiert (z.B. mit dem JVCL Packages Generator und einem Package-Installationsskript) oder vermeidet (d.h. nur gut gepflegte 3rd-party-Komponenten wie JCL/JVCL, DevExpress, TMS etc. verwendet). Daß das für viele einfach realitätsfremd ist, weiß ich auch - Altlasten hindern einen immer an sowas -, aber man kann es ja trotzdem mal als Ideal in den Raum stellen 😉

    Morle schrieb:

    Das selbe gilt dann auch für empfohlene Komponenten: Die wenigsten Leute dürften hier Anwendungen komplett neu entwickeln.

    Klar.

    Morle schrieb:

    Da sucht jemand eben eine Möglichkeit eine Checkbox in ein Stringgrid zu platzieren und will vielleicht nicht die Anwendung deswegen direkt mit einem neuen Komponentenpackage aufblähen.

    Das verstehe ich schon. Es muß ja nicht eine 3rd-party-Komponente sein (die ist nur die komfortabelste Lösung); man erstelle sonst eben eine von TStringGrid abgeleitete Komponente, die die Aufgabe übernimmt und sich um Dinge wie die Plazierung kümmert (z.B. beim Scrollen). Alles besser als dieses Plazieren von Hand.


Anmelden zum Antworten