private-bool-Variable wird falsch initialisiert



  • Verdammt, rhetorisch falsch geschrieben... los, Akari! 😉



  • Hallo

    Der [spelling]-Tag kann automatisch den einbezogenen Text in Bezug auf Rechtschreibung korrigieren... aber der ist noch im Beta-Status 😉

    bis bald
    akari



  • audacia schrieb:

    [...]Allerdings fehlt in deinem Call-Stack der Aufruf von TForm::DoShow - sicher, daß du den Breakpoint richtig gesetzt hast? [...]

    Entschuldigung, mein Fehler! Ich hatte den Call-Stack ermittelt, indem ich das Projekt gestartet und dann im BDS auf Pause geklickt habe... 🕶 Hier der Call-Stack mit TForm::OldCreateOrder auf true (Variablen aus Initialisiererliste des Konstruktors nicht initialisiert) und Haltepunkt an der 1. Anweisung in der TForm::FormShow()-Methode:

    Aufruf-Stack schrieb:

    :00401C11 TFormMain::FormShow(this=:00C3ED60, Sender=:00C3ED60)
    :0048B5A3 Forms::TCustomForm::DoShow(Self=:00C3ED60)
    :0049017D Forms::TCustomForm::CMShowingChanged(Self=:00C3ED60, Message=:0012FAD0)
    :004A5830 Controls::TControl::WndProc(Self=:00C3ED60, Message=:0012FAD0)
    :004AA53A Controls::TWinControl::WndProc(Self=:00C3ED60, Message=:0012FAD0)
    :0048C02A Forms::TCustomForm::WndProc(Self=:00C3ED60, Message=:0012FAD0)
    :004A53DD Controls::TControl::Perform(Self=:00C3ED60, Msg=45081, WParam=0, LParam=0)
    :004A9A69 Controls::TWinControl::UpdateShowing(Self=:00C3ED60)
    :004A9AF6 Controls::TWinControl::UpdateControlState(Self=:00C3ED60)
    :004AC926 Controls::TWinControl::CMVisibleChanged(Self=:00C3ED60, Message=:0012FD10)
    :004A5830 Controls::TControl::WndProc(Self=:00C3ED60, Message=:0012FD10)
    :004AA53A Controls::TWinControl::WndProc(Self=:00C3ED60, Message=:0012FD10)
    :0048C02A Forms::TCustomForm::WndProc(Self=:00C3ED60, Message=:0012FD10)
    :004A53DD Controls::TControl::Perform(Self=:00C3ED60, Msg=45067, WParam=1, LParam=0)
    :004A3939 Controls::TControl::SetVisible(Self=:00C3ED60, Value=true)
    :0048B91E Forms::TCustomForm::SetVisible(Self=:00C3ED60, Value=true)
    :0048ABE2 Forms::TCustomForm::DoCreate(Self=:00C3ED60)
    :0048A768 Forms::TCustomForm::Create(Self=:00C3ED60, AOwner=:00C64520, ...)
    :00401B90 Forms::TForm::TForm(this=:00C3ED60, AOwner=:00C64520)
    :00401A50 TFormMain::TFormMain(this=:00C3ED60, Owner=:00C64520)
    :00495373 Forms::TApplication::CreateForm(Self=:00C64520, InstanceClass=:0052F250, Reference=:00543880)
    :00401837 WinMain( =:00400000, =NULL, =:00141F19, =9)
    :00524b73 ; __startup

    Wenn ich das richtig sehe, kommt bei diesem Stack-Auszug das Show() vor dem Create()!?
    Wie gehen wir jetzt vor, um dem Problem weiter auf den Grund zu gehen?

    audacia schrieb:

    [...] zumal man in C++Builder OnCreate() und OnDestroy() ohnehin nicht benutzen sollte.

    Genau, das mache ich auch nicht; das habt ihr mir schon ganz zu Anfang beigebracht => 🙂 (klick' den Smilie)

    @_DocShoe_: Danke für die Erklärung. Solch' umständliche Schweinereien mache ich beim Programmieren (noch) nicht... Mir reichen weniger komplizierte Konstrukte, um mich selbst zu verwirren... 😉

    akari schrieb:

    Der [spelling]-Tag kann automatisch den einbezogenen Text in Bezug auf Rechtschreibung korrigieren... aber der ist noch im Beta-Status 😉

    [spelling]-Tag 😮 Erkennt der auch Dialekte? Die deutsche Sprache wird ja schließlich von vielerlei fiesen Mutationen heimgesucht... 🤡



  • Kolumbus schrieb:

    audacia schrieb:

    [...]Allerdings fehlt in deinem Call-Stack der Aufruf von TForm::DoShow - sicher, daß du den Breakpoint richtig gesetzt hast? [...]

    Entschuldigung, mein Fehler! Ich hatte den Call-Stack ermittelt, indem ich das Projekt gestartet und dann im BDS auf Pause geklickt habe... 🕶 Hier der Call-Stack mit TForm::OldCreateOrder auf true (Variablen aus Initialisiererliste des Konstruktors nicht initialisiert) und Haltepunkt an der 1. Anweisung in der TForm::FormShow()-Methode:

    Aufruf-Stack schrieb:

    :00401C11 TFormMain::FormShow(this=:00C3ED60, Sender=:00C3ED60)
    :0048B5A3 Forms::TCustomForm::DoShow(Self=:00C3ED60)
    :0049017D Forms::TCustomForm::CMShowingChanged(Self=:00C3ED60, Message=:0012FAD0)
    :004A5830 Controls::TControl::WndProc(Self=:00C3ED60, Message=:0012FAD0)
    :004AA53A Controls::TWinControl::WndProc(Self=:00C3ED60, Message=:0012FAD0)
    :0048C02A Forms::TCustomForm::WndProc(Self=:00C3ED60, Message=:0012FAD0)
    :004A53DD Controls::TControl::Perform(Self=:00C3ED60, Msg=45081, WParam=0, LParam=0)
    :004A9A69 Controls::TWinControl::UpdateShowing(Self=:00C3ED60)
    :004A9AF6 Controls::TWinControl::UpdateControlState(Self=:00C3ED60)
    :004AC926 Controls::TWinControl::CMVisibleChanged(Self=:00C3ED60, Message=:0012FD10)
    :004A5830 Controls::TControl::WndProc(Self=:00C3ED60, Message=:0012FD10)
    :004AA53A Controls::TWinControl::WndProc(Self=:00C3ED60, Message=:0012FD10)
    :0048C02A Forms::TCustomForm::WndProc(Self=:00C3ED60, Message=:0012FD10)
    :004A53DD Controls::TControl::Perform(Self=:00C3ED60, Msg=45067, WParam=1, LParam=0)
    :004A3939 Controls::TControl::SetVisible(Self=:00C3ED60, Value=true)
    :0048B91E Forms::TCustomForm::SetVisible(Self=:00C3ED60, Value=true)
    :0048ABE2 Forms::TCustomForm::DoCreate(Self=:00C3ED60)
    :0048A768 Forms::TCustomForm::Create(Self=:00C3ED60, AOwner=:00C64520, ...)
    :00401B90 Forms::TForm::TForm(this=:00C3ED60, AOwner=:00C64520)
    :00401A50 TFormMain::TFormMain(this=:00C3ED60, Owner=:00C64520)
    :00495373 Forms::TApplication::CreateForm(Self=:00C64520, InstanceClass=:0052F250, Reference=:00543880)
    :00401837 WinMain( =:00400000, =NULL, =:00141F19, =9)
    :00524b73 ; __startup

    Wenn ich das richtig sehe, kommt bei diesem Stack-Auszug das Show() vor dem Create()!?
    Wie gehen wir jetzt vor, um dem Problem weiter auf den Grund zu gehen?

    Offenbar wird der Aufruf von OnShow von TForm::DoCreate(), genauer gesagt von folgender Zeile in DoCreate() verursacht:

    if fsVisible in FFormState then Visible := True;
    

    Das fsVisible -Flag wird nur von TForm::SetVisible() gesetzt; das bedeutet vermutlich, daß irgendjemand vor der Konstruktion deines Formulares TForm::Visible auf true setzt oder TForm::Show() aufruft.

    Du könntest einen Haltepunkt in TCustomForm::SetVisible() in Forms.pas setzen und von dort aus den Call-Stack analysieren.


Anmelden zum Antworten