Announcement

Collapse
No announcement yet.

Lokale Variable geht kaputt

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Lokale Variable geht kaputt

    Hallo,<br>
    Die Aufgabe ist, eine Query-Komponente zu bauen, die sowohl den alten Zugriffsweg ueber die BDE als auch ADO und dbExpress unterstuetzt. Sinn ist es, einige alte Programme relativ einfach umstellen zu koennen.
    Beim Bau der Komponente, seltsames Problem gestossen:<br>
    Hier ein kleiner Ausschnitt aus der Klassendefinition:<pre>
    TMyQuery = class
    constructor Create(Owner: TComponent);
    destructor Free;
    private
    FOwner: TComponent;
    FRequestLive: Boolean;
    FParams: TEASParams;

    Test: Boolean; <---- siehe Beschreibung

    FQuery: TQuery;
    FADOQuery: TADOQuery;
    {...}

    </pre>
    Die Komponente stellt alle wichtigen Methoden und Eigenschaften des alten (BDE-) Queries zur Verfuegung und bastetlt diese dann entsprechend fuer ADO/dbExpress um. Das funktionierte auch schon ganz gut, bis ich in meine Testabfrage einen Parameter eingebaut habe. Dann war seltsamerweise mein lokales FQuery irgendwann mal kaputt! Durch einiges Rumprobieren bin ich dahintergekommen, dass das nicht passiert, wenn ich in der Deklaration davor eine beliebite Variable schreibe (hier Test). Wenn ich die Reihenfolge des lokalen FQuerys und des FADOQuery tausche, geht ADO nicht mehr, dafuer aber dann BDE.<br>
    Das sieht doch ganz danach aus, als ob FParams (steht unmittelbar davor) irgendwie die nachfolgende Variable ueberbuegelt. Das sind doch alles nur irengdwelche Pointer, die irgendwohin zeigen. Kann es sein, dass der Pointer von FParams zu kurz ist?!? Ich habe ja schon viele Klassen gebaut aber so ein Problem ist mir noch nie untergekommen. Auch meine Kollegen haben keinerlei Idee, woran das liegen kann. Ich konnte das Problem mit Delphi 7 und auch Delphi 5 gleichermassen nachvollziehen.

  • #2
    Hallo Thilo,<br>
    </pre><pre>
    <font face="Verdana" size="1" color="#080000">TMyQuery = class <br>
    private <br>
    FOwner: TComponent; <br>
    FRequestLive: Boolean; <br>
    FParams: TEASParams; <br>
    Test: Boolean; &lt;---- siehe Beschreibung <br>
    FQuery: TQuery; <br>
    FADOQuery: TADOQuery; <br>
    ...<br>
    <font face="Verdana" size="1" color="#0000FF"><b>public<br>
    constructor Create(Owner: TComponent); <br>
    destructor Destroy; override; </b></font><br>
    ...<br>
    </font></pre><br>
    Das einzge, was bei Dir sehr sonderbar aussieht ist die Poisiton vom constructor<br>
    und destructor. Diese beiden Methoden sind grundsätzlich public. Daher sollten sie <br>
    im public Abschnitt überschriben oder ertsetzt werden. Außerdem solltest Du nicht <br>
    die Methode Free, sondern die Methode Destroy überschreiben. Meine Änderungen<br>
    sind die fetten blauen.<br>
    <br>
    <br>
    <br&gt

    Comment


    • #3
      Hallo,

      was verbirgt sich hinter TEASParams und wie wird die Instanz von dem Teil erzeugt

      Comment


      • #4
        TEASParams ist ein Nachbau der Klasse TParams (Query.Params) vom alten BDE-Query. Ich will in meinen alten Programmen nichts aendern, also brauche ich eine Hilfsklasse, die die erforderlichen Methoden/Ereignisse vorgaukelt, sie aber fuer ADO/dbExtress intern ummodelt. Es wurden nur die Methoden ParameterByName() und Clear nachgebaut. Jede Instanz von MyQuery baut sich eine Instanz der Klasse TEASParams (FParams:= TEASParams.Create. Eigentlich nichts ungewoehnliches

        Comment


        • #5
          Ich habe die Position von constructor und destrucotr verschoben und statt Free dann Destroy ueberschrieben. Das Problem tritt dann nicht mehr auf. War vielleicht vorher nicht ganz sauber aber warum reagiert Delphi darauf so einem krassen Fehler

          Comment

          Working...
          X