Announcement

Collapse
No announcement yet.

wie programmiere ich eine callbackfunktion mit delphi 2

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

  • wie programmiere ich eine callbackfunktion mit delphi 2

    tagchen,

    ich habe eine Datenbankanwendung mit zum teil großen tabellen.
    ich möchte während der suche die mit tquery bzw. sql statt findet
    eine callback-funktion programmieren damit der anwender sieht,
    wie lange die suche noch dauert!!! wie geht das???

    ciao

    markus lemcke
    Herzliche Grüße

    Markus Lemcke
    barrierefreies Webdesign

  • #2
    Hallo Markus,

    das folgende Beispiel einer <b>BDE-Callbackfunktion</b> stammt aus meinem Buch <i>Delphi 2 Datenbankentwicklung</i>. Wenn die Unit BDE eingebunden wird, stehen alle benötigten IDAPI-Funktionen und Konstanten zur Verfügung.

    BDE-Callback-Funktion: <br>
    Die universelle Callback-Funktion wird sowohl von der TQuery- als auch von der TBatchmove-Komponente verwendet. Nach dem Registrieren ruft die BDE während langandauernder Prozesse in einem Zeitsabstand von ca. 1 Sekunde diese Callback-Funktion auf. Im Beispielprogramm erhöht die Funktion den Anzeigewert der Balkenanzeige im Formular, und
    zeigt den Infotext der BDE an. Im mittleren Statusfeld wird so der Benutzer über die bereits abgearbeiteten Datensätze informiert.

    Beim Registrieren der Callback-Funktion wurde ein Zeiger auf »Self« (dieses Formular) mit übergeben. Die BDE übergibt dieses Zeiger auch an die Callback-Funktion, so daß hier von einer globalen Funktion aus ein Bezug auf das Formular elegant hergestellt werden kann.

    <pre>
    function BDECallBack(CBType : CBType;
    ClientData : LongInt;
    CBInfo : Pointer): CBRType; stdcall;
    begin
    //Rückgabewert setzen -> BDE soll weitermachen
    Result := CBRContinue;
    // Balkenanzeige hochzählen
    FormSQL.ProgressBarQuery.StepIt;
    // Anzahl der bearbeiteten Datensätze anzeigen
    with TFormSQL(ClientData) do
    FormSQL.StatBar1.Caption := CBProgressDone^.szMsg;
    // Formular soll sich neu zeichnen -> Anzeige aktualisieren
    FormSQL.Refresh
    end;
    </pre>

    Das SQL-Abfragefenster wird beim jedem Aufruf neu erzeugt, daher ist die Ereignisbehandlungsmethode auf das »OnCreate«-Ereignis genau der richtige Ort, um den Speicher für die benötigte IDAPI-Struktur anzufordern und die Callback-Funktion bei der BDE registrieren zu lassen. Damit die Callback-Funktion sowohl für die TQuery- als auch
    für die TBatchmove-Komponente verwendet wird, ist der erste Parameter für »DbiRegisterCallBack« ein nil-Zeiger.
    <pre>
    procedure TFormSQL.FormCreate(Sender: TObject);
    begin
    // Speicher für die verwendete IDAPI-Datenstruktur anfordern
    CBProgressDone := AllocMem(SizeOf(CBProgressDesc));
    // Callback-Funktion bei der BDE anmelden
    Check(DbiRegisterCallBack(nil, cbGenProgress,
    Longint(Self), SizeOf(CBProgressDesc), CBProgressDone,
    BDECallBack))
    end;
    </pre>
    Beim Zerstören des Fensters muß auch der angeforderte Speicher wieder freigegeben werden. Außerdem wird die Callback-Funktion bei der BDE wieder abgemeldet.
    <pre>
    procedure TFormSQL.FormDestroy(Sender: TObject);
    begin
    // Callback-Funktion wieder bei der BDE abmelden
    Check(DbiRegisterCallBack(nil, cbGenProgress,
    0, SizeOf(CBProgressDesc), CBProgressDone, nil));
    // allozierten Speicher wieder freigeben
    FreeMem(CBProgressDone, SizeOf(CBProgressDesc))
    end;
    </pre&gt

    Comment

    Working...
    X