Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП - проблема с доступом 
V
    Опции темы
uranpro
  Дата 28.5.2008, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



создал класс, для работы с Excel`ем , в виде модуля(.pas).  создал новую форму, подконнектил свой модуль, объявил переменную(cE:cExcel),
когда пытаюсь задать параметры(SetExcParams) запуска екселя, начинает ругаться !!!! (((

errmessage: 
Access violation at address 00453B0C in module 'Test.exe'. Write of address 00000038. smile 

в чем проблема и как ее исправить ? подскажите пожалуйса!

тело класса: smile 
Код

unit uExcel;

interface

const
 colorGreen     = 15007690;
 colorBlue      = 16758380;
 colorLightBlue = 16777088;
 colorOrange    = 33023;
 colorGrey      = 8421504;
 colorSilver    = 12632256;
 colorPink      = 16744703;
 colorWhite     = 16777215;
 colorDarkGrey  = 128;
 colorBlack     = 0;
 colorRed       = 255;
 colorLightRed  = 8421631;
 colorDarkPerp  = 11534424;

type

    TRanges = record
     CurrRow:integer;
     CurrSheet:integer;
     EndRow:Char; {по умолчанию B}
     EndRowGlb:Char; {glb row default B}
     MergeEnd:Char; {по умолчанию B}
     ColumnWidths: array ['A'..'Z'] of real; {Работает, если задан EndRow}
     BeckgroundColor:integer; {Работает, если задан EndRow}
     Formats: array [1..10] of string; {NumberFormat: ### ### ##0.00}
     LineStyle:integer; {Table linestyle Default = 1}
     Formula:string;
     end;



    cExcel = class
     public
       WKB,
       Exc        : OleVariant;
       Template   : string;
       Ranges     : TRanges;
       //procedure SetBeckgroungColorA(col:integer);{автоматически}
       procedure DrawTableA(S:Char);
       procedure DrawTableM(S1,S2:Char);
       procedure MergeA(S:Char);
       procedure MergeM(S1,S2:Char);
       procedure DrawColorA(S:Char; col:integer);
       procedure DrawColorM(S1,S2:Char; col:integer);
       procedure StartExcel(ChangeColWidths:boolean);
       constructor Create;
       procedure SetVisible(const AValue: boolean);
       function GetVisible: boolean;
       procedure SetRangeVal(const S:Char; const AValue:string);
       function GetRangeVal(const S:Char): string;
       function Range(S:Char): OleVariant;
       property Visible : boolean
         read  GetVisible
         write SetVisible;
     private
       procedure SetColWidths;
       end;

implementation

uses ComObj, Variants, VarUtils, Classes, SysUtils, ExcelXP, Dialogs,
  DateUtils;

constructor cExcel.Create;
var i:integer;
begin
   Exc      := null;
   Template := '';
   with Ranges do begin
    CurrRow:=1;
    CurrSheet:=1;
    EndRow:='B';
    EndRowGlb:='B';
    MergeEnd:='B';
    for i:=ord('A') to ord('Z') do ColumnWidths[chr(i)]:=8.43;
    BeckgroundColor:=0;
    for i:=1 to 10 do Formats[i]:='#';
    LineStyle:=1;
    Formula:='';
    end;
end;

procedure cExcel.DrawColorA(S:Char; col:integer);
begin
WKB.Range[S + IntToStr(Ranges.CurrRow),
          Ranges.EndRowGlb + IntToStr(Ranges.CurrRow)].Interior.Color:=col;
end;

procedure cExcel.DrawColorM(S1,S2:Char; col:integer);
begin
WKB.Range[S1 + IntToStr(Ranges.CurrRow),
          S2 + IntToStr(Ranges.CurrRow)].Interior.Color:=col;
end;

procedure cExcel.SetColWidths;
var i:integer;
begin
for i:=ord('A') to ord(Ranges.EndRowGlb) do
Range(chr(i)).ColumnWidth:=Ranges.ColumnWidths[chr(i)];
end;

function cExcel.Range(S:Char): OleVariant;
begin
Result:=WKB.Range[S + IntToStr(Ranges.CurrRow)];
end;

procedure cExcel.SetRangeVal(const S:Char; const AValue:string);
begin
Range(S).Value:=AValue;
end;

function cExcel.GetRangeVal(const S:Char): string;
begin
result:=Range(S).Value
end;

procedure cExcel.DrawTableA(S:Char);
begin
WKB.Range[S + IntToStr(Ranges.CurrRow),
Ranges.EndRowGlb + IntToStr(Ranges.CurrRow)].Borders.Linestyle:=Ranges.LineStyle;
end;

procedure cExcel.DrawTableM(S1,S2:Char);
begin
WKB.Range[S1 + IntToStr(Ranges.CurrRow),
          S2 + IntToStr(Ranges.CurrRow)].Borders.Linestyle:=Ranges.LineStyle;
end;

procedure cExcel.MergeA(S:Char);
begin
WKB.Range[S + IntToStr(Ranges.CurrRow),
          Ranges.MergeEnd + IntToStr(Ranges.CurrRow)].Merge;
end;

procedure cExcel.MergeM(S1,S2:Char);
begin
WKB.Range[S1 + IntToStr(Ranges.CurrRow),
          S2 + IntToStr(Ranges.CurrRow)].Merge;
end;

{
procedure cExcel.SetBeckgroungColorA(col:integer);
begin
WKB.Range['A', Ranges.EndRow].Interior.Color:=col;
end;
 }

procedure cExcel.SetVisible(const AValue: boolean);
begin
if Exc.Visible <> AValue then
   Exc.Visible := Variant(AValue);
end;

function cExcel.GetVisible: boolean;
begin
   Result := Exc.Visible or false;
end;

procedure cExcel.StartExcel(ChangeColWidths:boolean);
begin
   Exc := CreateOleObject('Excel.Application');
if (Template<>'') and (FileExists(Template)) then Exc.Workbooks.Open(Template);

if ChangeColWidths=true then SetColWidths;

WKB:=Exc.ActiveWorkbook;
end;

end.


тело программы: smile 
Код

var cE:cExcel;

procedure TTestForm.SetExcParams;
begin
cE.Ranges.EndRow:='F';
cE.Ranges.EndRowGlb:='H';
cE.Ranges.MergeEnd:='F';
cE.Ranges.ColumnWidths['A']:=7.71;
cE.Ranges.ColumnWidths['B']:=8.29;
cE.Ranges.ColumnWidths['C']:=9.57;
cE.Ranges.ColumnWidths['D']:=8.71;
cE.Ranges.ColumnWidths['E']:=8.43;
cE.Ranges.ColumnWidths['F']:=3.57;
cE.Ranges.ColumnWidths['G']:=12.00;
cE.Ranges.ColumnWidths['H']:=12.00;
cE.Template:='template(test).xls';
end;

procedure TTestForm.Button1Click(Sender: TObject);
begin
SetExcParams;
cE.StartExcel(true);
cE.Visible:=true;
end;


 smile 


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Felan
Дата 28.5.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Может его создать надо?

Цитата(uranpro @  28.5.2008,  16:15 Найти цитируемый пост)
procedure TTestForm.Button1Click(Sender: TObject);
begin
cE : = cExcel.Create();
SetExcParams;
cE.StartExcel(true);
cE.Visible:=true;
end;


Ну и удалить потом не забыть.


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
uranpro
Дата 28.5.2008, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



спасиб, а как деконструктор запускать ?


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Rennigth
Дата 28.5.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Цитата(uranpro @  28.5.2008,  14:36 Найти цитируемый пост)
деконструктор
 деструктор smile
Код

cE.Free



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
uranpro
Дата 28.5.2008, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



бугага))) спасиб)


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1026 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.