TStringGrid: Bei SetCells Ausrichtung des Strings bestimmen, aber wie?



  • Grüß Euch!

    Ich möchte beim Befüllen meines StringGrids die Ausrichtung der Strings bestimmen.
    Da ich bis jetzt aber weder in der Hilfe, noch in diesem Board dazu fündig geworden bin hab ich mich bis zu diesem Lösungsansatz durchgekämpft:

    StringGrid1->Cells [1] [Zeile] = beg->getJobName().c_str();
    StringGrid1->Cells [2] [Zeile] = beg->getPlotterName().c_str();
    StringGrid1->Cells [3] [Zeile] = beg->getPortName().c_str();
    
        for (int i = 1; i < 3; i++)
        {
            TRect rect = StringGrid1->CellRect(i, Zeile);
            DrawText(StringGrid1->Canvas->Handle,
                     StringGrid1->Cells[i][Zeile].c_str(),
                     -1,
                     &rect,
                     DT_SINGLELINE | DT_LEFT | DT_VCENTER);
        }
    

    Ich dachte, wenn ich das Grid erst fülle und danach den Inhalt der Zellen nochmal zeichne, hätte ich Erfolg.
    Den hatte ich auch in soweit, als das das Grid erst meinem Wusch entspricht und gleich danach wieder seine Standardausrichtung, auf die ich irgendwie keinen Zugriff bekomme, einrichtet.

    Danke für jede Hilfe!

    [ Dieser Beitrag wurde am 01.04.2003 um 13:51 Uhr von Fiesek editiert. ]



  • Hast du dir wirklich die FAQ zum Thema StringGrid angeschaut ?
    Da steht eigentlich alles drin. Ansonsten informiere dich mal über das Ereignis OnDrawCell

    Ciao



  • Ich könnte mich irren, aber kann es sein, dass bei OnDrawCell keine Textausrichtung möglich ist?

    Die FAQ's hab ich besucht, hab ich da einen Eintrag zum Thema Textausrichtung beim Befüllen des Gitters mit Strings übersehen?

    In meinem Code unternehme ich den Versuch der Textausrichtung, aber Das StringGrid ändert es nachträglich wieder ab und ich würde gerne wissen, wie ich das ändern oder abschalten kann.



  • Hallo,

    OnDrawCell wird beim Zeichnen jeder einzelnenZelle aufgerufen. Hast du auch die Eigenschaft DefaultDrawing auf false gesetzt ?



  • Original erstellt von Fiesek:
    for (int i = 1; i < 3; i++)
    {
    TRect rect = StringGrid1->CellRect(i, Zeile);
    DrawText(StringGrid1->Canvas->Handle,
    StringGrid1->Cells[i][Zeile].c_str(),
    -1,
    &rect,
    DT_SINGLELINE | DT_LEFT | DT_VCENTER);
    }[/code]

    Beachte folgendes etwas Besser: OnDrawCell übergibt dir das Rect, die Zeile und die Spalte der Zelle die gezeichnet werden soll. Ausserdem würde ich persönlich statt StringGrid1-> zu schreiben eher den Sender mit dynamic_cast nach TStringGrid casten und - sofern nicht null - dann den Code mit dem so gewonnenen Zeiger ausführen.

    -junix



  • Ja, ich hab mir durchgelesen, was OnDrawCell verlangt, aber es übergibt mir doch nischt.
    OnDrawCell iss doch void, ich gebe ihm nur mit, wo ich zeichnen möchte und on ein Fokus drauf ist und DefaultDrawing aktiv ist.

    Ausserdem ist SringGrid1 ein Zeiger: TStringGrid *StringGrid1;
    Oder hab ich Dich da missverstanden?

    Sorry, aber ich bezeichne mit trotz fertigem Berufsabschluss noch als relativer Anfänger im Umgang mit C++.

    Daher ist mir nicht gleich jede Lösung so einleuchtend.
    Warum ändert das Grid die Ausrichtung nach meinen Abläufen selbstständig?????



  • Schau dir mal (in der Hilfe oder im Code) die Deklaration von OnDrawCell an und sag mir nochmal ob das Teil void ist oder nicht. Klar der Rückgabewert ist void aber die Parameterübergabe ist das was interessiert.

    -junix

    [ Dieser Beitrag wurde am 01.04.2003 um 16:28 Uhr von junix editiert. ]



  • Aber ich versteh jetzte nicht, wie mir diese Ereignisbehandlungsroutine bei meinem Problem weiterhelfen kann?

    [ Dieser Beitrag wurde am 02.04.2003 um 09:32 Uhr von Fiesek editiert. ]



  • 1. Solltest du mal die beschreibung genau lesen. Du brauchst in OnDrawCell keine Schleife zu implementieren, denn die FUnktion wird bei jeder Zelle aufgerufen, wenn sie gezeichnet werden soll.
    2. Wenn du die Parameter genau anschaust, siehst du dass da nix von void ist.
    3. Schau nochmal das Thema in der FAQ an mit den farbigen Zellen

    -junix



  • Ich hab keine Schleife in OnDrawCell zu laufen.

    void __fastcall TSpoolerForm::UpdateGrid()
    {
       RowRenamer();
    
      Zeile = 0;
      CSpooler::TJLCIter beg = __spooler->getJobList()->begin();
      StringGrid1->RowCount= __spooler->getJobList()->size()+1;
      StringGrid1->Canvas->Font->Color = clWindowText;
      for(; beg != __spooler->getJobList()->end(); beg++)
      {
         Zeile++;
    
          StringGrid1->Cells [1] [Zeile] = beg->getJobName().c_str();
        StringGrid1->Cells [2] [Zeile] = beg->getPlotterName().c_str();
          StringGrid1->Cells [3] [Zeile] = beg->getPortName().c_str();
      }
    
      Zeile=0;
      beg = __spooler->getJobList()->begin();
      for(; beg != __spooler->getJobList()->end(); beg++)
      {
         Zeile++;
         for(int i = 1; i < 4; i++)
        {
            TRect rect = StringGrid1->CellRect(i, Zeile);
           DrawText(StringGrid1->Canvas->Handle,
                   StringGrid1->Cells[i][Zeile].c_str(),
                     -1,
                     &rect,
                     DT_SINGLELINE | DT_LEFT | DT_VCENTER);
        }
      }
    }
    

    So sieht das bei mir aus.
    Wenn sich in einer Liste aus STL etwas ändert, rufe ich UpdateGrid() auf und arbeite den Listeninhalt in das Grid ein.

    Die Schleife mit der Funktion DrawText() hab ich nur eingearbeitet, weil ich versuchen wollte, nachträglich Einfluss auf die Ausrichtung nehmen zu können.

    <edit>Code Tags repariert</edit>

    [ Dieser Beitrag wurde am 02.04.2003 um 09:45 Uhr von junix editiert. ]



  • Eben... du verfolgst den falschen Ansatz. Du sollst OnDrawCell verwenden denn du willst ja benutzerdefiniertes Zeichnen implementieren Ich wiederhole mich ungern aber schau dir nochmal das Beispiel mit den farbigen Zellen in der FAQ an und versuch es zu verstehen. Du musst einen ähnlichen Ansatz verfolgen. Sonst klappt das ned.

    -junix



  • Danke bis hierher!

    Ich glaube zu verstehen, auf welchen Weg Du mich verweisen willst!
    Nun werde ich versuchen die Lösung für mich zu finden und ein etwaiges Ergebnis hier posten!

    THX!

    Sorry, wegen dem Code-Wirrwarr, ich bin mit den Boardeigenschaften noch net so vertraut, werde aber nächstes Mal drauf achten!



  • Ahhhh, nu hab ich das verstanden!

    Ich war nun in der Lage, mein Problem zu lösen.
    Was ich gut fand, war, das Du mir die Lösung nicht gleich fertig präsentiert hast, sondern mir nur ein paar Wegweiser aufgestellt und Fragen gestellt hast.
    Dadurch hab ich es verstanden und sollte in Zukunft wenig Probs damit haben!

    THX!!!



  • hey, der erste der sich freut, keinen fertigen code serviert zu bekommen! gute arbeit junix. irgendwann zahlt es sich doch mal aus. 😉



  • Original erstellt von Sunday:
    [...]irgendwann zahlt es sich doch mal aus. 😉

    Tja, damit ist meine Hoffnung, dass Jansens und meine Bestrebungen doch nicht nur misverstanden werden doch nicht ganz gestorben *smile*

    Fiesek: Das Lob ist ganz auf deiner Seite denn im Gegensatz zu vielen anderen hast du nicht einfach darauf gewartet den Code präsentiert zu bekommen sondern hast die Hinweise auch ernsthaft verfolgt...

    Original erstellt von Fiesek:
    Dadurch hab ich es verstanden und sollte in Zukunft wenig Probs damit haben!

    Freut mich, dass du mein fernziel auch gleich durchschaut hast. (: Genau so stelle ich mir das hier auch vor. Hilfe zur Selbsthilfe. Leider wird das oft als "Quälerei" misverstanden /o:

    Gratuliere zur Lösung! Denn nüchtern betrachtet hast du sie (nach einem passenden Schubser) von allein gefunden (:

    -junix

    [ Dieser Beitrag wurde am 02.04.2003 um 23:04 Uhr von junix editiert. ]


Anmelden zum Antworten