![]() |
Delphi-Version: XE
Inline + For-In + Exit + Packages = *peng*
Ich hatte jetzt mal einen total netten Fehler.
Der sorgte dafür, daß das Programm gleich total verreckte (Windows-Memdung > Programm reagiert nicht), da das Programm sich mit Exceptions in einer Schleife selber lahmlegte.
Vielleicht kennt ja bereits jemand dieses/soein Problem? Ich muß mal sehn, wann ich Zeit finde das in einem kleinen Testprojekt nachzustellen. Das sind die Sorte von Fehlern, wo man tagelang verzweifelt danach sucht. :wall: Das Setting:
Delphi-Quellcode:
und in einem anderen Runtimeepackage dann
type
TCacheDefinitionCollectionItem = class(TCollectionItem) public property LookupSource: TQueryClass read GetLookupSource; published property LookupName: string read FLookupName write SetLookupName; end; TCacheDefinitionCollection = class(TCollection) end; TCacheDefinition = class(TComponent) strict private FDefinition: TCacheDefinitionCollection; public function GetSource(LookupName: string): TQueryClass; inline; end; function TCacheDefinition.GetSource(LookupName: string): TQueryClass; var X: TCollectionItem; CI: TCacheDefinitionCollectionItem absolute X; begin for {CI}X in FDefinition do if AnsiSameText(CI.LookupName, LookupName) then Exit(CI.LookupSource); Result := nil; end; function TSysDB.CacheLookup(LookupName, KeyFields: string; KeyValues: array of Variant; ResultField: string): Variant; var Q: TPgQuery; begin Q := CacheDefinition.GetSource(LookupName); Assert(Assigned(Q), 'TSysDB.CacheLookup(' + LookupName + ') nicht gefunden'); Result := Q.Lookup(KeyFields, VarArrayOf(KeyValues), ResultField); end;
Delphi-Quellcode:
Der CacheLockup-Aufruf selber schien erstmal zu funktionieren, aber beim
procedure EinTFieldOnChangeEvent(Sender: TField);
begin if InEdit then // State in [dsEdit, dsIntert] AnderesField.Value := SysDB.CacheLookup('Laender', 'l_iso', Self.Value, 'lang_land'); end;
Delphi-Quellcode:
knallte es dann (zu 99%)
AnderesField.Value :=
und im Debugger konnte man dann sogar fleißig F9 drücken ... der Debugger blieb in der Zeile
Delphi-Quellcode:
) hängen und warf immer wieder eine Zugriffsverletzung bei ... (meisten eine ganz hoche Adresse, oberhalb der 2 GB des 32-Bit-Prozesses)
AnderesField.Value:=
Inline hat über BPL-Grenzen ja bekanntlich eigentlich keine Wirkung und würde demnach ignoriert, aber dennoch führte es zum Totalversagen. Ich weiß aber noch nicht, ob es auch in aktuellen Delphis so schön knallt.
Delphi-Quellcode:
stört nicht ... kann man problemlos gegen manuelle Casts ersetzen.
absolute
Das zusammengesetzte Exit ist auch egal und kann man problemlos gegen
Delphi-Quellcode:
ersetzen.
Result:=...; exit;
Es scheint nur am For-In mit Exit in einer Inlinefunktion zu hängen, welches aus einem anderem Package aufgerufen wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 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-2025 by Thomas Breitkreuz