![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
KOLComObj [Delphi, Windows]
max727 © (2007-06-25 17:50:00)Добрый день, подскажите пожалуйста, как хотя бы
запустить Excel, создать рабочюю книгу и написать пару строк
с помощью KOLComObj.pas (пишу на Delphi 6)
а то у сам уже замучился пробовать
строки
...
var
E:Variant;
begin
E:=CreateOleObject('Excel.Application');
...
компилируются, но уже в Run-time выкидывают ошибку
Exception in module KolComTest.exe at 0000010879
как правильно написать код для запуска Excel?
ANTPro (2007-06-29 23:35:00) [1]> [12] max727 (29.06.07 18:05)
Вот это в VCL работало. Может поможет...
//Экспорт таблицы в Microsoft Word
procedure TDM.ExportInWord(aQuery: TZQuery);
var
i, j, g, CountVisibleFields: Integer;
Word, WordDocument, WordSelection, WordTable: Variant;
begin
CountVisibleFields := 0;
Word := CreateOleObject('Word.Application');
Word.Visible := True;
WordDocument := Word.Documents.Add(EmptyParam, EmptyParam);
WordSelection := Word.Selection;
WordDocument := Word.ActiveDocument;
if aQuery.Active then
begin
if aQuery.RecordCount <> 0 then
begin
for i := 0 to aQuery.FieldList.Count - 1 do
if aQuery.FieldList.Fields[i].Visible then Inc(CountVisibleFields);
WordTable := WordDocument.Tables.Add(WordSelection.Range, aQuery.RecordCount + 1, CountVisibleFields);
g := 1;
for i := 0 to aQuery.FieldList.Count - 1 do
if aQuery.FieldList.Fields[i].Visible then
begin
WordTable.Cell(1, g).Range.Text := aQuery.FieldList.Fields[i].DisplayLabel;
Inc(g);
end;
aQuery.First;
for i := 1 to aQuery.RecordCount do
begin
g := 1;
for j := 0 to aQuery.FieldList.Count - 1 do
if aQuery.FieldList.Fields[j].Visible then
begin
WordTable.Cell(i + 1, g).Range.Text := aQuery.Fields.Fields[j].AsString;
inc(g);
end;
aQuery.Next;
end;
end;
end;
end;
Vladimir Kladov (2007-06-29 20:09:00) [2]W.ShowErrors := TRUE;
Где искать коды ошибок, я не помню (если вообще знал).
max727 (2007-06-29 18:05:00) [3]program HelloWorld;
uses
KOL, KOLWord;
var W:PWordDocument;
begin
W:=NewWordDocument;
W.ObjInvoke( 'Add', [], nil );
W.ObjName := 'Selection';
W.ObjInvoke( 'TypeText', [ sParam('Hello, Wor(L)d!') ], nil );
W.ObjName := 'Application';
W.ObjPropBool['Visible']:=True;
MsgOK('По идее должен показаться ворд, но его нет!');
W.Free;
end.
что неправильно?
Vladimir Kladov (2007-06-27 16:38:00) [4]Я не работал с Excel из KOL. Если посмотрите на KOLWord, то увидите, что там вообще всеё не так же, как VCL, делается.
max727 (2007-06-27 15:34:00) [5]и еще странность обнаружилась
заменяю в uses KOLComObj на ComObj - все работает и размер программы 78 кб
меняю обратно - компилиться , но в run-time вываливается с ошибкой на той же строчке (см выше) и размер - 81 кб
скажите, пожалуйста, почему?
max727 (2007-06-27 13:18:00) [6]Попытался написать простенькую прогрмму
(такой же код на vcl прекрасно работает)
не получается ни открыть, ни добавить рабочую книгу
program XlsToDBF_v2;
{$DEFINE KOL}
uses Kol, KolComObj;
{$R *.res}
var
Ex: Variant;
OD: POpenSaveDialog;
begin
OD := NewOpenSaveDialog('Open', '', DefOpenSaveDlgOptions);
OD.Filter := 'Файлы Excel|*.xls';
if OD.Execute then
begin
OleInit;
Ex := CreateOleObject('Excel.Application');
Ex.Visible := True;
MsgOK(OD.Filename);
Ex.Workbooks.Open(OD.Filename);//тут вылетает ошибка
Ex.Columns['A:A'].EntireColumn.AutoFit;
Ex.Columns['B:B'].EntireColumn.AutoFit;
Ex.Columns['C:C'].EntireColumn.AutoFit;
Ex.Columns['D:D'].EntireColumn.AutoFit;
Ex.Columns['E:E'].EntireColumn.AutoFit;
Ex.Columns['F:F'].EntireColumn.AutoFit;
Ex.Columns['G:G'].EntireColumn.AutoFit;
Ex.Columns['F:F'].EntireColumn.AutoFit;
Ex.Columns['G:G'].EntireColumn.AutoFit;
Ex.Columns['H:H'].EntireColumn.AutoFit;
Ex.Columns['I:I'].EntireColumn.AutoFit;
Ex.Columns['J:J'].EntireColumn.AutoFit;
Ex.Columns['K:K'].EntireColumn.AutoFit;
Ex.Columns['L:L'].EntireColumn.AutoFit;
Ex.Columns['M:M'].EntireColumn.AutoFit;
Ex.Columns['N:N'].EntireColumn.AutoFit;
Ex.Columns['O:O'].EntireColumn.AutoFit;
Ex.Columns['P:P'].EntireColumn.AutoFit;
Ex.Columns['Q:Q'].EntireColumn.AutoFit;
Ex.Columns['R:R'].EntireColumn.AutoFit;
Ex.Columns['S:S'].EntireColumn.AutoFit;
Ex.Columns['T:T'].EntireColumn.AutoFit;
Ex.Range['A1'].Select;
Ex.Range[Ex.Selection, Ex.ActiveCell.SpecialCells(11)].Select;
Ex.ActiveWorkbook.SaveAs(Filename := copy(OD.FileName, 1, length(OD.FileName) - 4) + '.dbf', FileFormat := 8, CreateBackup := False);
Ex.ActiveWorkbook.Save;
Ex.ActiveWorkbook.Close;
Ex.Quit;
OleUnInit;
end;
OD.Destroy;
end.
извините за назойливость
но у меня просто не не настолько велик багаж знаний, чтоб разобраться самому (первый год работаю только что техникум закончил)
как надо правильно написать, чтоб заработало?
max727 (2007-06-27 12:29:00) [7]Большое спасибо!
Vladimir Kladov (2007-06-26 20:01:00) [8]А, вспомнил: х := Unassigned;
Vladimir Kladov (2007-06-26 19:59:00) [9]Это интерфейс. Уничтожается сам, так же как и вариант, если это локал, при выходе из области видимости (кажется, так). Если не локал, надо := nil делать (для варианта, что-то другое, не помню).
max727 (2007-06-26 19:52:00) [10]прошу прощения
день сегодня был запарный
вот и не заметил, что вместо OleInit
написал OleUnInit
теперь все работает спасибо D[u]fa
осталось пара вопросов
1. для чего нужно OleUnInit?
2. и как правильно освободить(незнаю или разрушить) пременную E,
короче, как правильно завершить работу с Ole Automation сервером?
Vladimir Kladov (2007-06-26 19:45:00) [11]UnInit - это отмена Init. Английский учим, да?
max727 (2007-06-26 19:28:00) [12]теперь код выглядит так:
procedure TForm1.Button1Click(Sender: PObj);
var
E:Variant;
begin
OleUnInit;
E:=CreateOleObject('Excel.Application');
E.Application.Visible:=True;
end;
но программа все равно вываливается с ошибкой
не могли бы вы написать простенький пример вроде моего?
D[u]fa (2007-06-26 18:59:00) [13]OleInitia...... вызываешь перед созданием?
max727 (2007-06-26 18:33:00) [14]Ну просветите меня кто-нить!
Не былоб нужды не стал бы засорять форум своими глупыми вопросами.
Сам ведь не смогу докапаться.