Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.03;
Скачать: CL | DM;

Вниз

KOLComObj   Найти похожие ветки 

 
max727   (2007-06-25 17:50) [0]

Добрый день, подскажите пожалуйста, как хотя бы
запустить Excel, создать рабочюю книгу и написать пару строк
с помощью KOLComObj.pas (пишу на Delphi 6)

а то у сам уже замучился пробовать

строки
...
var
E:Variant;
begin
E:=CreateOleObject("Excel.Application");
...

компилируются, но уже в Run-time выкидывают ошибку
Exception in module KolComTest.exe at 0000010879

как правильно написать код для запуска Excel?


 
max727   (2007-06-26 18:33) [1]

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


 
D[u]fa ©   (2007-06-26 18:59) [2]

OleInitia...... вызываешь перед созданием?


 
max727   (2007-06-26 19:28) [3]

теперь код выглядит так:

procedure TForm1.Button1Click(Sender: PObj);
var
E:Variant;
begin
OleUnInit;
E:=CreateOleObject("Excel.Application");
E.Application.Visible:=True;
end;

но программа все равно вываливается с ошибкой

не могли бы вы написать простенький пример вроде моего?


 
Vladimir Kladov   (2007-06-26 19:45) [4]

UnInit - это отмена Init. Английский учим, да?


 
max727   (2007-06-26 19:52) [5]

прошу прощения
день сегодня был запарный
вот и не заметил, что вместо OleInit
написал OleUnInit
теперь все работает спасибо D[u]fa

осталось пара вопросов
1. для чего нужно OleUnInit?
2. и как правильно освободить(незнаю или разрушить) пременную E,
     короче, как правильно завершить работу с Ole Automation сервером?


 
Vladimir Kladov   (2007-06-26 19:59) [6]

Это интерфейс. Уничтожается сам, так же как и вариант, если это локал, при выходе из области видимости (кажется, так). Если не локал, надо := nil делать (для варианта, что-то другое, не помню).


 
Vladimir Kladov   (2007-06-26 20:01) [7]

А, вспомнил: х := Unassigned;


 
max727   (2007-06-27 12:29) [8]

Большое спасибо!


 
max727   (2007-06-27 13:18) [9]

Попытался написать простенькую прогрмму
(такой же код на 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 15:34) [10]

и еще странность обнаружилась

заменяю в uses KOLComObj на ComObj - все работает и размер программы 78 кб

меняю обратно - компилиться , но в run-time вываливается с ошибкой на той же строчке (см выше) и размер - 81 кб

скажите, пожалуйста, почему?


 
Vladimir Kladov   (2007-06-27 16:38) [11]

Я не работал с Excel из KOL. Если посмотрите на KOLWord, то увидите, что там вообще всеё не так же, как VCL, делается.


 
max727   (2007-06-29 18:05) [12]

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-29 20:09) [13]

W.ShowErrors := TRUE;

Где искать коды ошибок, я не помню (если вообще знал).


 
ANTPro ©   (2007-06-29 23:35) [14]

> [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;



Страницы: 1 вся ветка

Текущий архив: 2008.02.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.03 c
3-1190772410
costya
2007-09-26 06:06
2008.02.03
Ошибка StackOverflow в FIBDataSet


2-1199828877
Артем
2008-01-09 00:47
2008.02.03
Edit.Text преобразовать в WideString


15-1198883081
No_Dead
2007-12-29 02:04
2008.02.03
НГ на носу&amp;#133 А будете ли вы в нем что либо менять?


6-1179759600
Nucer
2007-05-21 19:00
2008.02.03
Как определить, что соединение разорвано?


3-1190637825
tipman
2007-09-24 16:43
2008.02.03
Список активных пользователей