Steuerelemente und Formular steuern



  • Was kann man eigentlich machen, um während einer Verarbeitung
    das Formular zu bewegen oder die Steuerelemente zu benutzen?

    Wenn ich zum Beispiel mit TIdHTTP eine Internetseite auslese, kann ich das Formular nicht mehr auf dem Bildschirm bewegen.

    Ich kann auch nicht mehr in den Memos scrollen.

    Was kann man machen?



  • Hallo

    allgemein must du nur während der Verarbung ab- und zu ein

    Application->ProcessMessages();
    

    machen. In einer eigen geschrieben Verarbeitung einfach einfügen. Bei externen Verarbeitung (wie dem TIdHTTP) kannst du entweder die Verarbeitung in ein extra Thread auslagern, oder in einem TTimer den ProcessMessages-Aufruf alle 200ms oder so ausrufen lassen.

    bis bald
    akari



  • Ich habs mit dem Timer ausprobiert,
    Alls 200ms.

    Ich kann trotzdem nichts bewegen:



  • Gibt es noch eine andere Möglichkeit?



  • Im Indy-Paket gibt's dafür extra TIdAntiFreeze.



  • akari schrieb:

    Bei externen Verarbeitung (wie dem TIdHTTP) kannst du entweder die Verarbeitung in ein extra Thread auslagern, oder in einem TTimer den ProcessMessages-Aufruf alle 200ms oder so ausrufen lassen.

    Ich habe jetzt beides ausprobiert.
    Nichts hält meine Anwendung vom einfrieren ab
    Der TIdHTTP mus ja auch im Thread sein Parent bekommen. Was soll ich ihm anderes als meine TForm1 anbieten?
    Und die steht dann wieder

    jansen schrieb:

    Im Indy-Paket gibt's dafür extra TIdAntiFreeze.

    Sollte ich mal versuchen.
    Habe hier im Forum aber schon von einigen Problemen damit gelesen.



  • Also dieses AntiFreeze funktioniert auch nur mangelhaft.

    Beim verschieben des Formulars stockert es immer nach rum.
    Ich habe jetzt alle drei in diesem Beitrag gemachten vorschläge gleichzeitig laufen.

    stocker, stocker, stocker...

    Gibts noch ne Idee?

    Ausserdem finde ich sowieso, dass TIdHTTP äusserst lahmarschig vor sich hin lädt.

    Da gehen WebBrowser plus iDispatch-Schnittstellen deutlich schneller



  • Jetzt ist es richtich schlimm geworden;

    Habe jetzt noch eine Art Stopuhr eingebaut, um zu demonstrieren, wieviel Zeit für die Ausleserei vergangen ist.

    Diese Stopuhr ist in einem Timer (interval 1000 ms)

    Und dieser interval wird immer um die Ladezeiten des TIdHTTP verlängert.

    Das diese Stopuhr 'ungenau' ist bleibt unausgesprochen.



  • Wie in der Dokumentation beschrieben ist TIdAntiFreeze keine Ideallösung, sondern sorgt lediglich dafür, dass überhaupt Benutzereingaben verarbeitet werden können.

    Das komplette Auslagern in einen eigenen Thread sollte das Problem aber lösen. Wenn das bei dir nicht funktioniert dann ist deine Umsetzung möglicherweise fehlerhaft. Vielleicht kannst du ja mal ein entsprechendes Beispielprojet bereitstellen.



  • Ich hatte das Thrad schon wieder rausgeschmissen.
    Jetzt aber noch einmal neu versucht.

    Thread Name = CSurf

    CSurf.h

    #ifndef CSurfH
    #define CSurfH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <HTTPApp.hpp>
    #include <IdBaseComponent.hpp>
    #include <IdComponent.hpp>
    #include <IdHTTP.hpp>
    #include <IdTCPClient.hpp>
    #include <IdTCPConnection.hpp>
    #include <IdAntiFreeze.hpp>
    #include <IdAntiFreezeBase.hpp>
    
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    //---------------------------------------------------------------------------
    class CSurf : public TThread
    {            
    private:
    protected:
    	void __fastcall Execute();
        TIdHTTP *IdHTTP1;
    public:
    	__fastcall CSurf(bool CreateSuspended, Classes::TComponent* formular);
        AnsiString URL;
        AnsiString quelle;
    };
    //---------------------------------------------------------------------------
    #endif
    

    CSurf.cpp

    #include <vcl.h>
    #pragma hdrstop
    
    #include "CSurf.h"
    #pragma package(smart_init)
    
    __fastcall CSurf::CSurf(bool CreateSuspended, Classes::TComponent* formular)
    	: TThread(CreateSuspended)
    {
        IdHTTP1 = new TIdHTTP(formular);
    }
    //---------------------------------------------------------------------------
    void __fastcall CSurf::Execute()
    {
    	quelle = IdHTTP1->Get(URL);
    }
    

    Form.h (enthält)

    CSurf *snapper;
    

    Form.cpp (enthält)

    snapper = new CSurf(true, this);
        snapper->URL = url;
        snapper->Resume();
        AnsiString quelle = snapper->quelle;
    

    Mein Frage ist, wie komme ich an den Quelltext, der in CSurf::quelle
    gespeichert sein sollte.


Anmelden zum Antworten