wieder StringGrid Problem
-
Vielleicht ärgert ihr euch schon über mich, aber ich bekomm das nicht hin:
Möchte das im Stringgrid, wenn ein neuer Eintrag kommt, alles eine Zeile nach unten rutsch, sodass das neue immer ganz oben im Stinggrid steht:
hier mal mein Versusch:
AnsiString puffer; i++; if (StringGrid1->Cells[1][1] != "") { AnsiString Text=Edit1->Text; puffer=StringGrid1->Cells[1][1]; StringGrid1->Cells[1][i]=puffer; StringGrid1->Cells[1][1]=Edit1->Text; StringGrid1->RowCount++; } else { StringGrid1->Cells[1][i+1]=StringGrid1->Cells[1][i]; StringGrid1->Cells[1][1]=Edit1->Text; StringGrid1->RowCount++; }
Und hier ein Screenshot von dem Resulat:
http://www.abload.de/img/unbenanntxmvc.png
--------------------------------------------------------------
Ich würde gerne dass es so läuft:
[b]etc Eintrag5 Eintrag4 Eintrag3 Eintrag2 Eintrag1[/b]
Was muss ich hier ändern? Oder geht das garnicht so?
Vielen Dank für euer Verständnis!
-
Hallo Inek64,
das Einfügen geht nicht (so wie z.B. bei einer Listbox mit Insert)
Du musst also entweder die Zeilen alle neu befüllen
oder (so mache ich es) sie schlicht leer lassen und mit
OwnerDraw beim Zeichnen erst "befüllen". Du erzeugst also
eine StringList (die kannst Du nämlich sortieren, einfügen usw.)
und beim Abfragen im OwnerDraw übergibst Du einfach den Inhalt
mittels DrawText-Funktion:void __fastcall TForm1::frm1_grdGeraetDrawCell(TObject *Sender, int ACol,int ARow, TRect &ARect, TGridDrawState State) AnsiString zInh; zInh=StringList->Strings[ARow]; TStringGrid *Grid = dynamic_cast<TStringGrid *> (Sender); // Sender als StringGrid anzusprechen Grid->Canvas->Brush->Color =clWhite; // Farbe HG festlegen Grid->Canvas->Font->Color =clRed; // Farbe VG festlegen Grid->Canvas->TextRect(ARect,ARect.Left+2,(ARect.Top+ARect.Bottom-Grid->Canvas->TextHeight(zInh))/2,zInh); ... // hier noch Rahmen zeichnen usw. }
Das ist natürlich nur eine sehr vereinfachte Darstellung;
man sollte auf jeden Fall die Anzahl der Strings in der Liste
vergleichen mit der Anzahl der ARow usw. Ein ganz erheblicher
Vorteil ist ein enormer Geschwindigkeitsvorteil bei sehr großen
StringGrids, da mit dieser Methode keinerlei Befüllung stattfindet.Gruss Stefan
-
Pseudocode:
1. Rowcount++
2. for i = Rowocount - 1 to 2 do Kopiere Zeile [i-1] nach Zeile [i]
3. Überschreibe Zeile [1] mit den gewünschten Text
-
Sorry Doppelpost
-
Das Problem sollte doch schon in deinem letzten Beitrag mit dem Verweis auf den FAQ-Eintrag gelöst sein.
Oder liest du die Antworten gar nicht!?
-
Jansen schrieb:
Das Problem sollte doch schon in deinem letzten Beitrag mit dem Verweis auf den FAQ-Eintrag gelöst sein.
Oder liest du die Antworten gar nicht!?Doch doch lese schon die Beiträge, aber habe keine anhaltspunkte zu mienem Problem gesehn:
http://www.c-plusplus.net/forum/viewforum-var-f-is-19-and-topicdays-is-0-and-start-is-150.htmlStefan7124 schrieb:
Hallo Inek64,
das Einfügen geht nicht (so wie z.B. bei einer Listbox mit Insert)
Du musst also entweder die Zeilen alle neu befüllen
oder (so mache ich es) sie schlicht leer lassen und mit
OwnerDraw beim Zeichnen erst "befüllen". Du erzeugst also
eine StringList (die kannst Du nämlich sortieren, einfügen usw.)
und beim Abfragen im OwnerDraw übergibst Du einfach den Inhalt
mittels DrawText-Funktion:void __fastcall TForm1::frm1_grdGeraetDrawCell(TObject *Sender, int ACol,int ARow, TRect &ARect, TGridDrawState State) AnsiString zInh; zInh=StringList->Strings[ARow]; TStringGrid *Grid = dynamic_cast<TStringGrid *> (Sender); // Sender als StringGrid anzusprechen Grid->Canvas->Brush->Color =clWhite; // Farbe HG festlegen Grid->Canvas->Font->Color =clRed; // Farbe VG festlegen Grid->Canvas->TextRect(ARect,ARect.Left+2,(ARect.Top+ARect.Bottom-Grid->Canvas->TextHeight(zInh))/2,zInh); ... // hier noch Rahmen zeichnen usw. }
Das ist natürlich nur eine sehr vereinfachte Darstellung;
man sollte auf jeden Fall die Anzahl der Strings in der Liste
vergleichen mit der Anzahl der ARow usw. Ein ganz erheblicher
Vorteil ist ein enormer Geschwindigkeitsvorteil bei sehr großen
StringGrids, da mit dieser Methode keinerlei Befüllung stattfindet.Gruss Stefan
Danke für diesen wertvolle Beitrag, gibts dazu vielleicht ein komplettes Demo oder so ? eventuell in der Hilfe von Bcb?
Arbeite das erste mal mit Stringgrid dementsprechend bin ich noch nicht so vertraut mit dem ganzen
-
Hallo
Wenn du diese FAQ-Übersicht benutzt, dann fällt dir ganz schnell der Abschnitt StringGrid auf, und dort den Thread "Zellen und Spalten löschen/einfügen". Dort drin steht alles was du wissen must.
Dein Zitat ist nicht das was wir meinten.bis bald
akari
-
Hi,
leite Dir eine Klasse von TStringGrid ab und veröffentliche da die Methoden
MoveColumn
MoveRow.
Dann kanst Du eine Spalte oder Zeile am ende durch erhöhen der Spalten-/Zeilenzahl anfügen und an die gewünschte Stelle schieben.
Fürs rauslöschen die zu löschende Spalte oder Zeile ans Ende schieben und dort durch verringern der Spalten- oder zeilenzahl etfernen.Gruß Mümmel