Program és adatbázis bezárása.
2006-02-02T09:20:55+01:00
2006-02-02T13:11:44+01:00
2022-07-24T17:01:21+02:00
kardosi
Sziasztok!

Lenne egy "apró" problémám!
Van egy program, aminél azt szeretném elérni, hogy amikor a felhasználó a számítógép kikapcsolását, vagy a számítógép újraindítását választja, akkor ez a program zárja be az általa használt adatbázist!
A programom Firebird adatbázishoz kapcsolódik!

A gond "csak" annyi, hogy ha fut a program (kapcsolódva van a Firebird adatbázishoz) és a felhasználó pl. a számítógép újraindítását választja, akkor ugyebár a windows üzenetet küld a futó programoknak, megkérve őket, hogy zárjanak be! Igenám, de ekkor az én programomig ez a kérés el sem jut, mert megelőzi őt a Firebird, dob egy üzenetet, hogy "x connection active ...", amit vagy "leOKéz" az ember és ekkor újraindul a gép, vagy azt mondja: Mégsem, ekkor pedg nincs újraindítás!

Amit el szeretnék érni, hogy ekkor valahogy "megelőzni" a Furebirdöt, bezárni az én programom által használt adatbázist és szabad utat engedni a gép kikapcsolásának, vagy újraindításának!

Ehhez kérnék segítséget tőletek!
Mutasd a teljes hozzászólást!
Ne OnCloseQuery-t nézd, hanem a WM_QUERYENDSESSION-T
Mutasd a teljes hozzászólást!

  • Nem tudom, hogy meg tudod-e előzni a tűzmadarat, de a programodban le kell kezelned a form "onclosequery" eseményét.
    Ez hívodik meg amikor bezárod, vagy bezáródik az alkalmazásod. Ezt használják egyes programok arra, hogy megkérdezzék kilépés előtt, hogy elmetsenek-e valamit.
    Itt kell elbúcsuznod a kedves jószágtól.
    Mutasd a teljes hozzászólást!
  • Közben utána néztem, a rendszer becsukásakor, a windows először a felhasznélói programokat zárja be, és a szervizeket csak azután, tehát a programod előbb kapja meg az üzenetet mint a marár, ezért működnie kell a dolognak!
    Mutasd a teljes hozzászólást!
  • Ezt használom:

    procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
    if Sender <> nil then begin
    if Application.MessageBox('Kilép a vezérlés programból ?', 'Megerősítés...', MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) = mrYes then begin
    CanClose := True; end
    else begin
    CanClose := False;
    end; end
    else begin
    CloseDatabase;
    CanClose := True;
    end;
    end;

    Ha a "sender" nem nil, akkor a "kilépés kérése" a windowstól jött, egyébként a felhasználó szándékszik kilépni!

    De a gond ott van, hogy ha kapcsolatban van a program a Firebird adatbázisával, akkor az én programom OnCloseQuery eseményéig el sem jut, mert megelőzi a FireBird szerver és "megakasztja" az egészet!!!
    Mutasd a teljes hozzászólást!
  • Ne OnCloseQuery-t nézd, hanem a WM_QUERYENDSESSION-T
    Mutasd a teljes hozzászólást!
  • Szia Ivn és B_Janos!

    Nos, a FireBird 1.5.2-öt uninstalláltam és telepítettem helyette az 1.5.3.4870 verziót SERVICEként!
    A kilipéskori adatbázisbezárást pedig a WM_QUERYENDSESSIONBA (is) beletettem; működik a dolog!!!!

    De, be kell valljam őszintén, nálam is volt egy kis gond: A Firebird 1.5.2. PROGRAMKÉNT (!!!!) futott, ugye így pedig már máshogy fest a dolog egy kicsit. Ez utóbbi esetben a Firebird MINDÍG MEGELŐZTE az én programomat és a windows kérése el sem jutott a WM_QUERYENDSESSIONig...

    Azért Ivn-é a pont, mert a BIZTONSÁGOS leválás a szerverről (adatbázis bezárása) ott végezhető el, ahol ő javasolta!

    Most így néz ki a program:

    procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
    if Sender <> nil then begin
    if Application.MessageBox('Kilép a vezérlés programból ?', 'Megerősítés...', MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) = mrYes then begin
    CloseDatabase;
    CanClose := True; end
    else begin
    CanClose := False;
    end; end
    else begin
    CloseDatabase;
    CanClose := True;
    end;
    end;


    procedure TFormMain.WMQueryEndSession(var Message: TMessage);
    begin
    CloseDatabase;
    Message.Result := 1;
    end;


    procedure TFormMain.CloseDatabase;
    begin
    if DMa.TrDB.InTransaction then DMa.TrDB.Commit;
    if DMa.DB.Connected then DMa.DB.Close;
    if DMa.TrMeresDB.InTransaction then DMa.TrMeresDB.Commit;
    if DMa.DBMeres.Connected then DMa.DBMeres.Close;
    end;

    Még annyit kell kiagyalni, hogy mi legyen a ilyen esetben a le nem zárt tranzakciókkal? (Most Commit van, de azt hiszem el lesz "rollback"-elve...)

    Köszi az eddigi segítséget srácok!

    Jelenleg az én programom "programként" fut, de -még egy kérdés-, mi van ha az általam írt programot is service-ként akarom futtatni?
    Mutasd a teljes hozzászólást!
  • mi van ha az általam írt programot is service-ként akarom futtatni?


    Szolgáltatásoknál megadhatod, hogy mi függ mitől.
    Mutasd a teljes hozzászólást!
abcd