Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Wie herausfinden warum Interface nil ist? (https://www.delphipraxis.net/212911-wie-herausfinden-warum-interface-nil-ist.html)

TurboMagic 22. Apr 2023 23:47

Wie herausfinden warum Interface nil ist?
 
Hallo,

gegeben eine D11.3 Anwendung.
Eine Klasse hat eine Report Drucken Methode, diese bekommt ein Interface übergeben
aus dem bestimmte Daten auf den Report gedruckt werden sollen.

Der Report wird mittels FastReports VCL Embacadero Edition erzeugt.
Es gibt ein Ereignis, welches von FastReports aufgerufen wird um an die darzustellenden
Daten zu kommen:

Delphi-Quellcode:
procedure TReportPrinting.CreateReceipt(Data: IMyDataReadOnly);
begin
  FData      := Data;

// Rest ausgeblendet
end;


procedure TReportPrinting.OnGetValue(const VarName: string;
                                     var Value: Variant);
begin
  if CompareText(VarName, 'ReportDate') = 0 then
    Value := DateToStr(FData.OrderDate) + ' - ' + TimeToStr(FData.OrderDate);
end;
Was kann dazu führen, dass FData im CreateReceipt noch brav zugewiesen ist und
dessen Count Methode dem Debugger z. B. 2 liefert, was in dem Testlauf korrekt war,
im OnGetValue aber nil ist? Alle Aufrufe die zwischendurch erfolgten hab' ich
durchgesteppt und da war FData immer zugewiesen und Count blieb 2.

Das OnGetValue wird von irgendwo innerhalb FastReports aufgerufen wenn ich
Report.PrepareReport(true); aufrufe. Das ist in der EMBT Edition natürlich eine
Blackbox.

Grüße
TurboMagic

himitsu 23. Apr 2023 00:28

AW: Wie herausfinden warum Interface nil ist?
 
Eine Interface-Variable ist immer Nil, wenn du oder wer Anderes da Nil zugewiesen hat, bzw. wenn noch nie etwas zugewiesen wurde.


Ausnahme sind WeakReferenzen, die von alleine NIL werden, wenn wo anders die letzte Variable Nil oder gelöscht wurde.



Wenn Data.RefCount im CreateReceipt-BEGIN 0 war, dann wäre es in dessen END freigegeben worden.
Passiert eventuell, wenn man ein Interface falsch erzeugt, bzw. das erzeugte "Objekt" direkt als Parameter übergab.

Aber wenn es nach dem FData:= mindestens 2 war, dann würde es eigentlich stimmen.

Und dürfte hier auch nie passieren, also das RefCount 0 zu Beginn, da der Parameter kein CONST ist. (ich weiß nicht, warum Viele unbedingt drauf bestehen und mich zwingen wollen dort CONST machen zu müssen ... Referenzzählung ist nicht soooooo langsam und verhindert einige "Bugs")

jaenicke 23. Apr 2023 00:32

AW: Wie herausfinden warum Interface nil ist?
 
Warum setzt du in CreateReceipt nicht einfach nach der Zuweisung einen Datenhaltepunkt auf FData und schaust nach, wann dieses Feld geändert wird? Da dieses in deinem Code liegt, kann der Code von FastReport ja damit nichts zu tun haben.

Eine zweite Instanz von TReportPrinting kann da nicht im Spiel sein? Dann müsstest du noch Self vergleichen.

TurboMagic 23. Apr 2023 09:38

AW: Wie herausfinden warum Interface nil ist?
 
Hallo,

danke für die Tipps, hat sich aber schon erledigt.
Das ist eine Anwendung wo in der DPR auch diverse Änderungen nötig wurden und
beim Hinzufügen neuer Units hat die IDE mal wieder Code angefasst, der nicht
anzufassen wäre. Dadurch wurde das Hauptformular 2x erzeugt, was diverse Probleme
verursachte.

Ich wünschte die IDE würde mal endlich lernen die Finger vom Hauptprogramm zu
lassen wenn die hinzugefügten units keine Forms sind und man könnte sich auch eine
Einstellung "Zusätzliche Forms nicht automatisch erzeugen" wünschen, die da auch zu
berücksichtigen wäre.

Grüße
TurboMagic

dummzeuch 23. Apr 2023 11:40

AW: Wie herausfinden warum Interface nil ist?
 
Zitat:

Zitat von TurboMagic (Beitrag 1521407)
Ich wünschte die IDE würde mal endlich lernen die Finger vom Hauptprogramm zu
lassen wenn die hinzugefügten units keine Forms sind

Die Wahrscheinlichkeit, dass Delphi irgendwann mal dahingehend geändert wird, ist verschwindend gering.

Vielleicht sollten Delphi Entwickler mal lernen, ihre Finger von der DPR-Datei zu lassen und von dort höchstens den Code in einer Unit aufzurufen.

Zitat:

Zitat von TurboMagic (Beitrag 1521407)
man könnte sich auch eine Einstellung "Zusätzliche Forms nicht automatisch erzeugen" wünschen, die da auch zu berücksichtigen wäre.

Es gibt doch die Einstellung für "Form auto create". Default ist On, aber man kann das einfach unter Tools -> Options -> "Form Designer" -> "Module creation options" -> "Auto create forms & data modules" abschalten. Dann wird nur noch die erste Form des Projekts automatisch erzeugt. Diese Einstellung gibt es schon seit mindestens Delphi 6.

jaenicke 23. Apr 2023 12:51

AW: Wie herausfinden warum Interface nil ist?
 
Zitat:

Zitat von TurboMagic (Beitrag 1521407)
Ich wünschte die IDE würde mal endlich lernen die Finger vom Hauptprogramm zu
lassen

Ich deklariere einfach eine eigene Variable und weise dieser Application zu. Danach mache ich alles mit dieser Variablen, z.B. App.Run. Dadurch fasst die IDE den Quelltext nicht mehr an, egal wie das eingestellt ist, weil der Parser die Stelle nicht findet, wo etwas gemacht werden kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz