AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie herausfinden warum Interface nil ist?

Ein Thema von TurboMagic · begonnen am 22. Apr 2023 · letzter Beitrag vom 23. Apr 2023
Antwort Antwort
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.827 Beiträge
 
Delphi 12 Athens
 
#1

Wie herausfinden warum Interface nil ist?

  Alt 22. Apr 2023, 22:47
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.170 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wie herausfinden warum Interface nil ist?

  Alt 22. Apr 2023, 23:28
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")
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (22. Apr 2023 um 23:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.359 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Wie herausfinden warum Interface nil ist?

  Alt 22. Apr 2023, 23:32
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.827 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wie herausfinden warum Interface nil ist?

  Alt 23. Apr 2023, 08:38
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
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.468 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Wie herausfinden warum Interface nil ist?

  Alt 23. Apr 2023, 10:40
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.

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.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.359 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Wie herausfinden warum Interface nil ist?

  Alt 23. Apr 2023, 11:51
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz