๐Ÿš€ go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #268053

DLL i FB

#268053
From: kamil
Date: Thu, 14 Jul 2005 09:38
103 lines
3093 bytes
Witam,

mam w DLL forme, ktora robi cos tam na bazie (FB). wszystko jest ok, az do 
chwili kiedy "pusty update" ktory stwierdza zajetosc wybranego rekordu nie 
wywali bledu "lock conflikt on nowait transaction", czyli w chwili kiedy chce 
edytowac rekord, ktory juz jest edytowany. oczywiscie wszystko jest obudowane 
w try/except wiec program wyswietla komunikat ze nie mozna edytowac rekordu, 
ale przy probie zamkniecia okna (tego wywolywanego z dll) program glowny sie 
zawiesza na instrukcji freelibrary, dodam ze jesli "lock conflikt" nie wystapi 
 to dll daje sie zwolnic bez problemu.

troche kodu(wersja uproszczona na potrzeby zadania pytania, ale problem 
wystepuje ten sam):

wywolanie formy z DLL:

 tdll_frm = function :boolean; stdcall;
var
  LibHandle: THandle;
  ShowForm: Tdll_frm;
begin
 LibHandle := LoadLibrary('project2.DLL');
  try
    @ShowForm := GetProcAddress(LibHandle, 'ShowForm');
       if not (@ShowForm = nil) then
          ShowForm;
      except
  showmessage('z bledem');
  FreeLibrary(Libhandle);
      end;

 try
FreeLibrary(Libhandle);
except
  showmessage('blad');

a oto exportowana funkcja z dll:

function ShowForm:boolean; stdCall;
var DLLForm : Tform1;

begin





  DLLForm:=Tform1.Create(nil);

  try
      DLLForm.ShowModal;
    Result:=true;
    if Result then begin

    end;
  finally
   DLLForm.Free;
  end;
end;

exports showform;

a na formie jest button ktory robi:


procedure TForm1.Button2Click(Sender: TObject);
begin
ibsql1.Transaction.StartTransaction;
ibsql1.ParamByName('id_kontrahent').Value:=strtoint(edit1.text);
try
ibsql1.ExecQuery
except
 showmessage('error');
 end;
ibsql1.Transaction.Rollback;
end;

forma zawiera button1 i same kontroli od bazy, czyli:

IBTransaction1 z ustawieniami:
concurrency
nowait


IBDatabase1 i
IBTransaction1 z zapytaniem: 


update kontrahent set nazwa=nazwa
 where 
id_kontrahent=:id_kontrahent;

jako :id_kontrahent podstawiam wartosc identyfikatora rekordu.
dla testu raz zajmuje go przez inny program, wtedy program sie wiesza a innym 
razem, gdy rekord nie jest zblokowany i ibsql1.exec wykona sie poprawnie 
program pozwala zamknac okno bez problemu.

dzieki za pomoc
pozdrawiam
Kamil

-- 
Wysล‚ano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Technical Details
Message-ID: <db5bqd$162$1@inews.gazeta.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
From: "kamil" <kielon.SKASUJ@gazeta.pl>
Newsgroups: pl.comp.lang.delphi
Subject: DLL i FB
Date: Thu, 14 Jul 2005 09:38:21 +0000 (UTC)
Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
Lines: 103
Message-ID: <db5bqd$162$1@inews.gazeta.pl>
NNTP-Posting-Host: aib254.internetdsl.tpnet.pl
X-Trace: inews.gazeta.pl 1121333901 1218 172.20.26.237 (14 Jul 2005 09:38:21 GMT)
X-Complaints-To: usenet@agora.pl
NNTP-Posting-Date: Thu, 14 Jul 2005 09:38:21 +0000 (UTC)
X-User: kielon
X-Forwarded-For: 172.20.6.62
X-Remote-IP: aib254.internetdsl.tpnet.pl
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit