Hallo, ich habe eine Frage und bin grad ziemlich verwirrt, weil das Verhalten der IDE so gar nicht zu meinem Verständnis passt. Eines von beidem muss also korrigiert werden.
Ich habe den folgenden Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TFormMain.MnuShowLicensesClick(Sender: TObject); var grant: Boolean; store1, store2: TLicenseStore; begin if ( Sender = MnuGrantLicenses ) then begin grant := True; store1 := TLicenseStore.Create( LICENSE_PW ); store2 := TLicenseStore.Create( LICENSE_PW ); FormLicenseStore.store := TLicenseStore.Create( LICENSE_PW ); end else begin grant := False; FormLicenseStore.store := TLicenseStore.Instance; end; FormLicenseStore.allowGrant := grant; FormLicenseStore.allowFileOp := grant; FormLicenseStore.ShowModal; if ( grant ) then FormLicenseStore.store.Free; end; |
Die Variablen store1 und store2 sind nur zum spielen hinzugefügt. Die Idee ist, dass TLicenseStore über eine Singleton Implementierung eine Instanz zur Verfügung stellt. Quasi die Instanz mit der ich "im Allgemeinen" in der Applikation arbeite. Allerdings brauche ich - eben in dieser Funktion - doch mal für eine begrenzte Zeit eine unabhängige Instanz. Die erzeuge ich lokal, nutze sie und werf sie dann wieder weg - siehe Code. Soweit auch alles einfach und gut (theoretisch).
Jetzt komme ich während der Laufzeit aber zu dem angehängten Bild. Dort erkennt man, dass der allgemeine Sourceteil (grant=False) durchlaufen wird. Und obwohl die Instanziierung von store1 nie durchlaufen wurde (Nur dieser eine Aufruf der Funktion nach Programmstart!), zeigt store1 auf gültige Werte. Und auch noch auf die meiner im TLicenseStore gespeicherten Instanz... ???? Jemand eine Idee?
Noch schlimmer: wenn ich den anderen Teil der Funktion nutze, arbeitet store1 immer noch mit der Singleton und löscht diese Systemweite am Ende - nicht etwa die temporäre Instanz??? Grauenhaft und ich hab derzeit keinen blassen Schimmer?
Achja, hier noch ein Auszug aus TLicenseStore:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| TLicenseStore = class private class var pLicStore: TLicenseStore; licenses: array of TLicenseFile; password: String; zipMaster: TZipMaster19; function GetCount: Integer; function GetLicense( idx: Integer ): TLicenseFile; procedure AddLicense( lic: TLicenseFile ); public class function Instance( password: String ) : TLicenseStore; overload; class function Instance : TLicenseStore; overload;
constructor Create( password: String ); destructor Destroy; override; procedure Clear; procedure LoadLicenseFiles( folder: String ); procedure SaveLicenseFiles( folder: String ); function CheckPassword( password: String ): Boolean; procedure SaveLicenseFile( folder: String; idx: Integer ); function CreateRequest( serial, customer1, customer2, computerSpecification: String; deviceType: TDeviceType ): Integer; function FindSerial( serial: String ): Integer; function CheckAccess( serial: String; deviceType: TDeviceType ): Boolean; overload; function CheckAccess( serial: String; deviceType: TDeviceType; customer1: String ): Boolean; overload; procedure GrantLicense( serial: String; licType: TLicType; retirement: TDateTime; transferable: Boolean ); procedure GrantUnlimitedLicense( serial: String; transferable: Boolean ); procedure GrantUnlimitedTransferableLicense( serial: String ); property LicenseFile[ idx: Integer ]: TLicenseFile read GetLicense; default; property Count: Integer read GetCount; procedure Sort( column: TLicSort ); end; |
Danke,
Stephan
Add: Übrigens zeigt auch store2 auf EXAKT dieselbe Instanz soweit ich das erkennen kann...?
Add: Umbenennen der "Instance" Methoden bringt nichts.
Add: Aber: Wenn ich die pLicStore nicht als Klassenvariable sondern als globale Variable definiere, dann geht es???