S
Hallo zusammen,
so kann das StringGrid beliebig viele Zellen beliebiger Grösse haben;
leicht unschön anzuschauen aber es funktioniert.
Integer ix,iy,iCol,iRow,iB,iH,iAktC,iAktR; AnsiString z1,z2; // Vars definieren
TStringGrid *Grid; // TStringGrid vorbereiten
Graphics::TBitmap *bmp = new Graphics::TBitmap(); // BMP Image anlegen
Grid =frm14_grd6_Schrank; // StringGrid übergeben
iCol =Grid->ColCount; // Anzahl Spalten
iRow =Grid->RowCount; // Anzahl Zeilen
iAktC=Grid->LeftCol; // aktuelle linke Spalte?
iAktR=Grid->TopRow; // aktuelle obere Zeile?
iB=0; for(int i1=0;i1<iCol;i1++) { iB=iB+Grid->ColWidths[i1]; } // Breite aller Spalten?
iH=0; for(int i1=0;i1<iRow;i1++) { iH=iH+Grid->RowHeights[i1]; } // Höhe aller Zeilen?
bmp->Width =iB; // Breite Image einstellen
bmp->Height=iH; // Höhe Image einstellen
//if(Form1->PrgComp==true) { ShowMessage("BxH = "+IntToStr(iB)+" x "+IntToStr(iB)); } // nur im IDE zeigen
TRect RectA,RectB; // Rects vorbereiten
TGridDrawState State; // State vorbereiten
iy=0; // Start Koordinate Y
for(int i1=0;i1<iRow;i1++) { // alle Zeilen
Grid->TopRow=i1; ix=0; // Zeile
for(int i0=0;i0<iCol;i0++) { // alle Spalten
Grid->LeftCol=i0; // Spalte neu einstellen
RectA=Grid->CellRect(i0,i1); // Rect der aktuellen Zelle ermitteln
GridZeichnen(1,i0,i1,RectA,State,frm14_grd6_Schrank); // und Zelle direkt einzeln zeichnen
RectB=Rect(ix,iy,ix+RectA.Width(),iy+RectA.Height()); // Rect für Image ermitteln
bmp->Canvas->CopyRect(RectB, Grid->Canvas, RectA); // und Zelle in Image kopieren
ix=ix+Grid->ColWidths[i0]; // Breite dazuaddieren
} // ende for(i0
iy=iy+Grid->RowHeights[i1]; // Höhe dazuaddieren
} // ende for(i1
Grid->LeftCol=iAktC; // aktuelle Spalte wieder einstellen
Grid->TopRow =iAktR; // aktuelle Höhe wieder einstellen
z1=Form1->PrgPfad+"\\Ablage\\Grafik_"+frm14_lblSchrank->Caption+".bmp"; // Dateiname bilden
bmp->SaveToFile(z1); // Grafik sichern
delete bmp; // und freigeben
if(FileExists(Form1->PrgGrafEx)==false) { Form1->PrgGrafEx="mspaint.exe"; } // externes Prg. ggfs. korrigieren
z2=Form1->PrgGrafEx+" \""+z1+"\""; // ergänzen
WinExec(z2.c_str(),SW_NORMAL); // Malprogramm aufrufen
Das Grid=frm14_grd6_Schrank; kann ersetzt werden mit einer Funktion und
dann Übergabe des StringGrid als TObject:
TStringGrid *Grid = dynamic_cast<TStringGrid *> (Sender); // Versuchen, Sender als StringGrid anzusprechen
Danke für alle Tips und Hinweise, Stefan