"FTP_FileGet" ein 2. mal nicht möglich?

  • Thema geändert in "FTP_FileGet" ein 2. mal nicht möglich?"

    >>>Siehe Kommentar 13<<<


    MIt Button in Gui 2 ein Label in Gui 1 erstellen [Erledigt]

    Lösung "GuiSwitch" (Somit erledigt)

    Hallo, ich mal wieder.

    Ich habe das Problem, dass ich mit einem Button in einer 2. Gui einen Text (Label) in der 1. Gui erstellen möchte.
    Einen vorhandenen Text in Gui 1 kann ich mit einen Button in Gui 2 mit "GuiCtrlSetData" ändern.
    Aber wie kann ich ein Text in Gui 1 aus der 2. Gui erstellen?

    Mit "GuiCtrlCreateLabel" kann ich ja keine Gui bestimmen? Somit bekomme ich den Text nur auf der aktuellen Gui erstellt.

    Hier mal ein Script:

    #include <GuiConstants.au3> Opt("GuiOnEventMode", 1) ;Gui 1 erstellen $Gui_1 = GUICreate("Gui 1", 300, 300, 0, 0) GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit1") $Label_1 = GUICtrlCreateLabel("Testtext 1", 10, 10, 200) ;Ende ;Gui 2 erstellen $Gui_2 = GUICreate("Gui 2", 300, 300, 300, 0) GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit2") $Button1_Gui2 = GUICtrlCreateButton("Label auf Gui 1 erstellen", 75, 50, 150) GUICtrlSetOnEvent($Button1_Gui2, "_AddLabelGui1") $Button2_Gui2 = GUICtrlCreateButton("Label auf Gui 1 ändern", 75, 100, 150) GUICtrlSetOnEvent($Button2_Gui2, "_ChangeLabelGui1") ;Ende GUISetState(@SW_SHOW, $Gui_1) GUISetState(@SW_SHOW, $Gui_2) While 1 Sleep(100) WEnd ;Diese Funktion soll einen Text auf Gui 1 erstellen Func _AddLabelGui1() $Label_2 = GUICtrlCreateLabel("Testtext 2", 10, 10, 150) ;Dieses Label soll auf Gui 1 erscheinen EndFunc ;==>_AddLabelGui1 Func _ChangeLabelGui1() GUICtrlSetData($Label_1, "Testtext 1 geändert") EndFunc ;==>_ChangeLabelGui1 Func _Exit1() Exit EndFunc ;==>_Exit1 Func _Exit2() GUIDelete($Gui_2) EndFunc ;==>_Exit2

    MfG

    Sorry für die doppelt erstellten Themen. Es gab einen Fehler, wurde aber doch erstellt.
    Ich habe die doppelten gelöscht.

    3 Mal editiert, zuletzt von Joschy41 (26. September 2019 um 10:30)

  • Hallo Joschy41

    Mit "GuiCtrlCreateLabel" kann ich ja keine Gui bestimmen? Somit bekomme ich den Text nur auf der aktuellen Gui erstellt.

    Weißt du ja schon selbst.
    Du kannst aber bereits zum Start Labels erstellen und die dann später aus der anderen GUI füllen. Di Controls sind ja Global verfügbar.
    Wenn es um eine zuvor unbestimmte Anzahl von Labels geht, kannst du mit Scrollbars (& evtl. Child GUIs) arbeiten.

    Grüße autoiter

  • Ich kann leider vorher nicht wissen, wieviele Labels (bzw. Buttons) erstellt werden müssen.

    Also ich arbeite derzeit an einen Bestellprogramm für die Arbeit.
    Das Programm "Bestellen", erfasst die eingegebenen "Inputs" und macht daraus eine Textdatei.
    Eine Zeile je Bestellung.

    Nun soll das Programm zum "Anzeigen" der Bestellungen auf einen anderen Rechner laufen und je nach Zeilen in der Textdatei Buttons erstellen.
    5 Zeilen = 5 Bestellungen = 5 Buttons

    Die Textdatei kann sich jederzeit ändern, wenn jemand eine Bestellung aufgibt.
    Das Programm zum anzeigen soll also z.B. jede 60 Sekunden prüfen, ob eine Zeile hinzugekommen ist bzw. entfernt wurde.
    Demnach also auch einen Button hinzufügen bzw. entfernen.
    Das soll aber auch funktionieren wenn in dem Programm zum anzeigen eine weitere Gui mit z.B. einer "Info" geöffnet ist.

    Also in der $hGui der "Anzeigen.exe" sollen sich die Buttons aktualisieren (Löschen und neu erstellen) während eine $InfoGui der "Anzeigen.exe" geöffnet ist.

    Ich hoffe ich konnte das mal verständlich beschreiben.

  • Hallo.

    Vielleicht ein dummer Gedanke, aber wäre es nicht einfacher, ein ListView/ListBox mit anklickbaren Zeilen zu benutzen? Also anstatt Text Labels und Buttons zu erstellen, die dann alle platziert und organisiert werden müssen, einfach einem ListView Einträge hinzufügen/löschen. Der User kann dann mit einem Doppelklick auf einen Eintrag die Bestellung öffnen. :/ Auch verschiedene Monitorauflösungen könnte man dann besser handhaben. Oder habe ich das falsch verstanden?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Hallo Professor Bernd

    Nein hast du richtig verstanden alles.

    Ich habe das mal mit der Liste gemacht und es gefällt mir tatsächlich auch besser.

    Aktuelles Problem nur, dass die Liste sich nur aktualisiert, wenn sich das Programm neu startet.

    Vermute das hängt irgendwie mit dem FTP zusammen, da die Daten auf einem FTP liegen.
    Soll verhindern, dass Leute an einer Datei rumfummeln.

    Gruß

  • Prima!

    Hast du eine ListBox genommen, oder ein ListView? Hat das vielleicht eine AutoRefresh-Einstellung? Ansonsten kannst du das Aktualisieren vielleicht selbst übernehmen, z. B. wenn du einen Eintrag hinzufügst/enfernst. Oder im OnItemAdd-, OnItemChange-, OnFocus-Ereignis, oder ... Irgendwie wirds schon gehen! ;)

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Hallo Joschy41

    Aktuelles Problem nur, dass die Liste sich nur aktualisiert, wenn sich das Programm neu startet.

    Schau dir mal die Fehlermeldungen der relevanten Funktionen an. Wenn das nicht weiterhilft, erstelle ein verkürztes Beispiel, das nichts anderes tun soll, als die Daten per FTP zu holen und in die Liste zu übernehmen.

    Wenn du dann noch Probleme hast, kannst du uns dieses Bsp zeigen. Aber meist löst sich das Problem, bei so einer Beispiel-Erstellung :D

    Grüße autoiter

  • Danke für euren Tipps :)

    Ich bin dabei die Programm noch mal neu und sauber zu schreiben.
    Das Problem tauchte nur auf, wenn 2 Rechner das gleiche Programm offen hatten und beide auf den FTP zugegriffen haben. Da ich aber vorhin noch nicht "_FTP_Close" drin hatte, vermute ich einfach, dass beide Rechner mit dem gleichen FTP user auf die gleichen Dateien zugegriffen haben und so ein Konflikt entstand.

    Ich schreibe die Programme erstmal neu und melde mich ggf. noch mal ;)

    Danke! und gute Nacht!

  • Zum Thema FTP:

    Wenn ich das Programm starte, holt er sich die aktuellen Daten vom FTP.

    Wenn ich im Programm auf "Aktualisieren" drücke um die Daten erneut zu holen, verbindet er sich zwar mit dem FTP,

    holt die "aktuellen" Daten aber nicht erneut vom FTP, sondern holt irgendwo anders die zuvor geladenen Datein her und packt sie wieder in den Zielpfad.

    Jemand ne Idee?

  • Ich habe jetzt folgendes festgestellt:

    Verbinden zum FTP
    Datei Herunterladen

    Datei ansehen

    Trennen zum FTP

    Datei Lokal löschen

    Erneut Verbinden zum FTP

    Datei Herunterladen (funktioniert nicht)

    Datei ansehen

    Trennen zum FTP

    Datei Lokal löschen

    Dieser Ablauf funktioniert nicht. Er lädt die Datei nicht zum zweiten mal herunter.
    Das kann ich feststellen indem ich auf FileZille Server gucke und nichts von einem Download steht.
    Somit bekommt das Programm auch nicht die aktuellen Daten, wenn zwischendurch von jemand anders die Datei auf dem FTP geändert wurde. Das Programm nimmt anscheint aus irgendein Speicher die als 1. geladene Datei und schiebt sie erneut Lokel zum Zielpfad.

    Jetzt ein anderes Beispiel:

    Verbinden zum FTP

    Datei Herunterladen

    Datei ansehen

    Datei Hochladen

    Trennen zum FTP

    Datei Lokal löschen

    Erneut Verbinden zum FTP

    Datei Herunterladen (funktioniert auf einmal wieder)

    Datei ansehen

    Trennen zum FTP

    Datei Lokal löschen

    Nachdem ich die Datei die ich Heruntergeladen habe nach dem Lesen wieder hochlade, kann ich die ein 2. mal Herunterladen und sie ist somit aktuell.
    Gibt es eine Möglichkeit den Upload zu umgehen, damit ich die Datei einfach ein zweites mal herunterladen kann?

    MfG

  • Joschy41 26. September 2019 um 10:31

    Hat den Titel des Themas von „Mit Button in Gui 2 ein Label in Gui 1 erstellen“ zu „"FTP_FileGet" ein 2. mal nicht möglich?“ geändert.
  • Gibt es eine Möglichkeit den Upload zu umgehen, damit ich die Datei einfach ein zweites mal herunterladen kann?

    Deine Textbeschreibung der Vorgehensweise ist zwar ausführlich, aber ohne Code kann man nur Vermutungen anstellen.

    Wenn das nicht weiterhilft, erstelle ein verkürztes Beispiel, das nichts anderes tun soll, als die Daten per FTP zu holen ...

    Es ist klar, dass Du hier nicht die echten Zugangsdaten zu Deinem FTP-Server offenlegen kannst. Liefere aber bitte trotzdem mal ein Minimalskript, welches das Problem reproduzierbar abbildet (persönliche Daten durch xxx ersetzen).

    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."

  • Okay.
    Dann hier mal der Code.

    Ich nutze eine selbstgebaute zusätzliche Au3 um das Eigentliche Script Übersichtlicher zu haben.

    FtpUdf.au3

    Hier das Downloadscript.

    Beim 2. _DownloadFromFTP lädt er die nicht erneut runter, sondern nimmt die Datei irgendwo her und legt die ins Zielverzeichnis ab.

    Gruß

  • Kurzes Feedback :

    Ob das mit Deinem Problem zu tun hat kann ich noch nicht sagen, aber Du solltest unbedingt globale Deklarationen innerhalb von Funktionen vermeiden :

    Code
    Func _ConnectToFtp(...)
        Global $ftpSession = ... 
        ...
        Global $ftpConnect = ... 
        
    Func _ReadFromFtp(...)
        Global $ftpFileReadFin = ... 

    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."

  • Kurzes Feedback :

    Ob das mit Deinem Problem zu tun hat kann ich noch nicht sagen, aber Du solltest unbedingt globale Deklarationen innerhalb von Funktionen vermeiden :

    Code
    Func _ConnectToFtp(...)
        Global $ftpSession = ... 
        ...
        Global $ftpConnect = ... 
        
    Func _ReadFromFtp(...)
        Global $ftpFileReadFin = ... 

    Gruß Musashi

    Die nächste Funktion, arbeitet ja aber mit den Variablen von der darüber.

    Sollte ich die zu Anfang einmal Global deklarieren?

    ??

    Ändert aber nichts an mein Problem ^^

  • Die nächste Funktion, arbeitet ja aber mit den Variablen von der darüber.

    Syntaxtechnisch ist es möglich, Globals in Funktionen zu deklarieren, kann aber zu Problemen führen.

    Sollte ich die zu Anfang einmal Global deklarieren ?

    Eigentlich versucht man auch in UDF's (weitgehend) auf Globals zu verzichten. Hier kannst Du es mal machen, verwende aber 'bessere' Variablennamen, d.h. :

    Global $__g_FTPUDFSession statt Global $ftpSession

    Wichtig, da sich Includes und Skript einen globalen Scope teilen.

    Ändert aber nichts an mein Problem ^^

    Hatte ich auch nicht unbedingt erwartet, macht den Code aber einen Schritt sauberer ;).

    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."