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

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

Проблема с использованием dll [D7]


LinkolnBurrows ©   (2011-09-05 13:30:00) 

Не пойму в чем проблема. создал библиотеку с 1 процедурой переноса содержимого adoquery в excel. При использовании данной библиотеки программа первый раз выполняет все как надо а на 2 или 3 раз(как повезет) критует с ошибкой: Project C:\.. .\Project1.exe faulted with message:'access violation at 0x0040636d: write od adress 0x00030c70'. Process Stopped. Use Step or Run to continue.
Вот код процедуры:

procedure ExportXLSADOQ(ADOQ: TADOQuery);
var
 col, row: Integer;
 ExcelApp: Variant;
 TimeStart,TimeNow,TimeNeed: tDateTime;
begin
   FrmST := TFrmST.Create(Application);
   FrmST.Show;
   ExcelApp := CreateOleObject('Excel.Application');
   ExcelApp.WorkBooks.Add();
   ExcelApp.WorkBooks[1].WorkSheets[1].Name := '1';
   ADOQ.Active:=false;
   ADOQ.Active:=true;    

 ADOQ.last;
 for col := 0 to ADOQ.FieldCount-1 do
   begin
     ExcelApp.Workbooks[1].WorkSheets[1].cells[1,col+1]:=ADOQ.Fields[col].DisplayName;
     ExcelApp.Workbooks[1].WorkSheets[1].cells[1,col+1].ColumnWidth:=round(length(ADOQ.Fields[col].AsString)*1.3);
   end;

 ADOQ.First;
 FrmST.Gauge.MaxValue:=ADOQ.RecordCount;
 TimeStart:=Time;
 for row := 0 to ADOQ.RecordCount-1 do
   begin
     For col:=0 to ADOQ.FieldCount-1 do
       Begin
         ExcelApp.Workbooks[1].WorkSheets[1].cells[row+2,col+1].value:=ADOQ.Fields[col].AsString;
       end;
     FrmST.Gauge.Progress:=row+1;
     TimeNow:=Time;
     FrmST.Label6.Caption:=timetostr(TimeNow-TimeStart);
     TimeNeed:=((ADOQ.RecordCount/(row+1))-1)*(TimeNow-TimeStart);
     FrmST.Label5.Caption:=timetostr(TimeNeed);
     FrmST.Label4.Caption:=inttostr(row+1)+'/'+inttostr(ADOQ.RecordCount);
     ADOQ.Next;
   end;
 ExcelApp.Visible := true;
 FrmST.free;

end;


DiamondShark   (2011-09-06 20:01:00) [1]


> Во всех остальных случаях это лишняя морока.

Монолитный экзешник на 100500 МБ -- это как орденский знак олдскульного дельфятника.


DiamondShark   (2011-09-06 19:59:00) [2]


> procedure ExportXLSADOQ(ADOQ: TADOQuery);

А нефиг компоненты передавать.
Если уж так приспичило, передавайте родные АДОшные интрефейсы, COM для того и придуман, чтобы всё куда попало передавать.
А дельфёвые компоненты очень не любят, когда их потрошат два независимых менеджера памяти.


Dimka Maslov   (2011-09-05 17:34:00) [3]


>  LinkolnBurrows ©   (05.09.11 14:48) [4]


универсальная библиотека быстрого вывода (так для себя) легко создаётся через pas-файл, присовокупляемый ко всем подряд проектам. Чтобы научиться делать dll достаточно создать одну единственную dll с одной единственной функцией, которую и вызвать из своей программы. Параллельно можно внимательно прочитать опус в начале исходного файла с предупреждением о возможных проблемах с dll. От себя добавлю, что передача в/из dll объектов есть дополнительный способ приобретения проблем.


Ega23   (2011-09-05 15:57:00) [4]


> понимаю что морока просто хочу заодно научиться dll создавать
> + сделаю чтото типа универсальной библиотеки быстрого вывода(так
> для себя хочу)


- Как забить гвоздь микроскопом?
- Гвозди забиваются молотком, микроскоп используется для других целей.
- Понимаю, но хочу научиться микроскопом пользоваться + сделать универсальный гвоздезабиватель.


LinkolnBurrows   (2011-09-05 14:48:00) [5]

понимаю что морока просто хочу заодно научиться dll создавать + сделаю чтото типа универсальной библиотеки быстрого вывода(так для себя хочу)


Dimka Maslov   (2011-09-05 14:27:00) [6]

dll обычно нужна когда несколько программ используют один и тот же функционал, изменение которого должно немедленно отражаться во всех программах без их перекомпиляции. Либо когда функционал пишется с использованием разных языков программирования. Во всех остальных случаях это лишняя морока.


Anatoly Podgoretsky   (2011-09-05 14:00:00) [7]

> LinkolnBurrows  (05.09.2011 13:30:00)  [0]

Не надо ДЛЛ


Медвежонок Пятачок   (2011-09-05 13:40:00) [8]

здесь два лишних элемента:

1. библиотека.
2. программа юзающая ее.


Наверх

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