| 
| 
 | Вопрос # 4 669/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Подскажите пожалуйста у меня на форме расположены stringgrid, кнопка при нажатии которой данные из stringgrid экспортируются в excel. Как сделать так чтобы при нажатии кнопки можно было выбрать куда сохранять файл excel? Я понемаю что надо использовать компонент SaveDialog, но не знаю как.
 Приложение:Переключить в обычный режим unit Unit5; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, Grids, StdCtrls, ComObj, Buttons, OleServer, ExcelXP, DateUtils,  ComCtrls, ExtCtrls, Gauges; type  TForm5 = class(TForm)    StringGrid1: TStringGrid;    BitBtn1: TBitBtn;    ea: TExcelApplication;    Gauge1: TGauge;    SaveDialog1: TSaveDialog;    procedure FormActivate(Sender: TObject);    procedure BitBtn1Click(Sender: TObject);          private    { Private declarations }  public    { Public declarations }  end; var  Form5: TForm5;  dir_:string;implementation uses Unit3, Unit1, Unit2; {$R *.dfm}procedure TForm5.BitBtn1Click(Sender: TObject);varExcel, WorkBook, Sheet:variant;i, j: integer;GridPrevFile,extens: string; beginGetDir(0, dir_); Excel:=CreateOleObject('Excel.Application');Excel.DisplayAlerts:=False;Excel.Visible:= False;Workbook:=Excel.Workbooks.Add;Workbook.SaveAs(dir_ + '\temp_' + IntToStr(DayOfTheMonth(Date)) + '.' +
IntToStr(MonthOfTheYear(Date)) + '.' + IntToStr(YearOf(Date)) + '.xls');Sheet:= Workbook.ActiveSheet;Gauge1.MaxValue:=100;Gauge1.Progress:=0;for i:= 0 to StringGrid1.RowCount - 1 do   beginfor j:= 0 to StringGrid1.ColCount - 1 doSheet.Cells[i+1, j+1]:= StringGrid1.Cells[j, i];   Excel.WorkBooks[1].WorkSheets[1].Columns[1].ColumnWidth := 33;Excel.WorkBooks[1].WorkSheets[1].Columns[2].ColumnWidth := 15;Excel.WorkBooks[1].WorkSheets[1].Columns[3].ColumnWidth := 10;Excel.WorkBooks[1].WorkSheets[1].Columns[4].ColumnWidth := 23;if StringGrid1.RowCount>0 thenGauge1.Progress:=Round(((i+1)*100)/StringGrid1.RowCount);end; Workbook.Save;Workbook.Close;Excel.Quit;Excel:= UnAssigned;end;   procedure TForm5.FormActivate(Sender: TObject);var i:integer;begin tryDM.dbs.Open;dm.query.Open;DM.query.First;excepton e: exception do showmessage(e.Message);end;stringgrid1.Visible:=false;i:=0; DM.query.SQL.Text:='select (select F+'+char(39)+' '+char(39)+'+I+'+char(39)+' '+char(39)+'+O from
owner where card_id=card.card_id),spiski.card_number,(select mobile_phone from owner where
card_id=card.card_id),(select email_address from owner where card_id=card.card_id)'+'from spiski inner join card on card.card_number=spiski.card_number where
act_'+Form1.StringGrid1.cells[0,form1.StringGrid1.row]+'=1';       StringGrid1.ColWidths[0] := 220;StringGrid1.ColWidths[1] := 100;StringGrid1.ColWidths[2] := 70;StringGrid1.ColWidths[3] := 130; DM.query.Open;DM.query.First;while not DM.query.Eof dobegininc(i);stringgrid1.Cells[0,i]:=DM.query.Fields[0].AsString;stringgrid1.Cells[1,i]:=DM.query.Fields[1].AsString;stringgrid1.Cells[2,i]:=DM.query.Fields[2].AsString;stringgrid1.Cells[3,i]:=DM.query.Fields[3].AsString; stringgrid1.RowCount:=i+1;DM.query.Next;end;stringgrid1.FixedRows:=1;stringgrid1.Visible:=true;DM.query.Close; end;end.
|  |   Вопрос задал: slai (статус: Посетитель)Вопрос отправлен: 19 октября 2010, 07:02
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Шичко Игорь Здравствуйте, slai!Предлагаю Вам немного другой вариант решения. На форме расположить компоненты:  DriveComboBox1 и DirectoryListBox1 со страницы Win 3.1.
 ...
 DriveComboBox1: TDriveComboBox;
 DirectoryListBox1: TDirectoryListBox;
 ...
 В свойстве DriveComboBox1 DirList выбрать DirectoryListBox1.
 
 Тогда можно работать практически как с проводником.
 Выбранный путь для сохранения файла будет следующим:
 
 ....
 dir_:= DirectoryListBox1.Directory;
 ....
 Workbook.SaveAs(dir_ + '\temp_' + IntToStr(DayOfTheMonth(Date)) + '.' + IntToStr(MonthOfTheYear(Date)) + '.' + IntToStr(YearOf(Date)) + '.xls');
 ...
 
 Файл будет сохраняться в выбранном каталоге.
 Вопросы - пишите.
 Удачи.
 
|  | Ответ отправил: Шичко Игорь (статус: 9-ый класс)Время отправки: 19 октября 2010, 07:48
 Оценка за ответ: 5
 |  Ответ #2. Отвечает эксперт: min@y™ Ну и какие проблемы?Положь SaveDialog на форму. Вызвать его и узнать, какое имя файла выбрал юзер, ты можешь так:
 
 SaveDialog.Filter:= 'Файлы MSExcel (*.xls)|*.xls';
SaveDialog.DefaultExt:= 'xls';
SaveDialog.Options:= SaveDialog.Options + [ofOverwritePrompt];
if SaveDialog.Execute()
  then begin
         // Здесь код процедуры BitBtn1Click
         // имя файла, выбранного в SaveDialog - это SaveDialog.FileName.
       end;
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 19 октября 2010, 08:45
 
 |  
 Мини-форум вопросаВсего сообщений: 2; последнее сообщение — 19 октября 2010, 08:22; участников в обсуждении: 2. 
|   | slai (статус: Посетитель), 19 октября 2010, 08:11 [#1]:Спасибо работает. Но все таки хотелось бы попробовать и через SaveDialog. |  
|   | Шичко Игорь (статус: 9-ый класс), 19 октября 2010, 08:22 [#2]:Попробуйте. Расположите на форме компонент SaveDialog1. Применение:
 
 procedure TForm5.BitBtn1Click(Sender: TObject);
 ....
 if SaveDialog1.Execute then
 begin
 ...
 Workbook.SaveAs(SaveDialog1.FileName);
 ...
 end;
 При нажатии на кнопку открывается окно ввода имени сохраняемого файла. Обращение к нему в программе: SaveDialog1.FileName
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |