Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2

Модерирует : ShIvADeSt

ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы http://forum.ru-board.com/topic.cgi?forum=33&topic=3647&start=2020#lt
Внимание, все большие куски кода (более 5 строк) оформляем в тег [more] дабы уменьшить размер поста.

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:52 20-04-2006 | Исправлено: ShIvADeSt, 02:02 30-06-2006
Aladdinych



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть основная программа и в ней форма. На ней Database1 с именем MyDB и компонент Table1: TTable.
И есть bpl, в которой экспортируются процедура и функция:
 
procedure Proc_Show_Table(Database1: Tdatabase; Tablea: TTable);
begin
try
   Form2:=TForm2.Create(nil);
   Form2.Label1.Caption:=tablea.DatabaseName;
   Form2.ShowModal;
 finally
   Form2.Free;
end;
end;
 
function Get_Table_PTR(Tablea: TTable):TTable;
begin
result:=tablea;
end;
 
Из основного приложения
Подключаюсь к Database1, Table1.active:=true.
На форме есть две кнопки.
По нажатию Кнопки2 вызывается Get_Table_PTR
....
@MyFun:=GetProcAddress(MyModule, 'Get_Table_PTR');
tbl:=MyFun(form1.table1);
label1.Caption:=tbl.DatabaseName;
....
В результате после клика на кнопке в Label1 Вижу надпись 'MyDB'.
 
По нажатию Кнопки1 вызывается Proc_Show_Table
....
  @ShowTable:=GetProcAddress(MyModule, 'Proc_Show_Table');
   showtable(database1, table1);
....
 
В результате открывается форма а на ней в Label1 вижу абракадабру.
Очевидно, я в чем-то не прав, хотя результат должен быть совершенно одинаков на обоих формах.
В чем проблема?
 
Я так подозреваю, что в подгружаемые процедуры и функции передается ближний указатель на объект, а должен передаваться дальний. Можно ли как-то на это влиять?  
Может я и ошибаюсь. Кто знает-подскажите.
 

Всего записей: 322 | Зарегистр. 18-10-2005 | Отправлено: 07:56 20-06-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Aladdinych
Попробовал сделать твой пример - работает, никакой абракадабры в лабле нету - пишет нормальное имя, адреса передаются полные безразлично в библиотеку или при вызове внутри программы (пробовал в Д10)
В пакете
Код:
procedure Proc_Show_Table(Database: TDatabase; Table: TTable);
var
  frm: TForm2;
begin
  frm := nil;
  try
    frm := TForm2.Create(nil);
    frm.Label1.Caption := Table.DatabaseName;
    frm.ShowModal;
  finally
    if frm <> nil then
      frm.Free;
  end;
end;

В программе
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  p: procedure(Database: TDatabase; Table: TTable);
  dll: Cardinal;
begin
  dll := LoadPackage('Package1.bpl');
  if dll > 0 then begin
    p := Pointer(GetProcAddress(dll, 'Proc_Show_Table'));
    if Assigned(p) then
      p(Database1, Table1)
    else
      ShowMessage(IntToStr(GetLastError));
 
    UnloadPackage(dll);
  end;
end;

Если что - стучись в ПМ, отправлю оба проекта целиком

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 09:42 20-06-2006 | Исправлено: RomanTim, 09:43 20-06-2006
RostY



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ramazan
EZH
 
Спасибо. Придется стирать при запуске программы.
 

Цитата:
В принципе, помница, их можно назначить создаваться в определенном каталоге...

Ты прав. Мну помнится, это делается примерно Session.PrivateDir:=...
 
Добавлено:
Тогда еще вопрос: можно ли в Ehlib'овом гриде отображать чекбоксы в футере ?

Всего записей: 387 | Зарегистр. 11-01-2006 | Отправлено: 11:39 20-06-2006
OOD

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите как вшить одну программу в другую через  
 
процедуру интегрирования в EXE-шник других файлов...
Вот процедура, но что-то не получается заставить её работать..
нужно вшить несколько других программ например calc.exe и *.dbf файлы чтобы всё было в одном экзе...  
 
Процедура:
 

Код:
 
 
procedure FileToPas(FileName: string);
var
  BF: file of Byte;
  F: TextFile;
  P, N, S: string;
  BFSize: integer;
  BBB: Byte;
begin
  AssignFile(BF, FileName);
  Reset(BF);
  BFSize := FileSize(BF);
  P := ExtractFilePath(FileName);
  N := ExtractFileName(FileName);
  N := ChangeFileExt(N, '.PAS');
  AssignFile(F, N);
  ReWrite(F);
  Writeln(F, '(* Generated by Master BRAIN (C) 2002 *)');
  Writeln(F, 'unit ' + ChangeFileExt(N, '') + ';');
  Writeln(F);
  Writeln(F, 'interface');
  Writeln(F);
  Writeln(F, 'const FileSize:integer=' + IntToStr(BFSize) + ';');
  Writeln(F, 'FileData:array[0..' + IntToStr(BFSize - 1) + '] of Byte=');
  Writeln(F, '(');
  while not Eof(BF) do
  begin
    S := '';
    while (not Eof(BF)) and (Length(S) < 80) do
    begin
      Read(BF, BBB);
      S := S + IntToStr(BBB) + ',';
    end;
    if Eof(BF) then
      Delete(S, Length(S), 1);
    Writeln(F, S);
  end;
  CloseFile(BF);
  Writeln(F, ');');
  Writeln(F);
  Writeln(F, 'procedure SaveToFile(FileName:String);');
  Writeln(F);
  Writeln(F, 'implementation');
  Writeln(F);
  Writeln(F, 'procedure SaveToFile(FileName:String);');
  Writeln(F, 'var F:File of Byte;');
  Writeln(F, ' i:integer;');
  Writeln(F, 'begin');
  Writeln(F, 'AssignFile(F,FileName);');
  Writeln(F, 'ReWrite(F);');
  Writeln(F, 'for i:=0 to FileSize-1 do Write(F,FileData[i]);');
  Writeln(F, 'CloseFile(F);');
  Writeln(F, 'end;');
  Writeln(F);
  Writeln(F, 'end.');
  CloseFile(F);
end;
 
 


Всего записей: 3378 | Зарегистр. 20-05-2006 | Отправлено: 22:02 20-06-2006
FireZone

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OOD
Цитата:
Вот процедура, но что-то не получается заставить её работать..  
А в чём, собственно, проблема? Лучше бы показал, как заставлял работать, чем приводить здесь чужой код.

Всего записей: 293 | Зарегистр. 28-01-2004 | Отправлено: 06:09 21-06-2006
Butcher



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Есть ли у кого опыт импортирования данных с html-страницы в Excel через QueryTables.Add()? Второй день бьюсь, ничего не получается.

Код:
 
var ExlWSheet: TExcelWorksheet;
    R: ExcelRange;
    AURL: string;
    AQueryTbl: ExcelQueryTable;
begin
    ...
    ExlWSheet.ConnectTo(ExlAppl.ActiveSheet as _Worksheet);
    R:= ExlWsheet.Range['A1', EmptyParam];
    AQueryTbl:= ExlWsheet.QueryTables.Add(AURL,R,EmptyParam);
 

При выполнении последней строки вылетает "OLE Error 800A03EC"

Всего записей: 41 | Зарегистр. 12-02-2003 | Отправлено: 08:54 21-06-2006 | Исправлено: Butcher, 08:55 21-06-2006
Aladdinych



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Где можно почитать, какие типы данных можно передавать в качестве параметров в процедуры и функции, вызываемые из dll, а какие нельзя? И зачем потребовался механизм обратных вызовов?
Уж очень мне хочется передать в нее указатель на объект TTable, а не получается. Я хочу из нее работать с открытым набором данных.

Всего записей: 322 | Зарегистр. 18-10-2005 | Отправлено: 11:46 21-06-2006
vserd

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aladdinych

Цитата:
И зачем потребовался механизм обратных вызовов?  

Для упрощения программирования некоторых задач.  
Например, тебе нужно определить список открытых окон в windows тогда ты передаешь в процедурину указатель  на свою функцию, и в ней заполняешь нужные контролы или выполняешь нужные действия. Без обратных вызовов тебе пришлось бы писать код перечисления снова и снова.

Всего записей: 2065 | Зарегистр. 08-05-2002 | Отправлено: 12:09 21-06-2006
FireZone

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aladdinych

Цитата:
какие типы данных можно передавать в качестве параметров в процедуры и функции, вызываемые из dll, а какие нельзя?

Нельзя передавать те, под которыми память выделяется и освобождается автоматически прозрачно для программиста. Например, в делфях это длинные строки. Это связано с тем, что dll имеет свой менеджер памяти, а программа свой. А память должна освобождаться тем менеджером, которым была выделена. В делфях обход этой проблемы сделан через модуль sharemem, который должен включаться в проект программы и проект dll. При этом и программа и dll начинают использовать общий внешний менеджер памяти, который располагается в библиотеке borlndmm.dll. В общем случае нельзя передавать и указатели на классы. Хотя бы потому, что эта dll уже не будет работать с программами, написанными на других языках.

Всего записей: 293 | Зарегистр. 28-01-2004 | Отправлено: 13:04 21-06-2006
Aladdinych



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А мне и надо использовать длл написанную на дельфи из программы написанной на дельфи. Только мне надо поместить часть функций в длл, чтобы расширять функции уже готового приложения.

Всего записей: 322 | Зарегистр. 18-10-2005 | Отправлено: 14:54 21-06-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Aladdinych
Ограничения накладываются не только на среду разработки, то есть Делфи, но и на версию VCL, так как в другой версии смещения полей и методов в классе могут поменяться. Поэтому в случае смены версии делфи тебе придется сразу пересобирать и приложение и все библиотеки расширения.
Делать конечно так можно, но на мой взгляд все-таки не правильно и в будущем чревато сложностями. Когда то сам себе такие грабли подложил (только у меня TForm передавался), а так как библиотек расширения стало довольно много и не все мои, то прилось реализовывать поддержу и старого и нового - через Handle - способа вызова.
Как можно извернуться при работе через BDE не знаю - не работаю с ней, но может кто другой подскажет каким образом можно передать в библиотеку параметры, с которыми надо открыть таблицу

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 16:14 21-06-2006 | Исправлено: RomanTim, 16:17 21-06-2006
Aladdinych



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужели никто не знает как можно передать в длл указатель на TTable. У меня все время Access violation!!!!!!!!

Всего записей: 322 | Зарегистр. 18-10-2005 | Отправлено: 17:09 21-06-2006
OXDBA

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aladdinych
Ну не надо Table передавать в DLL, поверь на слово.  
Если ты работаешь с IB(по твоим предыдущим постам вроде 6.5), то нужно в dll передавать IBDataBase.Handle, а датасеты держать в dll(кстати для IB Table это зло)

Всего записей: 426 | Зарегистр. 19-01-2005 | Отправлено: 17:50 21-06-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Aladdinych

Цитата:
Нужели никто не знает как можно передать в длл указатель на TTable. У меня все время Access violation!!!!!!!!

sharemem в проекты подключил? В каком хоть месте АВ происходит - посмотри отладчиком.

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 18:41 21-06-2006
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OOD
Посмотри здесь

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 21:30 21-06-2006
vadson6666



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim

Цитата:
так как библиотек расширения стало довольно много и не все мои, то прилось реализовывать поддержу и старого и нового - через Handle - способа вызова.  

Я не знаю как у вас, но мне потребовалось передавать адрес Connecton'a и AdoStoredProc в dll, т.к. у меня в библиотеке нету даже формы, а создавать коннекции к базе лишний раз...  
Кстати, а вот как заставить форму библиотеки открываться на том же телевизоре, где экзе (в случае мультимонитора)? Передачей адреса главной формы  в Длл все решается просто...Естественно, и библиотека и приложение на Delphi.

Всего записей: 267 | Зарегистр. 08-07-2004 | Отправлено: 07:26 22-06-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
vadson6666

Цитата:
Я не знаю как у вас, но мне потребовалось передавать адрес Connecton'a и AdoStoredProc в dll, т.к. у меня в библиотеке нету даже формы, а создавать коннекции к базе лишний раз...

У меня передается имя сервера и базы и создается лишний коннект, "так исторически сложилось" (на самом деле подобная архитектура придумана была еще до меня, а потом перешла "по наследству"). Сейчас если создается библиотека, которой нужна БД или у котрой более-менее сложный программный интерфейс - делаю через COM, через него Connection как через родную среду ходит без проблем (разве что по началу пришлось разобраться как стыковать имеющийся ADOшный COM-объект и новосоздаваемый TADOxxx)
 

Цитата:
Кстати, а вот как заставить форму библиотеки открываться на том же телевизоре, где экзе (в случае мультимонитора)? Передачей адреса главной формы  в Длл все решается просто...Естественно, и библиотека и приложение на Delphi.

По хэндлу можно получить координаты любого окна (например GetWindowPlacement). А с передачей указателей уже устал объяснять клиентам, что их суперокшко, котрое они сейчас на VB (VC...) как нарисуют... работать не будет в принципе, или что им надо срочно где-то брать Д10, так как мы на нее перешли и в новой версии их старые библиотеки вдруг перестанут работать.

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 07:57 22-06-2006
vadson6666



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim

Цитата:
По хэндлу можно получить координаты любого окна (например GetWindowPlacement).  

Полностью согласен, просто так "так исторически сложилось" у нас . А поводу клиентов, которые программируют под нас - у нас вообще другая политика...

Всего записей: 267 | Зарегистр. 08-07-2004 | Отправлено: 08:41 22-06-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
vadson6666
Так я и не призываю переделывать уже имеющиеся вещи - Aladdinych ведь начинает писать что-то новое, а в этом случае лучше сразу постараться избежать решений, которые потом мешать станут.

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 12:25 22-06-2006
31416

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Люди помогите!!! нужно получить доступ к interbas базе c помощью bde...не могу разобраться.. как это все связать?
 
Добавлено:
базу я создал с помощью ibconsole - она в файле base.gdb пытаюсь создать пседоним в bde administrator и не могу понять че куда там прописать...
 
Добавлено:
или можнт можно как нибудь без создания псевдониа - указать путь к файлу и что он interbase -  и затеми работать с ним с помощью tquery?
 
Добавлено:
усе я понял.... тока есчо вопрос как убрать чтобы не выскакивало логин \ пароль когда tquery активизируется т.е как нить это программно задать можно?

Всего записей: 172 | Зарегистр. 19-07-2005 | Отправлено: 21:39 22-06-2006
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2
ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru