StringGrid - Breite von Spalten speichern und wieder auslesen
-
Hallo,
ich möchte gerne die Breite von den Spalten in einem StringGrid speichern, und beim Programmstart wieder auslesen.Mein Code:
void __fastcall TForm1::single_stringgridDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { TIniFile *Inifile = new TIniFile(ExtractFilePath(Application->ExeName)+"singles.ini"); int Gesammt = (Rect.Left + Rect.Width()) + Rect.Right; int Breite = Rect.Right; if(ACol != 0) { Breite = Rect.right + Rect.Width() - Inifile->ReadInteger("GridSize", AnsiString(ACol), Rect.Width()); } Rect.Right = Gesammt - Breite; if(ARow != 0 && (ARow % 2) == 0 && ACol != 0) { single_stringgrid->Canvas->Brush->Color = clLime; } else if(ARow != 0 && (ARow % 2) != 0 && ACol != 0) { single_stringgrid->Canvas->Brush->Color = clYellow; } single_stringgrid->Canvas->FillRect(Rect); if(ACol != 0 && ARow == 0) { Inifile->WriteInteger("GridSize", AnsiString(ACol), Rect.Right); } Inifile->UpdateFile(); delete Inifile; }Die Felder werden zwar noch eingefärbt, aber
die Senkrechten Feldbegrenzungslinien fehlen plötzlich.Leider funktioniert dieser Code nicht.....
Die Felder haben nun keine Begrenzung
-
Ok, ich bin nun ein wenig weiter:
Die richtige Größe wird nun übernommen,
aber die Größe wird nur in den "normalen" Feldern übernommen, nicht aber
in den grau Hinterlegten (FixedCols und FixedRows)
Die behalten weiterhin diese Größe.Mein Code:
void __fastcall TForm1::single_stringgridDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { TIniFile *Inifile = new TIniFile(ExtractFilePath(Application->ExeName)+"singles.ini"); int Gesammt = (Rect.Left + Rect.Width()) + Rect.Right; int Breite = Rect.Right; if(ACol != 0) { Breite = Rect.right + Rect.Width() - Inifile->ReadInteger("GridSize", AnsiString(ACol), Rect.Width()); } Rect.Right = Gesammt - Breite; if(ARow != 0 && (ARow % 2) == 0 && ACol != 0) { single_stringgrid->Canvas->Brush->Color = clLime; } else if(ARow != 0 && (ARow % 2) != 0 && ACol != 0) { single_stringgrid->Canvas->Brush->Color = clYellow; } single_stringgrid->Canvas->FillRect(Rect); if(ACol != 0 && ARow == 0) { Inifile->WriteInteger("GridSize", AnsiString(ACol), Rect.Width()); } Inifile->UpdateFile(); delete Inifile; }
-
Hallo,
Warum nimmst du zur Einstellung der Breite nicht einfach ColWidths?
-
Und TStringGrid::OnDrawCell ist eindeutig das falsche Event, um die Werte zu setzen. Und du speicherst anscheinend ja auch nur einen Wert: "GridSize"...
Also benutze ColWidths und lese die Spalten im Konstruktor deines Formulars und speichere sie im Destruktor.
-
Danke, ich wusste nicht, dass es dies gibt.
Nun habe ich noch ein anderes Problem:
Er überschreibt mir die Einträge in dem StringGrid.
Ich fülle es mit Werten, aber Sie werden nicht angezeigt.//Füllung der Überschrift single_stringgrid->Cells[1][0] = "SP1"; single_stringgrid->Cells[2][0] = "SP2"; single_stringgrid->Cells[3][0] = "SP3";//Funktion, die glaube ich die Ursache ist: void __fastcall TForm1::single_stringgridDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { if(ARow != 0 && (ARow % 2) == 0 && ACol != 0) { single_stringgrid->Canvas->Brush->Color = clLime; } else if(ARow != 0 && (ARow % 2) != 0 && ACol != 0) { single_stringgrid->Canvas->Brush->Color = clYellow; } single_stringgrid->Canvas->FillRect(Rect); }
-
Wenn du dein Rechteck in OnDrawCell neu malst werden da ja deine Texte mit übermalt. Du mußt den Text in OnDrawCell auch noch mit ausgeben. Das ist ja auch so in der FAQ beschrieben.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39160.html
-
Aha, ok.
Das laden dauert bei 1600 Zellen (minimum) sehr lange.
Kann man die Zellenhintergrundfarbe auch ausserhalb von OnDrawCell() ändern?
Wenn ja, wie?
Es ist ok, wenn ich jede Zelle einzelnd anwählen muss
-
Ich bezweifle das das an OnDrawcell liegt. Da werden immerhin nur die Zellen neu gezeichnet die auch zu sehen sind.
Und, Nein, das geht nicht außerhalb davon.
-
Stimmt, habe ich nun auch gesehen

Schade, dass es nicht geht