Ich weiß es leider nicht.
Beiträge von autoiter
-
-
Hallo Sonderbaar
häufig wird VeraCrypt empfohlen.
-
Hallo fakeraol
erst einmal muss ich eingestehen, dass ich überhaupt kein Speicherexperte bin.
Ich sehe jetzt auf den ersten Blick nicht den Grund für ein Speicherleck in diesem Ausschnitt einer der Funktionen in deinem Programm...
Allerdings lässt dieser Irrtum darauf schließen, dass noch mehr im Argen liegen könnte:
Um den Speicherverbrauch bei tagelanger Laufzeit zu reduzieren, habe ich schon alle Variablen global deklariert, so daß eigentlich nach dem Start kein weiterer Speicher mehr benötigt werden sollte.
Global und Local betreffen den Gültigkeitsbereich einer Variable. Es macht wenig Sinn Global innerhalb einer Funktion zu deklarieren. Und es bedeutet auch nicht, dass sie nur einmal erstellt werden! Wenn du die Funktion wiederholt aufrufst, werden die Variablen erneut deklariert und bestehen neben den schon deklarierten Variablen (da ist es ein Problem, dass du dich für globale Variablen entschieden hast, weil sie nicht automatisch ungültig werden, nach dem Verlassen der Funktion). Du hast hier also keine neue Zuweisung, sondern du erstellst eine zweite Variable.
Wenn du 10mal die Funktion verlässt, weil es einen Fehler bei DllCall gab und die Funktion immer wieder erneut aufgerufen würde, hättest du 11 mal $hDLL im Speicher (in dem Fall sehe ich auch kein DllClose und dass ist immer notwendig).
Aber wie geschrieben. Das ist ja nur ein Code-Ausschnitt und es kann auch ganz anders sein.
-
Hallo Tweaky
hmm, das kann ich nicht nachvollziehen. Eben habe ich mit dem InetGet-Beispiel Raspbian heruntergeladen. Das hat einwandfrei funktioniert. Vielleicht ist die Verbindung über die App nicht so stabil und die Browser sind da toleranter? Keine Ahnung. Vielleicht hast du einfach einen Fehler gemacht?
Ich kenne nur noch InetRead
Alternativ würde ich vorschlagen, du probierst es noch mal mit _DownloadWithProgress von Oscar. Das ist zwar auch InetGet, aber sicherlich eine einwandfreie Umsetzung mit einer sicher gerne gesehenen Statusanzeige während des Downloads größerer Dateien.
-
Hallo Grufti39
beschreibe mal in Worten, was in dem Skript passieren soll.
(Es ist nicht lauffähig, der Dateiname passt für mich nicht, du hast mehrere Syntaxfehler drin)
EDIT: Wobei ich dir gleich sagen muss, wenn ich den richtigen Dateinamen eintrage, scheitert das Skript nur noch an den Syntaxfehlern und nicht daran, dass $oExcelU kein Objekt sei. Du musst doch nach _Excel_BookOpen in deiner Messagebox schon einen Fehlerwert gesehen haben.
-
Was meinst Du damit?
Du glaubst dein Problem sei:
Das Hauptproblem ist die Meldung zur Anweisung "_Excel_RangeDelete($oWorkbook.ActiveSheet, "1")"
Dabei bricht hier nur das Skript ab, weil $oWorkbook kein Objekt ist. Das liegt daran, dass die Funktion _Excel_BookOpen nicht erfolgreich war. Water hatte einfach nur die Fehlermeldungen entfernt. Sonst hättest du immer noch die gleiche Meldung wie bei deinen ersten Versuchen mit dem Beispiel aus der Hilfe erhalten.
Es liegt nicht am Format. Ich kann die txt, die water dir in Beitrag 17 verlinkt hatte in csv umbennen und aus Excel heraus als xls oder xlsx speichern und es würde immer noch funktionieren (nach Angabe des korrekten Dateinamens im Skript). Die UDF ist auch sehr gut erprobt und gilt als absolut zuverlässig. Man geht in der Regel nur andere Wege, wenn man Dinge machen möchte, die von der UDF nicht berücksichtigt werden.
Bei dir funktioniert das aber nicht. Daher sage ich, es liegt ganz sicher an deiner speziellen Konfiguration. Irgendetwas mit deinem System, deiner Installation, deiner Art das Auszuführen, was auch immer. Ich weiß es nicht. Es ist aber kein allgemeines Problem.
Ich fürchte, hier wird kein besserer Code kommen, um dein Problem zu lösen. Ich glaube, das Problem muss auf deinem Rechner gelöst werden.
-
Welche Dateiendung haben diese Exceldateien?
Noch hoffe ich auf eine funktionierende Idee.
Es liegt bei dir lokal irgendein Problem vor. Da ist es schwer Lösungen zu bringen.
Die Exceldateien haben alle vertrauliche Daten. Ich werde morgen Testdateien erstellen.
-
Bei mir funktioniert es unter Windows 10.
Wie in Beitrag 23 geschrieben, gibt es auch alternative Herangehensweisen.
-
Wenn du gar kein Excel hast, oder wir an dieser Stelle nicht weiter kommen, dann ist das eigentlich auch kein Problem.
Da du csv-Dateien vorliegen hast, aus denen du bestimmte Zeilen löschen möchtest, kann man auch die ganz normalen String-Funktionen verwenden (csv-Dateien sind nämlich ganz normale Textdateien, die diesen in einem bestimmten Format organisieren).
Ich will nicht übertreiben aber mit den Stringfunktionen ist die Aufgabe wahrscheinlich tausendmal schneller in der Ausführung.
-
Hallo Grufti39
Aussserdem enthält der Lösungsansatz eine Text-Datei statt einer Exceltabelle.
Ich denke water konnte hier einfach keine Datei mit Endung csv anhängen. Die Datei ist aber schon im richtigen Format. Du kannst die Datei auch von test.txt in test.csv umbenennen und das dann auch im Skript ändern.
Allerdings funktioniert es bei mir einwandfrei (auch als test.txt).
_Excel_RangeDelete($oWorkbook.ActiveSheet, "2:4")
liefert zur Anweisung ".ActiveSheet" die Meldung "Variable must be of txpe Object".Du hast das Beispiel (txt und au3) von water heruntergeladen? Sie lagen im selben Ordner, als du das Skript ausgeführt hast?
Kann es sein, dass du gar kein Office installiert hast, sondern nur den Office- oder Excel-Viewer?
Mit der Punktnotation musst du dich aktuell nicht kümmern. (Es bringt sich an dieser Stelle einfach nicht weiter..). Aber hier der Link zu MS. Links siehst du die Liste mit den Objekten https://msdn.microsoft.com/de-de/vba/exce…ns-object-excel
-
Hey Grufti39
Ich habe gerade dein Profil betrachtet..
Einfach klasse, dass du dich immer noch mit neuen Sachen beschäftigst.
Du bist ein tolles Vorbild.
-
-->> NEVER RUN A CHANGING SYSTEM ! <<--
-
Gerade habe ich mir das Beispiel 2 in der Hilfe noch einmal angesehen. Ist dir bewusst, dass da Inhalte aus dem dritten Arbeitsblatt gelöscht werden sollen und nicht aus dem ersten?
1:1 kopiert wird dieses Beispiel nicht mit Exceldateien funktionieren, die nicht drei Arbeitsblätter enthalten...
-
Sorry Grufti39
Ich kann das nicht nachvollziehen und kann dir ja auch nicht direkt über die Schulter schauen. Außerdem sehe ich deinen Code ja nicht, obwohl du der Meinung bist, nur kopiert zu haben.
Die MsgBox Zeile, die du hier immer schreibst, ist nicht der Fehler, sondern wird im Fehlerfall angezeigt. Es bringt auch nichts @error oder @extended abzuschreiben, weil wir ja nicht sehen, welche Werte sie zur Laufzeit hatten...
Nur mal so nebenbei. Warum startest du nicht ganz einfach und probierst es mal mit dem Ausführen des Beispiels direkt aus der Hilfe, bevor du daran herumspielst?
Hast du AutoIt installiert, hast du SciTE4AutoIt3 installiert? Dann klick doch einfach mal das Wort _Excel_RangeDelete im Editor an und drücke F1. In der Hilfe klickst du dann auf "Open this Script" und dann führst du es aus dem Editor mit F5 direkt aus.
-
Halllo Grufti39
Hast du das Beispiel von der Website kopiert? Wenn ja, passt der Pfad nicht. Normalerweise ist das so gedacht, dass du die lokale Hilfedatei öffnest und den Link "Open this Script" benutzt. Dann liegt das ausgeführte Skript in deinem AutoIt Installationsverzeichnis bei den Helpfiles.
Du kannst den Pfad anpassen. Statt @ScriptDir & "\Extras\_Excel1.xls" verwende StringTrimRight(@AutoItExe, 11) & "\Examples\Helpfile\Extras\_Excel1.xls".
Edit:
Wie unterscheidet Autoit zwischen .xls,- .xlsx- und .csv-Exceldateien?
Überhaupt nicht. Das macht Excel.
-
Hallo Grufti39
kein Beispiel für Zeilen zu löschen und für Range-Adressen mit Variablen gefunden.
Beispiel 1: Ich möchte die zu lesenden Zellen über Variable ansprechen, also etwa so:
_Excel_RangeRead ($oExcel, $c & ":" & $z, 1)
Naja, du weißt ja schon, wie man Strings mit Variablen und Text erstellt. Wenn hier etwas nicht klappt, liegt es entweder an den Inhalten der Variablen, die du nicht zeigst, oder an dem Fehler, dass du hier einen Punkt, statt einem Doppelpunkt verwendest.
-
Hallo Code-Jack
Wie gesagt: Der (von mir so betrachtete) Bug machte sich bisher nie bemerkbar. Vermutlich weil die als Integer erzeugte ID von SQLite als Zahl verdaut wurde und daher keine Einfassung in Hochkommas benötigte.
Ich hingegen, verwende nun neuerdings keinen Integer mehr als ID, sondern einen String. Und dann klemmt es, ohne die Einfassung.
Daher ist es kein Bug, sondern war so wie es angelegt war völlig korrekt. Wenn man daran Änderungen vornimmt, muss man eben wissen, was man warum ändern muss. Du machst es nun natürlich besser. Bulletproof finde ich es aber auch noch nicht. Du solltest am besten allgemein die Funktion _SQLite_Escape benutzen (dann sparst du es dir auch eventuelle Steuerzeichen im Text escapen zu müssen).
-
Hallo Code-Jack
Ich wollte doch nur den Unterschied zwischen Autoincrement und RowID deutlich machen. (imdb war doch ein hätte-wenn-wäre-Beispiel ).
-
Ja, das ist eine schöne Sache.
RowIDs sind immer eindeutig aber dennoch veränderlich. Wenn es also nur um Eindeutigkeit geht und nicht um dauerhaft bestehenden Werte - wie das meistens auch der Fall ist - sind sie ausreichend. Das ist jedoch ein Punkt, den man im Blick behalten muss. Manchmal will man das eben doch nicht. (Wäre doof, wenn das bei imdb eine RowID die Film-ID wäre und ein Film gelöscht würde und damit alle nachfolgenden IDs verschoben würden).
-
Hallo Code-Jack
meine naiven Gedanken.
-Ich kenne keine andere Möglichkeit als einen zentralen Server.
-Ich würde die Daten in verschiedene Tabellen aufteilen. Lokal hätte jeder Tabellen für die vom Nutzer erstellten Daten und Tabellen für die "synchronisierten" Daten vom gemeinsamen Server. (Im Hintergrund. Mit der Anzeige der Daten hat das ja nichts zu tun).
-Nach Export und Download der neuen Daten, können dann die User-Tabellen gelehrt werden.
-Die Namens-ID würde ich von der Datensatz-ID getrennt halten.
(Wahrscheinlich wäre es am besten, deine Clients würden immer sofort versuchen, alle noch nicht "synchroniesierten" Datensätze mit dem zentralen Server zu tauschen. Wenn er mal nicht erreichbar wäre, würde eben die Liste etwas wachsen. Keine Ahnung, ob das zu deinem Spendengedanken passt).
-Du könntest die Adresse des zentralen Servers editierbar machen oder Domain Weiterleitung nutzen, um die Möglichkeit zu haben den zentralen Server schnell zu wechseln.