Announcement

Collapse
No announcement yet.

Formatieren der Ausgaben einer Query-Abfrage

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

  • #16
    Noch etwas

    Ihr Beispiel:

    with TFormName.Create(Application) do
    begin
    ...
    end;
    ...

    Mich interessiert:<br>
    Wie wird hier die Instanz des Forms freigegeben ? Oder gibt es gar keine ?

    Helmu

    Comment


    • #17
      Info nach Test's:

      Das dynamische Erzeugen einer Query scheidet leider aus, da die Query während der Sichtbarkeit des DBGrids vorhanden sein muss, sonst hagelt es Fehlermeldungen.

      Da ich zwischendurch aus der Routine aussteigen muß, die Daten des Grids aber am Bildschirm stehen bleiben, muß ich alles mit einer statischen TQuery erledigen.

      Es ergeben sich somit 2 Probleme:

      a)<br>
      Ich muss mir merken, welche TField-Instanzen dynamisch erzeugt wurden (Speichern des Pointers in einem Pointer-Array ?), damit diese nachher freigegeben werden können

      var PArray[1..MaxPtr] of Integer;<br>
      ...<br>
      PArray[x] := Integer(@aField); // ??<br>
      ...<br>
      FreeAndNil( TField(PArray[x]) ); // ??

      oder

      for i := 0 to (FieldDefs.Count - 1) do<br>
      FieldDefs.Items[i].Clear; // ???

      oder

      Query beim Programmstart dynamisch erzeugen und erst bei Programmende wieder freigeben. Dadurch würde die VCL abräumen, aber die Query während der ganzen Programmlaufzeit aktiv sein. Hier müsste besonders Punkt b) berücksichtigt werden.<br>
      <br>

      b)<br>
      Ich muss bei wiederholtem Aufruf der Query verhindern, daß eine TField-Instanz für das gleiche Feld zweimal erzeugt wird, da sonst eine Fehlermeldung resultiert

      Abfrage ob Instanz für Feld existiert<br>
      if Not ?????????? then aField := Txxx.Create(Owner);

      Gruss<br>Helmu

      Comment


      • #18
        Hallo,

        warum so kompliziert? Wenn der Benutzer seinen SELECT-Text ändern, muss die TQuery-Instanz doch zuerst geschlossen, der SQL-Text neu zugewiesen und dann neu geöffnet werden. In diesem Fall kann man <b>nach</b> dem Schließen und <b>vor</b> dem Zuweisen des neuen SELECT-Textes die FieldDefs-Methode <b>Clear</b> aufrufen, um die TField-Instanzen abzuräumen.

        Für das Freigeben von dynamisch erst zur Laufzeit erzeugten Formularen setze ich generell die TForm-Methode <B>Release</b> ein, um sicherzustellen, dass auch wirklich alle anstehenden Windows-Botschaften korrekt verarbeitet wurden:
        <pre>
        uses Unit2;

        procedure TForm1.Button1Click(Sender: TObject);
        begin
        with TForm2.Create(nil) do
        begin
        ShowModal;
        Release;
        end;
        end;
        </pre>
        Der Vorteil von <i>with TForm2.Create(nil)</i> liegt nur darin, die Referenzvariable auf das Formular einzusparen

        Comment


        • #19
          Hallo, ich würde keine DBGrid -Komponente verwenden, sondern das Ergebnis in einer normalen Grid- Komponente speichern. So kann die TQuery öfters mit unterschiedlichen Ergebnismengen genutzt werden, ohne dass die erste Ergenismenge nicht mehr zur Verfügung steht.

          Grss
          Patric

          Comment

          Working...
          X