Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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]

Ну просветите меня кто-нить!
Не былоб нужды не стал бы засорять форум своими глупыми вопросами.
Сам ведь не смогу докапаться.


Наверх

Титульная страница Поиск, карта сайта Написать письмо