Problem mit dem Edit-Control

  • Hallo,

    ich habe da ein Problem mit einem Edit-Control.

    Ich habe eine GUI mit einem Edit-Control und einem Label, das zuerst versteckt ist und erst nach einem Klick auf einen Button angezeigt wird.

    Dieses Label erscheint dann über dem Edit-Control. Das ganz funktioniert auch soweit, nur erscheinen in dem Label immer zwei horizontale Linien, die genau dem oberen und unteren Rand des Edit-Controls entsprechen. Gelegentlich erscheinen nach dem Klick auf den Button keine Linien im Label, aber spätestens wenn man mit dem Cursor über das Label fährt, sind die Linien wieder da.

    Einzig hilft das das verstecken des Edit-Controls, denn nur dann sind auch diese Linien weg.

    Ich habe hier mal ein kleines Script angefügt um das Problem nachvollziehen zu können.

    Hoffentlich kann man mit dem Anhang auch etwas anfangen, den mit diesem Forum scheint wohl etwas nicht so ganz zu stimmen,
    denn jedesmahl wenn ich ein Code einfügen will, sind alle Einrückungen weg.

    MfG:
    BigRox

  • Hi BigRox 👋 ,

    kannst du bitte nochmal genau beschreiben, wie das erwartete Verhalten sein soll und was du danach machen willst?
    Denn vielleicht gibt es andere Wege deine Zielsetzung zu bewältigen.

    Viele Grüße
    Sven

  • Moin,

    hier (Win 10 - AutoIt 3.3.16.1) zeigt sich exakt das beschriebene Verhalten:

    Beim ersten Klick auf den Button bleiben die Ränder des Edits als weiße Linien im Label sichtbar. Wenn ich das Edit vorher disable, braucht es ein Sleep() von mindestens 140 ms, damit die Ränder nicht mehr durchschlagen. Für mich läuft da etwas mit stark angezogener Handbremse.

  • Die folgenden zwei Zeilen bringen eine Änderung, die ich glaube von dir BigRox gewünscht ist. Doch das weißt du am besten 😅 ?

    • GUICtrlSetState($idBtn_Anzeigen, $GUI_FOCUS) nach dem Button erstellen
    • GUICtrlSetState($idEdiText, $GUI_DISABLE) beim Klick auf Button

    Danach wird das Edit Control nicht immer wieder in den Fokus gebracht.

    Viele Grüße
    Sven

  • Hallo SOLVE-SMART,
    das endgültige Script soll eine Wörtersuche werden.
    Dazu wird zuerst ein GUI mit einem Edit-Control und einem Button zum Starten der Suche angezeigt. Nachdem man den Suchbegriff in das Edit-Control eingegeben hat, klickt man auf den Suche starten-Button. Da die Suche einige Zeit dauern kann, erscheint während dem Suchvorgang ein Wartehinweis der über dem Edit-Control angezeigt werden soll. Wenn die Suche abgeschlossen ist, soll diese Wartehinweis wieder ausgeblendet werden und das Ergebnis der Suche im Edit-Control erscheinen.
    Das mit der Suche klappt auch einwandfrei, nur die Linien im Wartehinweis stören mich.

    Daher habe ich alles was man nicht unbedingt braucht aus dem Script, was ich hier gepostet habe, entfernt, damit das Problem besser sichtbar wird.

    Entweder gibt es da eine spezielle Einstellung oder es handelt sich um einen generellen Fehler von AutoIt.
    Der Wartehinweis hat nämlich nur diese störenden Linien wenn er über einem Edit-Control erscheinen soll und das einzige was anscheinend hilft ist das Edit-Control vorm Anzeigen des Wartehinweis ausblenden und erst wenn der Wartehinweis ausgeblendet ist wieder einblenden.
    Mich würde aber schon interessieren woher dieses Problem eigentlich kommt.

    Übrigens:
    Wie hast du das mit der Code-Anzeige hier im Forum geschafft, das ging bei mir nämlich einfach nicht.
    Oder zeigt die Vorschau etwas anderes an?

    MfG:
    BigRox


    Edit: da waren wohl einige schneller beim schreiben wie ich.

    Einmal editiert, zuletzt von BigRox (5. Februar 2024 um 17:23)

  • Ich hab mal rumprobiert und konnte leider keinen Style,... finden, der das aendern koennte...

    Ich vermute, die Balken sind initial da, weil das Event, mit dem der Fokus vom Edit genommen wird nach dem aktuellen "button klick event" (Case $idBtn_Anzeigen) ausgefuehrt wird und das fenster da schon neugezeichnet wird und danach erst der Fokus vom Edit genommen wird.

    Ich konnte es loesen, indem ich das Edit disable ($GUI_DISABLE) und das ganze aus der aktuellen event loop rausnehme mit "AdlibRegister". Ich hoffe, das ist fuer dich eine akzeptable Loesung...

  • Velted ja es scheint ein Zeitverhalten Problem zu sein, also manchmal ist ein Delay nötig manchmal nicht und an sich scheint es ein Bug in AutoIt an sich zu sein. Hatte mal kurz im englischen Forum gesucht und ähnliche Fragestellungen gefunden, allerdings alles alte Threads - keine Ahnung ob es bereits gefixed sein soll oder nicht 🤔 ?

    BigRox also falls dies wirklich ein AutoIt Bug sein sollte, könntest du bspw. für dein Szenario SplashTextOn() und SplashOff() benutzen. Dann musst du gar nicht auf der GUI herumzeichnen 😅 . Ansonsten gibt es auch fertige "Spinner" (loading indicator) im englischen Forum und wahrscheinlich auch hier, die du einbinden kannst. Denn der Experte (einer der Experten, aber der Erste der mir sofort dazu einfällt) UEZ ist auch hier im Forum vertreten und hat mich Sicherheit so'n Spinner parat 🤞 .

    Viele Grüße
    Sven

    Update: Kanashius das ist eine schöne Lösung 👍 .

  • ich vermute, nur weil das Control innerhalb von AutoIt das flag "DISABLED" erhält, ist der Befehl dazu im Windows noch lange nicht durch.

    Ob das jetzt ein WinAPI Aufruf oder ein DLL-Call ist kann ich nicht sagen, aber der benötigt sicher auch seine Zeit um "zu wirken".

    Das Verhalten, dass man den "realen" Status mit GuiCtrlGetStatus nicht auslesen kann, sondern immer nur den, den Autoit intern kennt,
    mag an der "Wrapper-Architektur" liegen. Da werden die Befehle erstmal an den Wrapper von Autoit geschickt, der wiederrum schickt dass dann via DllCall an Windows und das setzt den Befehl dann um. Für AutoIt ist das nach 1 ms erledigt, aber für Windows dauert der Prozess einfach etwas länger.

    Ich finde in AutoIt kann man solche "Probleme" ganz gut umschiffen, indem man in seiner grafischen Architektur darauf achtet, dass COntrols sich nicht überlappen. Das gab schon von je her Probleme. Ich denke dass das auch aufgrund der Verzögerungen in der Abarbeitung begründet liegt. ;)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Kanashius,

    auch mit dem AdlibRegister()läuft das hier nur dann stabil, wenn der time Parameter mit dem Defaultwert (250 ms) arbeitet oder auf mindestens 200 ms gesetzt wird. Im Jahre 2024 ist das für einen normalen Computer eine kleine Ewigkeit. Ich kann mir das nicht erklären und gehe mal von einem Bug aus.

  • PS: AdLibRegister hat einen Default von 250ms.
    Damit erzeugt man im Besten Fall auch nur eine Pause, die das Control braucht um real deaktiviert zu sein ;)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Auf der Suche nach 'künstlichen' Verzögerungen bin ich vorhin auf Folgendes gestoßen:

    Zitat

    Opt WinWaitDelay

    Alters how long a script should briefly pause after a successful window-related operation.
    Time in milliseconds to pause (default=250).

    Das ist doch wohl auch nicht mehr ernst gemeint. Oder arbeiten mit AutoIt nur Menschen, deren Rechner ständig am Anschlag laufen?

  • das waren nur meine 50cent zu dem Thema.
    Ich möchte anderen nicht die Befähigung nehmen es besser zu wissen.

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Hallo,
    vielen Dank an alle die zu diesem Thema etwas geschrieben haben:thumbup:.

    Ich habe es jetzt mit den Befehlen SplashText(On) und SplashText(Off) gelöst und es funktioniert bestens.

    MfG:
    BigRox