--- /home/alexsander/lazarus/lcl/grids.pas	2012-10-15 15:56:44.720450476 -0300
+++ /usr/lib/codetyphon/lazarus/lcl/grids.pas	2012-10-16 14:55:01.912024839 -0300
@@ -1556,8 +1556,8 @@
       procedure CopyToClipboard(AUseSelection: boolean = false);
       procedure LoadFromCSVStream(AStream: TStream; ADelimiter: Char=','; WithHeader: boolean=true);
       procedure LoadFromCSVFile(AFilename: string; ADelimiter: Char=','; WithHeader: boolean=true);
-      procedure SaveToCSVStream(AStream: TStream; ADelimiter: Char=','; WithHeader: boolean=true);
-      procedure SaveToCSVFile(AFileName: string; ADelimiter: Char=','; WithHeader: boolean=true);
+      procedure SaveToCSVStream(AStream: TStream; ADelimiter: Char=','; WithHeader: boolean=true; VisibleColumnsOnly: boolean=false);
+      procedure SaveToCSVFile(AFileName: string; ADelimiter: Char=','; WithHeader: boolean=true; VisibleColumnsOnly: boolean=false);
 
       property Cells[ACol, ARow: Integer]: string read GetCells write SetCells;
       property Cols[index: Integer]: TStrings read GetCols write SetCols;
@@ -10429,9 +10428,9 @@
   end;
 end;
 
-procedure TCustomStringGrid.SaveToCSVStream(AStream: TStream; ADelimiter: Char=','; WithHeader: boolean=true);
+procedure TCustomStringGrid.SaveToCSVStream(AStream: TStream; ADelimiter: Char; WithHeader, VisibleColumnsOnly: boolean);
 var
-  i,StartRow: Integer;
+  i,j,StartRow: Integer;
   HeaderL, Lines: TStringList;
   C: TGridColumn;
 begin
@@ -10450,6 +10449,7 @@
               if c=nil then
                 HeaderL.Add(Cells[i, 0])
               else
+                if c.Visible or not VisibleColumnsOnly then
                 HeaderL.Add(c.Title.Caption);
             end;
             HeaderL.Delimiter:=ADelimiter;
@@ -10468,17 +10468,38 @@
     end else
       StartRow := FixedRows;
     for i:=StartRow to RowCount-1 do begin
+      if Columns.Enabled and VisibleColumnsOnly then begin
+        HeaderL := TStringList.Create;
+        try
+        for j := 1 to FixedCols do
+          HeaderL.Add('');
+        for j := 0 to ColCount-1 do begin
+          c := ColumnFromGridColumn(j);
+          if c=nil then Continue;
+          if c.Visible then
+            HeaderL.Add(Cells[j,i]);
+        end;
+        HeaderL.Delimiter:=ADelimiter;
+        HeaderL.StrictDelimiter := False; //force quoting of strings that contain whitespace or Delimiter
+        Lines.Add(HeaderL.DelimitedText); // Add the row in Lines
+        finally
+          HeaderL.Free;
+        end;
+      end
+      else
+      begin
       Rows[i].StrictDelimiter := False; //force quoting of strings that contain whitespace or Delimiter
       Rows[i].Delimiter:=ADelimiter;
       Lines.Add(Rows[i].DelimitedText);
     end;
+    end;
     Lines.SaveToStream(AStream);
   finally
     Lines.Free;
   end;
 end;
 
-procedure TCustomStringGrid.SaveToCSVFile(AFileName: string; ADelimiter: Char=','; WithHeader: boolean=true);
+procedure TCustomStringGrid.SaveToCSVFile(AFileName: string; ADelimiter: Char; WithHeader, VisibleColumnsOnly: boolean);
 var
   TheStream: TFileStream;
 begin
