Autor Téma: V jednom prípade mi aplikácia ukončuje s AV  (Přečteno 1891 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4506
  • Karma: 40
    • Verze Delphi: XE7 professional
V jednom prípade mi aplikácia ukončuje s AV
« kdy: 21-10-2019, 19:39:01 »
Vidím, že sa posúvam na vyššiu úroveň ;D Vyskakujú mi naozaj zaujímavé problémy. Opäť je to len v jednom prípade(tabuľke?).
Popis problému:
Dám edit/insert záznam. Zruším to, alebo zmeny uložím (okrem insert). Formulár sa uzatvorí bez problémov. Aplikácia s AV FastMM už nič nezachytí. AV vyskočí v:
Kód: Delphi [Vybrat]
  1. System
  2.  
  3.  
  4. procedure FinalizeUnits;
  5. var
  6.   Count: Integer;
  7.   Table: PUnitEntryTable;
  8.   P: Pointer;
  9. begin
  10.   if InitContext.InitTable = nil then
  11.     exit;
  12.   Count := InitContext.InitCount;
  13.   Table := InitContext.InitTable^.UnitInfo;
  14. {$IFDEF LINUX}
  15.   Inc(PByte(Table), InitContext.Module^.GOT);
  16. {$ENDIF}
  17.   try
  18.     while Count > 0 do  //  Tu


Pritom používam iba štandardný postup, ktorý je vlastne všade. Pre istotu som vymenil TFDTable. Bez zmeny.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4506
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:V jednom prípade mi aplikácia ukončuje s AV
« Odpověď #1 kdy: 21-10-2019, 20:06:50 »
Na tomto riadku
Kód: Delphi [Vybrat]
  1. Table := InitContext.InitTable^.UnitInfo;
pri nabehnutí myšou na InitTable mi vypíše jednotku, ktorú som v tomto prípade vôbec nepoužil.
Netuším či to je nejaká stopa.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2375
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:V jednom prípade mi aplikácia ukončuje s AV
« Odpověď #2 kdy: 21-10-2019, 21:32:51 »
Na tomto riadku
Kód: Delphi [Vybrat]
  1. Table := InitContext.InitTable^.UnitInfo;
pri nabehnutí myšou na InitTable mi vypíše jednotku, ktorú som v tomto prípade vôbec nepoužil.
Netuším či to je nejaká stopa.


FinalizeUnit provádí volání sekce finalization z použitých jednotek. Co je to za jednotku? Má sekci finalization ?
Embarcadero MVP - Czech republic

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4506
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:V jednom prípade mi aplikácia ukončuje s AV
« Odpověď #3 kdy: 21-10-2019, 21:41:42 »

Kód: Delphi [Vybrat]
  1. Co je to za jednotku?
To je jednotka k podformuláru. Mám to tak vo všetkých prípadoch. Mám tam definované triedy používané v podformulári. Aby boli formuláre a podformuláre čo najjednoduchšie.
Kód: Delphi [Vybrat]
  1. Má sekci finalization ?
Nemá. To nikde nepoužívam. Bolo mi tu vysvetlené, že sa initialization a finalization používajú v zvláštnych prípadoch. A to nie je môj prípad. Pre istotu som to okamžite skontroloval.
.
Nerozumiem ako môže vyvolanie Table.Edit vyvolať také správanie.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2375
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:V jednom prípade mi aplikácia ukončuje s AV
« Odpověď #4 kdy: 21-10-2019, 22:17:03 »

Nerozumiem ako môže vyvolanie Table.Edit vyvolať také správanie.

Jsi si jist, ze je to tim? Zkus ubirat a pak pridavat puvodni radky zda se to projevi. Zkus Table.Edit a Table.Post, zda se to projevi.
Embarcadero MVP - Czech republic

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4506
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:V jednom prípade mi aplikácia ukončuje s AV
« Odpověď #5 kdy: 22-10-2019, 08:26:52 »
Samozrejme, že si nie som istý. Ale nič iné nerobím. Či použijem Cancel alebo Post je jedno. To isté je aj pri Insert + Cancel. Post som neskúšal. Podľa by to bolo zbytočné.
Obsah jednotky uDepositCreate som skopíroval do PSPad-u a späť, aby som mal istotu, že to je čisté. Bez zmeny.
Citace
Zkus ubirat a pak pridavat puvodni radky zda se to projevi.
To myslíš ktoré?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4506
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:V jednom prípade mi aplikácia ukončuje s AV
« Odpověď #6 kdy: 22-10-2019, 08:55:13 »
V jednotke uDepositCreate som zakomentoval čo sa dalo. Problematických častiach ako sa dalo. V momente keď zavolám Table.Edit je problém.
Ešte včera som celú DB zálohoval (full) a obnovil. Do samotnej tabuľky sa mi dvakrát nechce púšťať. Viď príspevok nižšie.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4506
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:V jednom prípade mi aplikácia ukončuje s AV
« Odpověď #7 kdy: 22-10-2019, 09:16:08 »
Kód: Delphi [Vybrat]
  1. procedure TCustomDB.EditRecord;
  2. begin
  3.   FTable.Edit;
  4.   oGlobalVar.ChangeDBIsAllowed := True;
  5. .
  6.   if Assigned(oGlobalVar.ActualObject.Navigator) then
  7.     oGlobalVar.ActualObject.Navigator.ActiveChanged;
  8. end;
  9. .
  10. procedure TCustomDB.CancelRecord;
  11. begin
  12.   FTable.Cancel;
  13. .
  14.   if Assigned(oGlobalVar.ActualObject.Navigator) then
  15.     oGlobalVar.ActualObject.Navigator.ActiveChanged;
  16. end;
To je všetok kód, ktorý sa vykoná. Je to mimo volajúceho objektu, ktorý však obsahuje TCustomDB.
Tie bodky sú len kvôli formátovaniu. Bez nich mi tam nahodí dva prázdne riadky, čo ma serie.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2375
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:V jednom prípade mi aplikácia ukončuje s AV
« Odpověď #8 kdy: 22-10-2019, 09:43:44 »

  if Assigned(oGlobalVar.ActualObject.Navigator) then
    oGlobalVar.ActualObject.Navigator.ActiveChanged;
....

Á globalni promenne, pokud je zapoznamkujes tak co?
Embarcadero MVP - Czech republic

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4506
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:V jednom prípade mi aplikácia ukončuje s AV
« Odpověď #9 kdy: 22-10-2019, 09:52:32 »

Citace
Á globalni promenne, pokud je zapoznamkujes tak co?
Program prestane byť funkčný ;D  V tom chybu teda naozaj neočakávam.Tá citovaná funkcia je len nastavenie DBNavigator (Action.Enabled) a to je dobre. Teraz mi napadlo dať na formulár tlačidlo pre zrušenie editácie. Tak tú funkciu môžem. Vypnúť.
Vytiahol som staršiu verziu DB. Takže v DB problém nie je.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4506
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:V jednom prípade mi aplikácia ukončuje s AV
« Odpověď #10 kdy: 22-10-2019, 09:56:12 »
Tak si to trafil 8)  Predsa mám chybu v tom navigátore. A ako dlho ho už používam :o  Predpokladám tvrdý boj.
Ďakujem za nasmerovanie.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2375
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:V jednom prípade mi aplikácia ukončuje s AV
« Odpověď #11 kdy: 22-10-2019, 12:34:50 »
No ty delas  if Assigned(oGlobalVar.ActualObject.Navigator), ale
uz si nejsi jist ze oGlobalVar nebo oGlobalVar.ActualObject je spravne. Tipl bych to na problem s tim druhym, ze uz byl uvolnen, nebo je nil.

