007
04.08.2005, 16:38 Uhr
Th
|
Am einfachsten ist es, du speicherst die Excel-Tabelle (von Excel aus) im CSV-Format ab (dadurch werden nur die Werte gespeichert, alle Formatierungen gehen verloren, aber für das StringGrid ist das ja egal).
Dann lädst du diese CSV-Datei ein (einfaches Text-Format, schau einfach mal diese Datei mit Notepad o.ä. an) und setzt die einzelnen Werte dann in die ensprechende Spalte und Reihe des StringGrids.
Ich habe dies mal für eine Tabulator getrennte Datei gemacht, mußt halt in folgenden Code einfach '\t' durch ';' ersetzen:
C++: |
//--------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop
#include "ChildWin.h" //--------------------------------------------------------------------- #pragma resource "*.dfm" //--------------------------------------------------------------------- __fastcall TMDIChild::TMDIChild(TComponent *Owner) : TForm(Owner) { } //--------------------------------------------------------------------- void __fastcall TMDIChild::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; } //--------------------------------------------------------------------- void __fastcall TMDIChild::StringGridKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if(Shift.Contains(ssAlt)) { switch(Key) { case VK_LEFT: if(StringGrid->ColCount > 1 && StringGrid->Col == StringGrid->ColCount-1) { StringGrid->ColCount--; StringGrid->Col = StringGrid->ColCount-1; } break; case VK_RIGHT: if(StringGrid->Col == StringGrid->ColCount-1) { StringGrid->ColCount++; StringGrid->Col = StringGrid->ColCount-1; } break; case VK_UP: if(StringGrid->RowCount > 1 && StringGrid->Row == StringGrid->RowCount-1) { StringGrid->RowCount--; StringGrid->Row = StringGrid->RowCount-1; } break; case VK_DOWN: if(StringGrid->Row == StringGrid->RowCount-1) { StringGrid->RowCount++; StringGrid->Row = StringGrid->RowCount-1; } break; } Key = 0; } } //--------------------------------------------------------------------------- void TMDIChild::LoadFromFile(const AnsiString &sFile) { TStringList *sList = new TStringList;
sFilename = sFile; sList->LoadFromFile(sFilename);
StringGrid->RowCount = sList->Count; StringGrid->FixedRows = (sList->Count > 1)? 1 : 0; StringGrid->ColCount = 1;
for(int i=0; i<sList->Count; i++) SetRow(StringGrid, i, sList->Strings[i]);
delete sList; }
void TMDIChild::SetRow(TStringGrid *grid, int nRow, const AnsiString &sText) { AnsiString sCellText; int nCol = 0; for(int i=1; i<=sText.Length(); i++) { if(sText[i] == '\t') { SetCell(grid, nCol, nRow, sCellText); nCol++; sCellText = ""; } else sCellText += sText[i]; } if(!sCellText.IsEmpty()) { SetCell(grid, nCol, nRow, sCellText); } }
void TMDIChild::SetCell(TStringGrid *grid, int nCol, int nRow, const AnsiString &sText) { if(nCol >= grid->ColCount) grid->ColCount = nCol + 1; grid->Cells[nCol][nRow] = sText; }
bool TMDIChild::SaveToFile(const AnsiString &sFile) { if(!sFile.IsEmpty()) sFilename = sFile;
if(sFilename.IsEmpty()) return false;
TStringList *sList = new TStringList;
for(int i=0; i<StringGrid->RowCount; i++) { AnsiString sText = StringGrid->Cells[0][i]; for(int j=1; j<StringGrid->ColCount; j++) sText += "\t" + StringGrid->Cells[j][i]; sList->Add(sText); }
sList->SaveToFile(sFilename);
delete sList;
return true; }
void TMDIChild::GetPos(int &x, int &y) { x = StringGrid->Col; y = StringGrid->Row; }
|
Die Methode StringGridKeyDown dient zum Anlegen neuer Spalten und Zeilen innerhalb des StringGrids (falls du es auch brauchst oder aber du läßt es weg). Mußt entsprechend ein "StringGrid" auf dem Formular haben, aber das kriegst du schon hin -) Dieser Post wurde am 04.08.2005 um 16:40 Uhr von Th editiert. |