Announcement

Collapse
No announcement yet.

Paradox Table: im Grid nach unten scrollen = langsam

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

  • Paradox Table: im Grid nach unten scrollen = langsam

    Hallo,

    habe ein merkürdiges Problem.

    In meinem Programm wird eine TTable geöffnet und alle Datensätze im Grid angezeigt (ca. 20.000). Das Scrollen mit den Cursortasten dauert extrem langsam. Zeitmessung bei Operation "Table1.Next" ergibt ca. 860 ms.

    In Paradox kann man extrem schnell durch die gleiche Tabelle scrollen.

    Beim versuch, ein neues Projekt in Delphi anzulegen und nur diese eine Tabelle zu öffnen, ergibt der Wert für das Scrollen zum nächsten Datensatz
    ca. 2 ms.

    Woran kann das liegen? Habe den Quellcode soweit es geht durchforstet, aber keine Stellen finden können im Debug-Modus, die dafür verantwortlich scheinen.

    Bin ratlos und wäre für jeden Tip dankbar.

    Grüsse und allen einen schönen Feiertag,
    Carsten

  • #2
    Hallo Leute,

    Problem gelöst, ich hatte das Ereignis "OnFilterRecord" innerhalb der Table-Komponente gesetzt. Aber Vorsicht: Das alleinige Auskommentieren der Quellcodezeilen in diesem Ereignis nützt nichts.
    Das Scrollen bleibt weiterhin langsam bei großen Tabellen.

    Erst die vollständige Entfernung der Prozedur führt wieder zu einem deutlich schnelleren Scrolling.

    Doch warum ist dies so? Was spielt sich intern hinter der VCL-Komponente ab? Wie kann man so einem Fehler mit dem Debugger auf die Schliche kommen

    Comment


    • #3
      Intern werden solche Belegungen von OnFilterRecord meist so geprüft:<br>
      IF Assigned(FOnFilterRecord) THEN ...<br>
      Ist die Funktion also belegt, aber leer, wird der Then-Zweig trotzdem angelaufen. Unter Umständen ruft der natürlich nicht nur Deine leere Funktion auf, sondern macht (vielleicht zur Absicherung) noch viel drum herum, um z.B. das Filtern vorzubereiten...<br>
      Das würde das Verhalten erklären.<p>
      Schöne Grüße, Mario Noac
      Schöne Grüße, Mario

      Comment


      • #4
        Ja, das klingt einleuchtend und erklärt das langsame Verhalten bei leerer OnFilterRecord-Prozedur.

        Meiner Meinung nach ist dies aber ein kleiner Delphi-Bug, da ein guter Compiler diese leere Prozedur einfach wegoptimiert.

        In meinem konkreten Projekt sollte das Ereignis nämlich eigentlich nur bei rechtem Mausklick ausgelöst werden. Aufgrund der langsamen Geschwindigkeit werde ich wohl auf dieses Feature verzichten.

        Diese Absicherungsarbeiten innerhalb der THEN-Anweisung der IF-Assigned-Prüfung könnte eigentlich ein wenig anders aufgebaut werden von Borland oder sehe ich das falsch?

        Grüsse,
        Carste

        Comment


        • #5
          Hallo Carsten,<BR>
          du kannst zur Laufzeit das Filtern ein- und ausschalten, siehe Code:<BR>
          <BR>
          <PRE>
          procedure TForm1.PopFilterEinClick(Sender: TObject);
          begin
          Table1.OnFilterRecord := Table1FilterRecord;
          end;

          procedure TForm1.PopFilterAusClick(Sender: TObject);
          begin
          Table1.OnFilterRecord := nil;
          end;

          procedure TForm1.Table1FilterRecord(DataSet: TDataSet;
          var Accept: Boolean);
          begin
          FilterIrgendwas;
          end;
          </PRE>
          <BR>
          Gruß, Thomas Stac

          Comment

          Working...
          X