Autor Téma: PAL - Local objects with unprotected calls to Free  (Přečteno 562 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6141
  • Karma: 44
    • Verze Delphi: W10 + D11
PAL - Local objects with unprotected calls to Free
« kdy: 01-12-2021, 16:36:02 »
Skoro vždy sa jedná o takýto kód. Neviem čo tu vlastne môžem urobiť. Blok try... tu nemá význam. O ničom inom neviem.
Kód: Delphi [Vybrat]
  1. procedure TfrmBillingRest.actPrintExecute(Sender: TObject);
  2. var
  3.   oPrint: TPrintBase;
  4. begin
  5.   oPrint := TPrintBillingRest.Create;
  6.   FreeAndNil(oPrint);
  7. end;
« Poslední změna: 01-12-2021, 16:37:54 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.08
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3002
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:PAL - Local objects with unprotected calls to Free
« Odpověď #1 kdy: 01-12-2021, 16:51:38 »
podle mne jde o  try finally end

Kód: Delphi [Vybrat]
  1.   oPrint := TPrintBillingRest.Create;
  2.   try
  3.   finally
  4.   FreeAndNil(oPrint);
  5.   end;
  6.  
Embarcadero MVP - Czech republic

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6141
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:PAL - Local objects with unprotected calls to Free
« Odpověď #2 kdy: 01-12-2021, 16:57:13 »
Medzitým, aj teraz, som to vyskúšal. NIE je spokojný.
W10 64b, Delphi 10.4, FireBird 3.08
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6141
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:PAL - Local objects with unprotected calls to Free
« Odpověď #3 kdy: 01-12-2021, 18:22:51 »
Odpovedali, že v takom prípade by nemali upozorňovať.
W10 64b, Delphi 10.4, FireBird 3.08
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6141
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:PAL - Local objects with unprotected calls to Free
« Odpověď #4 kdy: 02-12-2021, 12:19:19 »
Tak mi prišlo na um či sa dá a je to čisté, aby sa objekt sám zničil.
Už podľa názvu je zrejmé, že jeho úlohou je zobraziť zostavu. Po uzatvorení zostavy končí - ničím ho. Môj kód by sa zminimalizoval na:
Kód: Delphi [Vybrat]
  1. TPrintBillingRest.Create;
W10 64b, Delphi 10.4, FireBird 3.08
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3002
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:PAL - Local objects with unprotected calls to Free
« Odpověď #5 kdy: 02-12-2021, 12:44:18 »
Tak mi prišlo na um či sa dá a je to čisté, aby sa objekt sám zničil.
Už podľa názvu je zrejmé, že jeho úlohou je zobraziť zostavu. Po uzatvorení zostavy končí - ničím ho. Môj kód by sa zminimalizoval na:
Kód: Delphi [Vybrat]
  1. TPrintBillingRest.Create;

Jo on ten Create NENI constructor? Tak si tam dej nejakou class metodu treba DoPrint; a v ni vytvor a proved akci a uvolni, s tim ze to budes volat jak pises.
Embarcadero MVP - Czech republic

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6141
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:PAL - Local objects with unprotected calls to Free
« Odpověď #6 kdy: 02-12-2021, 13:39:28 »
Samozrejme, že to je constructor! Jedná sa o triedu. Formulár zobrazí jej predok.
W10 64b, Delphi 10.4, FireBird 3.08
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3335
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:PAL - Local objects with unprotected calls to Free
« Odpověď #7 kdy: 02-12-2021, 14:06:19 »
Excellent
Rated 1 time
Samozrejme, že to je constructor! Jedná sa o triedu. Formulár zobrazí jej predok.
No ono to tak zrejme neni - to by se Radek neptal... V kazdem pripade je to nesrozumitelny a velmi pravdepodobne i necisty styl kodovani, pokud tam nemas nejake asynchronni vyfikundace a spoustis funkcionalitu rovnou z konstruktoru jeste pred jeho dobehnutim...


Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6141
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:PAL - Local objects with unprotected calls to Free
« Odpověď #8 kdy: 02-12-2021, 14:37:16 »
Rozumiem čo mi píšeš. Nestalo sa jediný raz, žeby to zlyhalo.
Samozrejme je to závislé na poradí. Vždy sa musí ukončiť kód pred. Kód predka
Kód: Delphi [Vybrat]
  1. constructor TPrintWithOption.Create(AjstPanel: TjstAdvPanel; APrintType: TPrintType);
  2. begin
  3.   if not Assigned(FQry) then
  4.   begin
  5.     FQry := TFDFunction.NewQry;
  6.     FQry.Transaction := TFDFunction.FbTransaction(ttReadOnly);
  7.     FTextAndParam := TTextAndParam.Create(AjstPanel, APrintType, FQry);
  8.   end;
  9. .
  10.   FGroupHeader := TObjectList<TfrxGroupHeader>.Create(False);
  11.   SQLText;
  12.   FTextAndParam.SetAllText;
  13.   CompleteText;
  14.   inherited;
  15.   GetfrxObject;
  16.   SetParams;
  17.   SetfrxObject;
  18.   ShowReport;
  19. end;
W10 64b, Delphi 10.4, FireBird 3.08
Expert na kladenie nejasne formulovaných otázok.

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 1293
  • Karma: 51
    • Verze Delphi: 10.3
Re:PAL - Local objects with unprotected calls to Free
« Odpověď #9 kdy: 02-12-2021, 15:41:38 »
Volání inherited by v constructoru mělo být na prvním místě, ne?
A dávat ShowReport apod. do constructoru se mi nelíbí ani trochu - tam se má object co nejrychleji a s co nejmenší možností chyb vytvořit, nic víc.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6141
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:PAL - Local objects with unprotected calls to Free
« Odpověď #10 kdy: 02-12-2021, 16:25:41 »
Volání inherited by v constructoru mělo být na prvním místě, ne?
A dávat ShowReport apod. do constructoru se mi nelíbí ani trochu - tam se má object co nejrychleji a s co nejmenší možností chyb vytvořit, nic víc.
Áno, inherited by malo byť na prvom mieste. Celkom bežne to tak nemám. Dôvod je, že najprv musia zbehnúť iné veci, aby bol inherited v predkovi úspešný. Zvyčajne AV. Tu uverejnený constructor mi dal v tomto smere poriadne zabrať.
Problematika ShowReport:

ShowReport je procedúra v predkovi. Je protected. Nie je problém ju zverejniť.
  • buď dám prednosť lenivosti. Kód je jednoduchší, kratší a nemusím myslieť na volanie ShowReport. Alebo
  • napíšem čistý/správny kód. Namiesto skrátenia kódu ho urobím dlhším :'(
Idem si hodiť mincou :D
W10 64b, Delphi 10.4, FireBird 3.08
Expert na kladenie nejasne formulovaných otázok.

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 1293
  • Karma: 51
    • Verze Delphi: 10.3
Re:PAL - Local objects with unprotected calls to Free
« Odpověď #11 kdy: 02-12-2021, 17:28:05 »
Excellent
Rated 1 time
Určitě je lepší psát správně, i kdyby kvůli tomu byl kód o pár řádků delší. Že je delší, ničemu nevadí, že je to šmodrchanec, u kterého nikdo cizí (a po měsíci možná ani autor) netuší, co se děje, je prostě problém.

Pokud do .Create dáš kde co, pak založíš potomka a ten má dělat něco jiného, tak to půjde hodně ztuha.

Přeci i volající kód bude mnohem čitelnější, když tam bude něco jako:

Kód: Delphi [Vybrat]
  1. oPrint := TPrintBillingRest.Create;
  2. try
  3.  oPrint.SetParams;
  4.  oPrint.PrepareReport;
  5.  oPrint.ShowReport;
  6.  // oPrint.ExportReporfToPdf;
  7. finally
  8.  FreeAndNil(oPrint);
  9. end;

než když máš jen:
Kód: Delphi [Vybrat]
  1. oPrint := TPrintBillingRest.Create;
  2. FreeAndNil(oPrint);
(to budí dojem, že je ten objekt vlastně k ničemu, když ho po vytvoření zase hned rušíš).

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6141
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:PAL - Local objects with unprotected calls to Free
« Odpověď #12 kdy: 02-12-2021, 17:38:43 »
Toho všetkého som si vedomý. V mojom prípade:
  • SetParams sa netýka zostavy ale FDQuery(ies). Tam je preň dobré miesto. Existuje len v uvedenej triede
  • PrepareReport je už v ShowReport. Nemyslím si, že je chyba ho ponechať skryté
Už ďalší potomkovia nebudú. Určite. Mincu som si nehodil, ale prepracujem to :-\
W10 64b, Delphi 10.4, FireBird 3.08
Expert na kladenie nejasne formulovaných otázok.

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 1293
  • Karma: 51
    • Verze Delphi: 10.3
Re:PAL - Local objects with unprotected calls to Free
« Odpověď #13 kdy: 02-12-2021, 17:41:21 »
Toho všetkého som si vedomý. V mojom prípade:
  • SetParams sa netýka zostavy ale FDQuery(ies). Tam je preň dobré miesto. Existuje len v uvedenej triede
  • PrepareReport je už v ShowReport. Nemyslím si, že je chyba ho ponechať skryté
Už ďalší potomkovia nebudú. Určite. Mincu som si nehodil, ale prepracujem to :-\

Moc podrobně jsem to nezkoumal, spíš jsem tím chtěl naznačit, že až bude potřeba tu sestavu třeba místo zobrazení rovnou uložit do PDF, tak aby se toho nemuselo moc předělávat.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6141
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:PAL - Local objects with unprotected calls to Free
« Odpověď #14 kdy: 02-12-2021, 17:47:37 »
Je to FastReport Professional a ten sa tieto konverzie postará sám (PDF, Word, Excel...). Čo sa týka princípu, tak máš pravdu. A o ten tu ide.
W10 64b, Delphi 10.4, FireBird 3.08
Expert na kladenie nejasne formulovaných otázok.