![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с использованием 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. программа юзающая ее.