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.
-
Hallo,
Da gibt es noch das hier.
http://www.bytesandmore.de/rad/index.htm?http://www.bytesandmore.de/rad/cpp/snipp/sc02038.php
-
Man kann die CheckBoxen auch selbst zeichnen
wie Blazek Jaroslav das hier mit einer DBGrid macht
-
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.