Zkusil jsi FastMM ve fulldebug mode? Viz muj  pres 8 let stary clanek / to to leti - https://delphi.cz/post/FastMM4-a-detekce-prepisu-pameti.aspx

Embarcadero MVP - Czech republic

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4506
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:V jednom prípade mi aplikácia ukončuje s AV
« Odpověď #12 kdy: 22-10-2019, 13:06:54 »
Totálne tomu nerozumiem. Mám nasledovné:
Kód: Delphi [Vybrat]
  1. procedure TfrmsubEntry.btnCancelClick(Sender: TObject);
  2. begin
  3.   oEntry.CancelRecord;  //  OK
  4. end;
  5. .
  6. procedure TfrmsubEntry.actCancelExecute(Sender: TObject);
  7. begin
  8.   oEntry.CancelRecord;  //  AV
  9. end;
Krokoval som to riadok po riadku. Samozrejme, že to je totožné.
Ja pre to nenachádzam žiadne vysvetlenie.
Citace
uz si nejsi jist ze oGlobalVar nebo oGlobalVar.ActualObject je spravne. Tipl bych to na problem s tim druhym, ze uz byl uvolnen, nebo je nil.
ActualObject je správny. Overoval som to. Objekty sa uvoľňujú jedine pri uzatvorení formulára. Pozriem sa na to. A to s editáciou nemá nič spoločné.
Citace
Zkusil jsi FastMM ve fulldebug mode?
Mám ho takto vždy!
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4506
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:V jednom prípade mi aplikácia ukončuje s AV
« Odpověď #13 kdy: 22-10-2019, 13:20:08 »
Objekty mám v zozname TObjectList<T>(owners True) a uvoľňujem ich pomocou Clear.
Robím tie isté akcie, spustí sa totožný kód a pri ukončení aplikácii je to raz OK druhýkrát AV :o :o ::) ::) ::)
Problém mám hlavne s tým, že nikde nevidím rozdiel v činnosti programu. Žiaden! Okrem miesta spustenia oEntry.CancelRecord.
Štve ma to a chce to vyriešiť >:( >:(
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4506
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:V jednom prípade mi aplikácia ukončuje s AV
« Odpověď #14 kdy: 22-10-2019, 13:51:10 »
Urobil som pokus
Kód: Delphi [Vybrat]
  1. procedure TfrmsubEntry.actCancelExecute(Sender: TObject);
  2. begin
  3. //  oEntry.CancelRecord;
  4. btnCancel.OnClick(btnCancel);
  5. end;
A mám AV. ActionManager som vymenil a všetky act... som najprv zrušil a vytvoril odznova.
Dá sa pri tom ešte niečo urobiť/zmeniť/vymeniť?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.