StringGrid 2 bestimmte Zellen farbig



  • Hallo,

    eins vorweg : ich hab das faq bzgl. stringgrid farben ändern gelesen. das hat mir auch shcon sehr viel weiter geholfen.

    folgende ausgangssituation: beim start des programmes wird ein stringgrid erstellt mit XX x YY felder. es wird mit nullen gefüllt und zufällige felder werden mit -1 gefüllt. nun soll durch den benutzer 2 kästchen farbig gefüllt werden. dies geschieht durch 4 edit felder und einem button. in den edit felder trägt er die koordinaten ein.

    mein problem ist nun aber das wenn ich den das OnDrawCell-Event benutze gleich zum Anfang die kästchen gefüllt werden. ich will aber das der benutzer das selber entscheiden kann.

    jemand ideen wie ich das bewerkstelligen kann? 🙂



  • Dann mußt du im OnDrawCell-Event überprüfen, ob der Nutzer bereits etwas eingegeben hat.



  • hmm ich merk gerade das ich murks geschrieben hab... das war gar nicht was ich fragen wollte... ehm was ich eher wissen möchte ist: wie mache ich 2 kästchen farbig?
    also ich stelle mir das programm so vor: programm wird gestartet. das stringgrid wird automatich mit nullen und -1 gefüllt. nun soll der anwender 2 koordinaten eingeben und mit einem button sollen die koordinaten übergeben werden. diese werden dann farbig gemacht.

    das füllen geschieht mittels einer for schleife die das array mit nullen und -1 füllt. eine show() funktion zeigt dann das array in den Cells ans.



  • Und wo ist nun das Problem?
    Du kennst OnDrawCell mit dem man die Zellen farbig zeichnen lassen kann.
    Na dann lass sie halt farbig zeichnen....



  • ja aber wie stell ich das genau an? nach dem das stringgrid gezeichnet ist soll der anwender die koordinaten eingeben und dann auf einen button drücken woraufhin sich die eingebenen zellen verfärben. wie rufe ich aber OnDrawCell auf, wenn man auf den button drückt?

    void __fastcall TfrmStringGrid::btnStartClick(TObject *Sender)
    {
     hier müsste OnDrawCell aufgerufen werden ... glaub ich zumindest...
    }
    


  • OnDrawCell rufst man nicht auf es wird automatisch aufgerufen wenn das Stringgrid gezeichnet wird.
    Siehe: http://docwiki.embarcadero.com/VCL/de/Grids.TCustomDrawGrid.OnDrawCell

    Um ein Neuzeichnen zu erzwingen kann man z.B. Invalidate() verwenden:
    Siehe: http://docwiki.embarcadero.com/VCL/en/Controls.TControl.Invalidate



  • Das OnDrawCell automatisch beim zeichnen aufgerufen wird weiß ich. Stand im FAQ. Ich habe im OnDrawCell Ereignis folgendes stehen:

    void __fastcall TfrmStringGrid::FDrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
     sx = edtSX->Text.ToInt();
     sy = edtSY->Text.ToInt();
     zx = edtZX->Text.ToInt();
     zy = edtZY->Text.ToInt();
    
    if ( sx != 0 && sy != 0 && zx != 0 && zy != 0)
       {
        if (ACol == sx && ARow == sy)
          {
            F->Canvas->Brush->Color = clGreen;
            F->Canvas->Font->Color = clBlack;
          }
    
        if (ACol == zx && ARow == zy)
          {
            F->Canvas->Brush->Color = clRed;
            F->Canvas->Font->Color = clBlack;
          }
    
          DrawText(F->Canvas->Handle, F->Cells[ACol][ARow].c_str(),
            -1, &Rect, DT_SINGLELINE | DT_VCENTER );
          show();
       }
    

    Die 1. if-Abfrage verhindert ja das irgendetwas farbig gezeichnet wird, da die 4 Edit Felder von Anfang an 0 sind.
    Ich möchte nun aber das genau dieses Ereignis aufgerufen wird wenn man auf den Button klickt, da dann die Koordinaten ungleich 0 sind und er die Zellen dann farbig zeichnet. So meine Theorie. 🙂



  • VergissEs schrieb:

    Um ein Neuzeichnen zu erzwingen kann man z.B. Invalidate() verwenden:
    Siehe: http://docwiki.embarcadero.com/VCL/en/Controls.TControl.Invalidate

    -> genau das solltest du aus dem Button-Handler aufrufen, den rest erledigt das System für dich.



  • Ahh ich idiot... Hab vergessen die show() Funktion mit aufzurufen. Jetzt werden die Zellen farbig gemacht. Aber das StringGrid sieht jetzt komisch aus. Alle Zellen außer den Zellen wo -1 drinsteht sehen komisch aus und sie flackern.
    http://imageshack.us/photo/my-images/20/stringgrid.png/



  • Tya kein Wunder das es flackert wenn man in der OnDrawCell
    die eigene show() aufruft die nach deinen schreiben für das füllen
    des StringGrids zuständig ist, somit wird gleich nach jeden OnDrawCell Aufruf wieder die StringGrid mit Daten gefüllt und natürlich wieder OnDrawCell aufgerufen, dann ist ja ein Endlosflackern logisch.

    Ich Tippe mal drauf das du für dein Sudoko die zanze Zelle farbig machen möchtest und nicht nur den Text das geht zB mit FillRect



  • ok es flackert nun nicht mehr nach dem ich das show() entfernt habe, danke dir.
    was mache ich nun aber mit den einzelnen zellen? die sehen immeernoch so aus als hätte das drawtext sie einfach drüber gemalt statt die sie vorher zu löschen.

    und ja es war eigentlich angedacht die komplette zelle zu füllen aber dann wäre jetzt die ganze arbeit futsch wenn ich nun das versuchen würde.

    EDIT: HAHAAH welch ironie... hab nebenbei gegoogled und bin dann auf ein thread hier im forum gekommen. und mit deinem code vergisses aus dem thread http://www.c-plusplus.net/forum/154184 hab funktioniert das jetzt mit der farbe und dem zentriert. ^^


Anmelden zum Antworten