Genial einfaches Tool zur Web Recherche - Smartclip

  • Hallo @Tuxedo !

    Mit der Notation habe ich noch so meine Schwierigkeiten

    Was ist daran so kompliziert ?
    Ich habe Dir in meinem Beitrag 18 (falls Du den gelesen hast) doch die gängigen Präfixe aufgelistet. Du denkst Dir 'sprechende' Variablennamen aus, und setzt das Präfix davor - Fertig. Falls Du es mal vergessen solltest, dann passiert ja nichts.

    MustDeclareVars verwende deahalb nicht mehr weil es mich schon öfters zum verzweifeln brachte

    Opt('MustDeclareVars', 1) würde ich aber wirklich empfehlen.
    Dazu bedarf es nur etwas Planung, also :
    - welche Variablen möchte ich global verwenden -> am Anfang des Skriptes Global deklarieren
    - welche Variablen brauche ich lediglich in der jeweiligen Funktion -> Local deklarieren

    Diese Planung hat auch den Vorteil, dass kein Wildwuchs bei den Variablen entsteht !

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Dieses Thema verschieb ich gerne auf später, ich arbeite im Moment an den wirklich wichtigen Problemen die mein Script noch hat,
    BugFix hat mir erfreulicherweise einiges an Problemstellen aufgezeigt die ich nun versuche zu beseitigen. Momentan bin ich dabei die Timer auszutauschen
    und dann kümmere ich mich um das grösste Problem mit dem ersetzen des send("^c") Befehls.

    Das tadellose Funktionieren des Tools ist mir nunmal wichtiger als unoptimale Variablenamen, Fehler seien es Logikfehler oder Errors
    sind für mich nun mal wichtiger als das Design.

  • Hallo @Musashi und @Tuxedo,

    Opt('MustDeclareVars', 1) würde ich aber wirklich empfehlen.
    Dazu bedarf es nur etwas Planung, also :
    - welche Variablen möchte ich global verwenden -> am Anfang des Skriptes Global deklarieren

    Als ich anfing, habe ich auch so gearbeitet, weil ich mir irgendwelche Videos angeschaut habe, in denen das so proklamiert wurde. Heute halte ich das für einen Fehler. Opt('MustDeclareVars', 1) halte ich persönlich für unnötig. Wer es aber zur Selbstdisziplinierung braucht, soll es ruhig nutzen.

    Für mich hat sich herausgestellt, dass man einfach immer versuchen sollte, alles so lokal wie möglich zu halten - sich also immer Gedanken machen sollte, was man wo mit einer Variable machen möchte. Dann sollte man die Variable genau da (oder direkt darüber) deklarieren, wo man sie initialisiert/braucht.

    Wenn man bei späteren Änderungen eine Variable löscht, hat man die Deklaration auch direkt im Blick. Der andere Weg führt für mich eher dazu, dass ungenutzte Variablen deklariert werden. (Am Ende sind das aber natürlich alles persönliche Vorlieben).

    MustDeclareVars verwende deahalb nicht mehr weil es mich schon öfters zum verzweifeln brachte, dafür achte ich sehr gut auf mögliche Fehler,da wäre mal eine UDF angebracht die einfach alle gefunden Variablen selbstständig im Scriptkopf Global oder in der Funktion als Lokale Variablen erstellen würde, aber das ist für mich noch zu viel des guten eine UDF zu erstellen, die sollte frei von Fehlern sein.

    Das wird sicher nicht kommen. Kann auch nicht klappen. Wenn du lokal einen Variablennamen verwenden möchtest, den du schon global benutzt, wie soll irgendein Skript wissen, dass du hier aber nicht der globalen Variable einen neuen Wert zuweisen möchtest, sondern eine neue lokale Variable einführen willst oder umgekehrt? Das ginge nur, wenn du das Deklarieren und das Initialisieren - also die Wertzuweisung - strikt trennen würdest. Wenn eine Variable oder mehrere Variablen ohne Zuweisung in einer Zeile stünden, könnte es natürliche einen Gültigkeitsbereich ausmachen und die Zeile ergänzen.
    Wer aber diese Disziplin an den Tag legt, braucht sicher nicht so einen fehleranfälligen Kram ;)

    Die Notation stellst du dir scheinbar ziemlich schwierig vor. Fang einfach mal langsam damit an. Sich wenigstens halbwegs an Konventionen zu halten hat Vorteile. Das hilft dir mit gewissem Abstand selbst, dich wieder in deinem Skript zurecht zu finden, wenn du nach Monaten etwas ändern willst. Es hilft aber auch anderen Programmierern, die sich deinen Code ansehen sollen, wenn du mal Probleme hast. Gerade bei fremden Code hilft es, schnell zu verstehen, was der Programmierer hier wollte bzw. womit er arbeiten wollte.
    Das ist jetzt aber keine Aufforderung, das in diesem Skript nachträglich zu implementieren. Ich wollte es (wie alle anderen bisher auch) nur anmerken ;) .

    Folgendes habe ich aus dem Post von BugFix. Ich habe es nicht getestet und labere vielleicht Quatsch. Warte mal auf Widerspruch von anderen:

    Ich bin mir nicht sicher evtl. ist das Problemgenau das Send("^c") , ich weiß nur, daß die Funktion "Kopieren" Probleme hat wenn ich die nachfolgende Sleep(100) entferne. Ob das mit dem Send-Befehl zusammenhängt weiß ich nicht. Aber wenn die Sleep(100) fehlt, kopiert mir das Script keine Bilder mehr sondern nur der Link landet dann im Clipboard.

    Die Wartepause ist notwendig. Die Erfahrung habe ich auch schon gemacht, als ich mir mal einen Clipboard-Manager schreiben wollte. Ich weiß, deine Zwischenablage ist nicht leer sondern der Link erscheint, statt dem Bild. Mir hat aber dennoch geholfen eine Schleife statt einem festen Sleep zu nehmen (weil sich die notwendige Zeit unterscheiden kann.

    Spoiler anzeigen

    Aber das Drücken der Control-Taste während des Link Kopierens sollte die Funktion BildCopy aufrufen,
    aber ohne Sleep(100) wird stattdessen in die Funktion Kopieren gesprungen(ich verstehe einfach nicht warum).

    Ich glaube hier liegt eine falsche Klammersetzung vor. Du hast die komplette Abfrage umklammert. Ich denke du musst die <> Abfrage von der der Not-Abfrage abkapseln, da das zum Fehler führt.
    Also If (ClipGet() <> "") And Not _IsPressed("11", $hUser32) Then F_LinkCopy().
    Allerdings wäre es wohl klarer, wenn du die Bedingungen etwas trennen würdest (BugFix hatte das auch ähnlich angemerkt). Zusammen mit der Folgezeile könnte das so aussehen:

    Spoiler anzeigen
    AutoIt
    If ClipGet() <> "" Then
    	If _IsPressed("11", $hUser32) Then
    		F_BildCopy()
    	Else
    		F_LinkCopy()
    	EndIf
    EndIf

    PS: Wie geschrieben. Das habe ich einfach mal nach Codeansicht geschrieben. Ich bin hier aber definitiv nicht die hellste Leuchte. Daher fordere ich Wachsamkeit von allen Lesern ^^

    Grüße autoiter

  • Vorab @Tuxedo !
    Dieser Beitrag richtet sich weniger an Dich. Du hast klar zum Ausdruck gebracht, dass die Themen 'Notation' und 'Deklaration' für Dich z.Zt. keine Priorität haben. Das respektiere ich selbstverständlich, und werde dazu keine weiteren Kommentare mehr abliefern.

    Wenn ihr schon die Variabledeklaration anprangert dann lasst mich doch wissen was genau euch daran nicht gefällt.

    Eigentlich war nur diese Bitte von Dir der Grund, warum ich das so ausführlich beschrieben habe. Na ja, vielleicht kannst Du das später noch mal gebrauchen ^^ .

    @autoiter !

    Als ich anfing, habe ich auch so gearbeitet, weil ich mir irgendwelche Videos angeschaut habe, in denen das so proklamiert wurde. Heute halte ich das für einen Fehler. Opt('MustDeclareVars', 1) halte ich persönlich für unnötig. Wer es aber zur Selbstdisziplinierung braucht, soll es ruhig nutzen.

    Das darf natürlich jeder so sehen, wie er möchte. Die Nutzung von 'MustDeclareVars' als Zeichen von fehlender Selbstdisziplin zu werten, würde ich, bei größeren Skripten, aber nicht unterschreiben.
    Interessanterweise hat auch @BugFix in seinen Skriptkommentaren 'MustDeclareVars' vorgeschlagen, und wer würde es wagen, @BugFix fehlende Disziplin zu unterstellen :D .

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Ich denke du musst die <> Abfrage von der der Not-Abfrage abkapseln, da das zum Fehler führt.
    Also If (ClipGet() <> "") And Not _IsPressed("11", $hUser32) Then F_LinkCopy().

    Nein musst du nicht, die <, >, <=, >=, =, == haben eine höhere Präferenz und werden dem And vorgezogen. Du kannst hier die Klammern komplett weglassen.
    Das Not hingegen hat eine höhere Präferenz und sollte bei einigen Abfragen ausgeklammert werden.

    Beispiel: Not 5 = 2 ==> 0 = 2 ==> False Not (5 = 2) ==> Not False ==> True

  • Ich brauche dringend eure Mithilfe, ich habe eine Experimentalversion in der die meisten Tipps von BugFix umgesetzt sind und vor allem
    Der Teil der BugFix Kopfschmerzen beschert hat konnte ich ausbügeln, aber um dann keine Timingprobleme beim Betätigen von CTRL+c zu bekommen
    müsste ich die BildCopy mit der Shift-Taste statt mit der CTRL-Taste auslösen.

    Wäre das eurer Meinung nach ein gangbarer Weg?? ?(
    Falls ja, wäre die Qualität von Smartclip um einiges besser. :D

  • Ich habe sowieso Bauchschmerzen damit, dass du die Änderungen der Zwischenablage über Tastenkombinationen abgreifst.
    Es gibt alternativ die Möglichkeit auf Event-Ebene zu arbeiten. Heißt: Windows sagt deinem Skript Bescheid wenn sich an der Zwischenablage was ändert.
    Genau dafür gibt es ja auch die in AutoIt mitgelieferte Clipboard-UDF.
    Schau dir am besten mal das Beispiel in der AutoIt-Hilfe zu _WinAPI_AddClipboardFormatListener an (eventuell musst du dort noch die erste _WinAPI_GetVersion-Abfrage entfernen)

  • Hallo @AspirinJunkie,

    Ich wollte auch mal so etwas ähnliches machen und wollte dazu auch die Clipboard UDF verwenden. Jedoch habe ich nicht geschnallt, wie man etwa mit Bildern umgeht und unterscheidet, dass es sich nicht etwa um eine kopierte Pfadangabe sondern tatsächlich um eine Bilddatei handelt. Weißt du das?

    Grüße autoiter

  • Ich wollte auch mal so etwas ähnliches machen und wollte dazu auch die Clipboard UDF verwenden. Jedoch habe ich nicht geschnallt, wie man etwa mit Bildern umgeht und unterscheidet, dass es sich nicht etwa um eine kopierte Pfadangabe sondern tatsächlich um eine Bilddatei handelt.

    Du schaust einfach was drinne steht, wenn du einen String hast, dann ist es doch der Pfad. Sollte eine Bitmap drinne gespeichert sein, so ist es ein Bild.

  • Ja AspirinJunkie hier sind leider einige Klimmzüge notwendig die einem aber eher von Autoit aufgezwungen werden, Das Cipboard greife ich doch
    gar nicht mit den Tastenkombination ab(ich verwende einfach die Windows-Funktionen fürs kopieren und einfügen).
    Aber ich werde mir deinen Tipp mal ansehen ob ich was damit anfangen kann.

    Mein momntan grösstes oder besser unlösbares Problem ist aber der Umstand, daß ich nicht mit der CTRL-Taste die Bilder kopieren kann,
    weil dann eben immer die BildCopy Funktion angesprungen wird obwohl ich nur einen Tesxt kopieren will, aber über den Umweg mit der Shift Taste geht es.

    Und zu deiner Frage autoiter sieh dir die Funktionen F_BildCopy und F_Einfuegen genauer an. Der Teil mit der Unterscheidung ob Bild oder nicht findet in der Funktion F_Einfuegen statt. Ich sehe mir die ersten paar Bytes des gespeicherte Clips an.

    Einmal editiert, zuletzt von Tuxedo (22. Juli 2017 um 17:47)

  • Irgendiwe ist der letzte Post von mitr anscheinend verschwunden.

    Ich fragte ob jemand von den Downloadern hier noch ein Exemplar eines Script-Archiv's von Smartclip hat das eine Version zwischen 1.68 und 1.62 hat und es mir hier upoaden würde, da ich mein Script richtig übel verhundst habe, obwohl ich meine Scripte auch in einem Backp-Ordner hatte.

    Alles ist voll mit nur den neueren verhundsten Versionen.
    Ansonsten musste ich ganz von vorne beginnen, noch wären die Ideen fürs verbessern vorhanden und es ginge nicht ewig bis ich wieder ein gutes Script
    zur Verfügung stellen kann.

    Also bitte helft mir.
    Tuxedo

  • Hallo @Tuxedo !

    Ich habe noch mal in meinem Downloadordner nachgesehen.
    Anbei die von Dir geposteten Originalversionen Smartclip_1.68.zip und Multi-Clip_v1.68.zip.

    In Zukunft daran denken : Man braucht 3 Dinge - Freunde, Gesundheit und Sicherheitskopien ;) .

    Gruß Musashi

  • Erstmal einen herzlichen Dank an @Musashi für den ReUpload der Script-Datei, dank seines Uploads kann ich wieder von vorne
    beginnen mit den Optimierungen. Folgendes möchte ich verwirklichen:

    #1: Das Script wird mit einer Funktion weniger auskommen
    #2: Ausserdem sollte es mir gelingen die Probleme mit den Timings loszuwerden(sorgen fälschlicherweise für eine BildCopy
    wenn man nur Text oder Link kopieren will), was wohl die meiste Zeit brauchen wird. .
    #3: Ebenso sollte es in der Endversion möglich sein Smartclip entweder nur per Tastatur oder nur per Maus oder einer
    Mischvatriante aus Beidem zu steuern.
    Reine Maussteuerung fällt flach, da viele Textverarbeitungen den Caret-Cursor nicht mit der Maus positionieren können und deshalb
    ohnehin nicht ohne Tastatur bedient werden können.
    #4: Desweiteren sollte es mir möglich sein auf beinahe alle Timer zu verzichten(Ausnahme - F_Einfuegen)
    #5: Auch sollte eine Bildcopy ohne Zusatztaste(wie CTRL oder SHIFT) möglich sein.
    #6: Und die Signalisierung der Pause wird sich auch ändern(der Mausverfolgende Tooltip ist auf Dauer etwas lästig)
    #7: Die Meldungen von Smartclip werden großteils per Mausbewegung oder einem Tastendruck ausgeblendet.
    EDIT:
    #8: Jetzt braucht es den letzten Einfügeversuch nicht mehr, der Reset kommt nach dem letzten eingefügten Clip automatisch.
    #9: Ausserdem geht die Clip-Nummerierung jetzt nicht mehr von z.B. 0-19 sondern 1-20, Reine benutzer kommen damit sicher besser zurecht.

    Es sind nur och 4 Punkte offen, der Rest ist schon eingebaut und läuft, etwas Zeit zum Testen brauche ich noch, ich denke bist spätestens einer Woche lade ich die neu Version hoch.

    Was ich wohl nicht einbauen werde mangels Kenntnissen ist der Tipp von BugFix mit dem Ersetzen der HotKeys mit Accelerators,
    da dafür wohl eine akives und im Focus stehendes GUI gebraucht wird und ich habe kein GUI und sowas wie ein Phantom GUI würde wohl
    auch nur stören. Wenn ich z.B. aus dem Browser was kopieren möchte muss ja das Browserfenster(oder ein anderes Fenster) im Focus stehen.
    Allerdings kann ich eventuell auf den CTRL+c Hotkey verzichten.

    Das wird einige Zeit dauern bis ich das alles verwirklichen kann, aber es wird kommen.
    Einige Dinge davon hatte ich schon am Laufen und weiss deshalb, daß deren Umsetzung möglich ist wenn ich es auch diesesmal
    besser machen muß und den Zeitpunkt nicht verpassen darf mit der Optimierung aufzuhören.


    @Musashi dein Tipp zur Zukunft ist sehr gut, leider wird man dabei öfters mal schlampig und denkt man kommt ohne Sicherung aus,
    weil man ja genau weiss was man tut, denkste es kommt eben immer mal wieder anders als man denkt. Das Script ist gesichert.

    Grüsse von Tuxedo

    2 Mal editiert, zuletzt von Tuxedo (26. Juli 2017 um 06:53) aus folgendem Grund: Ergänzungen

  • Aufgrund eines Wunsches von einem Smartclip-User bin ich gezwungen zu einer Frage an die Profis hier.
    Weiß jemand von Euch ob es eine einfache Möglichkeit gibt eine Kleine Grafik max 32x32 Pixel an einen Cursor
    zu binden oder wahlweise einfach den momentan aktiven Cursor temporär einzufärben ohne an den Cursoreinstellungen des Systems was zu verändern.

    Ich hoffe mich verständlich ausgedrückt zu haben und freue mich auf hilfreiche Antworten
    Tuxedo

  • Weiß jemand von Euch ob es eine einfache Möglichkeit gibt eine Kleine Grafik max 32x32 Pixel an einen Cursor
    zu binden

    So etwa?