![]() |
BUG? - Boolean Variable wird willkürlich auf true gesetzt
Ausgangslage ist eine Klasse mit einem Boolean Wert XYZ.
Im Create wird diese noch einmal explizit auf FALSE gesetzt. Beim Debuggen wird der Breakpoint, wo XYZ auf true gesetzt wird, NICHT erreicht. Trotzdem hat die Variable an anderen Stellen im Code nervigerweise den Wert TRUE ?!! Kennt jemand dieses Verhalten und kann mehr darüber sagen? Thx, HeinzJ |
Re: BUG? - Boolean Variable wird willkürlich auf true gesetz
*räusper* Glaskugel ist im Urlaub.... *räusper*
Will sagen, ein wenig Code wäre nicht schlecht, da zumindest die Variablen meiner Klassen sich so verhalten, wie ich es gerne hätte... ;) |
Re: BUG? - Boolean Variable wird willkürlich auf true gesetz
Hallo,
mach aus der Variablen ein property, und setze einen Breakpoint auf die Set-Methode. Mögliche Ursachen wären: 1. der vorm Monitor ;) 2. Speicherüberschreibung Für 1., naja ;) Für 2. Memcheck oder fastmm4 benutzen. Ausserdem die Variable auf Änderungen überwachen. 2. geht nur zur Laufzeit. Setze einen Breakpoint auf deinen Konstruktor. Wird er angesprungen, Popup-Menü "Bei Änderung anhalten" für die Variable setzen. Das muss übrigens bei jedem Programm-Start neugemacht werden, weil die Adresse der Variable überwacht wird und die sich bei jedem Start ändert. Ich würde aber erst mal mit dem property anfangen. Heiko |
Re: BUG? - Boolean Variable wird willkürlich auf true gesetz
Glaskugel stimmt schon.
Hier der Abgespeckte Code zur veranschaulichung der oben beschriebenen Problematik.
Delphi-Quellcode:
unit Abgespeckt;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, DB, ADODB, Dialogs; AClass = class(TObject) protected FRelationList: TStringList; HasReadRelationListFromDB: Boolean; function GetiNumMembers: smallint; public constructor Create(X: array of const); property RelationList: TStringList read GetRelationList; property NumberOfMembers: smallint read GetiNumMembers; end; implementation constructor AClass.Create(X: array of const); // ************************************************* var key: string; begin inherited Create; HasReadRelationListFromDB := false; FRelationList := nil; end; function AClass.GetiNumMembers: smallint; // ............................................ begin MessageDlg(inttostr(RelationList.Count), mtInformation, [mbOK], 0); end; function AClass.GetRelationList: TStringList; begin if not HasReadRelationListFromDB then //<< Hier wird HasReadRelationListFromDB als true im Debugger angezeigt. begin HasReadRelationListFromDB := true; // << Diese Zeile wird nie erreicht FRelationList := TStringList.Create; // read someting from a db. end; Result := FRelationList; end; end. |
Re: BUG? - Boolean Variable wird willkürlich auf true gesetz
Hast du in den Constructor mal einen Breakpoint gesetzt um zu schauen, ob das Programm dort überhaupt vorbeikommt?
Und: Wie erstellst du die Klasse? |
Re: BUG? - Boolean Variable wird willkürlich auf true gesetz
Hallo,
du verschweigst uns aber den X Parameter. Ausserdem fehlt die Benutzung der Klasse. Wie ist denn der Wert genau am end des Konstruktors ? Heiko |
Re: BUG? - Boolean Variable wird willkürlich auf true gesetz
Der Constructor wird erreicht
X ist eine Array of const, momemtan nur ein Integer [1] Die Klasse wird per Obj:= AClass.Create([oid]); kreiert. Am Ende des Create hat HasReadRelationListFromDB den Wert FALSE. |
Re: BUG? - Boolean Variable wird willkürlich auf true gesetz
Hallo,
und jetzt müssten wir halt noch wissen, wo du Obj.RelationList benutzt. Und vor allem, was du sonst noch so im Code treibst ;) Probier doch mal das mit dem property/Breakpoint aus. Edit: Zitat:
Heiko |
Re: BUG? - Boolean Variable wird willkürlich auf true gesetz
Edit 2:
Doch, jetzt habe ich mich von mir selber austricksen lassen. funktioniert bei mir hervorragend:
Delphi-Quellcode:
type
TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; AClass = class(TObject) protected FRelationList: TStringList; HasReadRelationListFromDB: Boolean; function GetiNumMembers: smallint; function GetRelationList: TStringlist; public constructor Create(X: array of const); property RelationList: TStringList read GetRelationList; property NumberOfMembers: smallint read GetiNumMembers; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var c:AClass; begin c:=AClass.Create([1]); c.NumberOfMembers; end; constructor AClass.Create(X: array of const); // ************************************************* var key: string; begin inherited Create; HasReadRelationListFromDB := false; FRelationList := nil; end; function AClass.GetiNumMembers: smallint; // ............................................ begin MessageDlg(inttostr(RelationList.Count), mtInformation, [mbOK], 0); end; function AClass.GetRelationList: TStringList; begin if not HasReadRelationListFromDB then //<< Hier wird HasReadRelationListFromDB als true im Debugger angezeigt. begin HasReadRelationListFromDB := true; // << Diese Zeile wird nie erreicht FRelationList := TStringList.Create; // read someting from a db. end; Result := FRelationList; end; |
Re: BUG? - Boolean Variable wird willkürlich auf true gesetz
Hallo,
ich kann leider nicht erkennen, wo die Funktion GetiNumMembers zum Tragen kommt. Da wird MessageDlg aufgerufen und ich habe momentan auch das Problem, dass bei einigen Aufrufen der Dialog einfach übergangen wird. Könnte es evtl. das gleiche Problem sein? Gruß René |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:53 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