Txt-Datei auslesen und Teile davon im Gui anzeigen

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Fresh Janine
Posts: 29
Joined: 07 May 2017, 10:15

Txt-Datei auslesen und Teile davon im Gui anzeigen

08 Oct 2017, 17:42

Hallo,

ich möchte eine Txt-Datei(große Datei) auslesen, die z.B. so aussieht:

ticket;symbol;typ;magicnumber;netto;day;month;comment
1234591;EURUSD;SHORT;12381;1,00;Sonntag;Oktober;EA V.1
1234592;EURUSD;LONG;12380;0,70;Sonntag;Oktober;EA V.1
1234593;EURUSD;SHORT;12382;-0,10;Sonntag;Oktober;EA V.1
1234594;EURUSD;SHORT;12382;0,70;Montag;Oktober;EA V.1
1234595;EURUSD;SHORT;12383;0,80;Montag;Oktober;EA V.1

und soll dann z.B. so in einem Gui angezeigt werden:
Gui.jpg
Gui.jpg (29.49 KiB) Viewed 3535 times
Jetzt weiß gar nicht so recht, wie ich anfangen soll. Auf Grund der Größe der Datei, weiß ich, wird "Loop, read, C:\Test.txt" empfohlen. Doch wie mache ich das, dass ich nach dem Speichern in die Variablen mir Wörter der Zeilen raussuche, wo das Programm dann auch noch weiß, dass die "Magicnumber" und das "Comment" in einer Zeile sind und somit zusammengehören?

Entspannte Grüße
Fresh Janine
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

09 Oct 2017, 03:22

Moin,

Dein Dateibeispiel sieht aus wie eine CSV-Datei, die sich über den Feldtrenner ; einfach aufteilen lässt. Das Bild des Fensters legt nahe, ein ListView für die Darstellung zu verwenden. Dabei gibt es möglicherweise Probleme.
  • ListViews zeigen pro Spalte nur die ersten 260 Zeichen des Spaltentextes an. Wenn die aneinandergeketteten Magicnumbers länger werden, wird die Anzeige abgeschnitten.
  • Wenn Du für jede Magicnumber eine eigene Spalte anlegen willst, bekommst Du ein Problem, wenn die Gesamtzahl der Spalten 200 überschreitet. Das ist laut Hilfedatei die maximale Spaltenzahl.
Soll die Darstellung im Fenster mehr als eine nackte Anzeige sein, soll heißen, willst Du die im Fenster dargestellten Daten noch verarbeiten?

Edit: In Deinem Beispiel gibt es die Magicnumber 12382 doppelt. Ist das normal und soll das irgendwie besonders behandelt werden?
Fresh Janine
Posts: 29
Joined: 07 May 2017, 10:15

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

09 Oct 2017, 07:07

Also erstmal, dieses Programm: "https://autohotkey.com/board/topic/3730 ... en-in-ahk/" nutzt auch Listview. Ich hatte es gerade ausprobiert und es gibt da keine maximale Spaltenzahl. Und die 260 Zeichen würden locker für die Magicnumbers ausreichen.
Du hast recht, es könnte auch eine Csv-Datei sein. Ich könnte meine Liste auch als Csv-Datei abspeichern lassen, doch ich hab mich für eine Txt-Datei entschieden, da ich es als etwas einfacher empfinde, darauf ein Ahk-Programm basieren zu lassen.
Das häufig die selbe Magicnumber auftaucht ist vollkommen normal und soll auch so sein. Und in der Tabelle soll keine Magicnumber doppelt angezeigt werden.
Diese Tabelle ist eigentlich nur der Anfang eines nützliches Tools. Es soll am Ende eigentlich so aussehen:
Analyse01.ahk
(1.14 KiB) Downloaded 59 times
Im ersten Tab ist die untere Liste nur eine Anzeige zur Übersicht und in der oberen Tabelle speichert man seine EAs (Expert Advisor) mit den dazugehörigen Magicnumbers ein, was sehr wichtig ist, denn wenn man dann in der oberen Tabelle auf eine Zeile doppelklickt, soll automatisch Tab 2 fokussiert werden und man soll nur das Ergebnis dieser selbst eingetragenen Magicnumbers sehen. Genau so wie, wenn man dann in Tab 2 in der linken Tabelle auf eine Zeile doppelklickt, dann soll Tab 3 fokussiert werden und man sieht nur das Ergebnis von diesen Tag mit diesen Magicnumbers.
Ich fürchte, dieses Tool übersteigt zu sehr meine Kompetenz. Was würde es mich kosten, das von jemanden programmieren zu lassen?
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

09 Oct 2017, 10:38

OK, den Begriff 'Expert Advisor' habe ich schon mal gehört. Es geht hier um ein Börsenprogramm, oder?

Die Begrenzung auf 200 Spalten gilt zumindest für die Funktion LV_InsertCol(). Das ListView Control nimmt aber beim Erstellen deutlich mehr Spalten an.

Wenn Du glaubst, dass 260 Zeichen ausreichen, um alle Magicnumbers darzustellen, sollten auch 200 Spalten locker reichen. Du hast ja vor, per Doppelklick im ersten ListView die Magicnumbers auszuwerten. Wenn Du immer alle auswerten willst, geht das in einer Spalte. Wenn Du sie allerdings einzeln auswerten willst, solltest Du jeder Nummer eine eigene Spalte gönnen.

Zum Thema 'doppelte Magicnumbers' hast Du Dich nicht geäußert.

AHK ist die Dateiendung egal, solange der interne Aufbau stimmt. Die eingebauten CSV-Funktionen unterstützen aber nur das Komma als Feldtrenner. Die braucht man aber nicht, wenn sichergestellt ist, dass das Trennzeichen (hier Semikolon) nie innerhalb der Felder vorkommt.

Ansonsten habe ich nichts gehört oder gesehen, was nicht machbar wäre. Und, falls Du DIch dafür entscheidest, es gegen Bezahlung in AHK programmieren zu lassen, es ist bisher auch nichts dabei, das für einen 'Experten' mit echter Arbeit verbunden wäre. Man mag sich allerdings fragen, wie 'wertvoll' das Ergebnis für Dich ist.
Fresh Janine
Posts: 29
Joined: 07 May 2017, 10:15

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

09 Oct 2017, 12:09

In der 5. Zeile hatte ich doch zum Thema 'doppelte Magicnumbers" Stellung genommen, Zitat: "Das häufig die selbe Magicnumber auftaucht ist vollkommen normal und soll auch so sein. Und in der Tabelle soll keine Magicnumber doppelt angezeigt werden.".
Ja, es ist soll ein Tool für ein Börsenprogramm werden.
Du hast mir soweit schon gut geholfen, danke dir :)
Doch ich habe vorhin tatsächlich schon beschlossen, dass ich es von einem Experten programmieren lassen werde. Kennst du jemanden, der gegen Bezahlung, deutsch spricht und mit Leichtigkeit mein Analyse-Tool programmieren könnte?
garry
Posts: 3740
Joined: 22 Dec 2013, 12:50

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

09 Oct 2017, 14:01

ähnliches Beispiel mit 2 Listbox und 1 Listview
z.B. News > Zürich > Info/start url

Code: Select all

#warn
#NoEnv
setworkingdir,%a_scriptdir%
Filename1=Listbox_Listview_MENU
cx1:=""
cx2:=""
e1:=""
e2:=""

f1=%a_scriptdir%\AllAdressCSV.txt
gosub,createtestfile

Gui,1:default
Gui,1: Color, ControlColor,Black
Gui,1: Color, Black

Gui,1:Font,S12 cGray,Lucida Console
Gui,1:Add, ListView,backgroundteal csilver grid r10 x220 y0 w480 +hscroll altsubmit gLW1 vMLV1, Name|URL1
LV_ModifyCol(1,220)
LV_ModifyCol(2,220)
; LV_ModifyCol()
Gui,1:Show,x0 y0 w710 h260,%filename1%
Gui,1:add,Listbox,x5   y10 w100 h200 Sort vLB1 gLB1
Gui,1:add,Listbox,x110 y10 w100 h200 Sort vLB2 gLB2
gosub,Fileread1
return
Guiclose:
exitapp

Fileread1:
GuiControl,1:,LB1,|
fileread,aa,%f1%
loop,parse,aa,`n,`r
  {
  x:=a_loopfield
  if x=
     continue
  stringsplit,C,x,`;,
  if cx1<>%c1%
    e1 .= C1 . "|"
  cx1=%c1%
  }
GuiControl,1:,LB1,%e1%
GuiControl, ChooseString, LB1, News-ch
aa=
e1=
return

LB1:
Gui,1:submit,nohide
Gui,1:ListView,mlv1
LV_Delete()
GuiControl,1:,LB2,|
fileread,aa,%f1%
loop,parse,aa,`n,`r
  {
  x:=a_loopfield
  if x=
     continue
  stringsplit,C,x,`;,
  if c1=%Lb1%
    {
    if cx2<>%c2%
      e2 .= C2 . "|"
    cx2=%c2%
    }
  }
GuiControl,1:,LB2,%e2%
aa=
e2=
return

LB2:
Gui,1:submit,nohide
Gui,1:ListView,mlv1
LV_Delete()
fileread,aa,%f1%
loop,parse,aa,`n,`r
  {
  x:=a_loopfield
  if x=
     continue
  c3=
  c4=
  stringsplit,C,x,`;,
  if c2=%Lb2%
     LV_Add("",c3,c4)
  }
aa=
return



LW1:
Gui, Submit,nohide
if A_GuiEvent = Normal
  {
  LV_GetText(C1,A_EventInfo,1)
  LV_GetText(C2,A_EventInfo,2)
  RN:=LV_GetNext("C")
  RF:=LV_GetNext("F")
  GC:=LV_GetCount()
  ;msgbox,C1=%c1%`nC2=%c2%
  run,%c2%
  }
return
;---------------------------------------------------------------

createtestfile:
ifnotexist,%f1%
{
d=
(
News-ch;Baz;Front;https://bazonline.ch/rss_ticker.html
News-ch;Baz;basel;https://bazonline.ch/basel/rss.html
News-ch;Tagesanzeiger;Zuerich;https://www.tagesanzeiger.ch/zuerich/rss.html
News-ru;Sputnik;;https://de.sputniknews.com/
Mathe;us-Archives;math.utk.edu;http://archives.math.utk.edu/popmath.html
News-uk;theRegister;SciTech;http://www.theregister.co.uk/
News-de;zdnet;SciTech;http://www.zdnet.de/
TV-de;TV24;Mediathek;https://www.welt.de/mediathek/
News-de;Karlsruhe;BW;http://www.ka-news.de/nachrichten/baden-wuerttemberg/
News-us;cnet;SciTech;https://www.cnet.com/
Satire-de;Titanic;Cartoon;http://www.titanic-magazin.de/sc.rss
Countries;BBC;CountryProfiles;http://news.bbc.co.uk/2/hi/europe/country_profiles/
Satire-de;Postillon;;http://www.der-postillon.com/
Satire-de;Harmbengen;;http://www.harmbengen.de/Zeitungscartoons.html
)
sort,d
fileappend,%d%,%f1%
d=
}
return
;================================ END script ==================
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

09 Oct 2017, 14:45

Fresh Janine wrote:"Das häufig die selbe Magicnumber auftaucht ist vollkommen normal und soll auch so sein. Und in der Tabelle soll keine Magicnumber doppelt angezeigt werden."
Das sagt uns aber noch nicht wie genau deoppelte Magicnumbers behandelt werden sollen - was soll passieren wenn eine doppelte Nummer auftaucht? Soll die zweite ignoriert werden, soll die erste ersetzt werden oder sollen etwa beide verrechnet werden?
Recommends AHK Studio
Fresh Janine
Posts: 29
Joined: 07 May 2017, 10:15

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

09 Oct 2017, 15:50

Wenn das Tool noch mal die gleiche Magicnumber findet, was sehr häufig der Fall sein wird, dann soll er diese ignorieren.

Jetzt sind schon 3 Experten hier. Vielleicht hat einer von euch Lust gegen Geld mir das Analyse-Tool zu programmieren?
Ich werde dann natürlich auch alles ausführlich erklären.
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

09 Oct 2017, 16:00

Nun ja, die 5. Zeile habe ich wohl nicht wahrgenommen.

Zum Thema Auftragsprogrammierung:
Wie ich die Diskussion im englischen Forum verstanden habe, ist das nicht unbedingt gern gesehen, aber auch nicht verboten. Allerdings sind die "Ich brauche Hilfe" Foren dafür tabu. In diesen Foren wird immer ohne eine vorher vereinbarte finanzielle Gegenleistung geholfen. Du solltest deshalb einen neuen Thread in "Allgemeines" aufmachen.

Auch dort sind öffentliche Verhandlungen über das Entgelt eigentlich tabu. In jedem Fall solltest Du DIr Gedanken über eine konkrete Anforderungsliste (Pflichtenheft) machen, die so formuliert ist, dass 'Missverständnisse' ausgeschlossen sind. Wenn Dir das nicht gelingt, kommt es mit großer Wahrscheinlichkeit zu Diskussionen darüber, ob das gelieferte Produkt die Anforderungen erfüllt.
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

10 Oct 2017, 03:42

Moin,

Du hast ja anscheinend noch keine endgültige Entscheidung über die 'Auftragsarbeit' getroffen. Damit Du das etwas besser beurteilen kannst, habe ich mal mit Beispieldaten das untere ListView Control im ersten Tab gefüllt, wie ich es verstanden habe:

Code: Select all

#NoEnv
#SingleInstance Force
SetWorkingDir %A_ScriptDir%
AnalyseDatei := A_ScriptDir . "\ZumTesten.txt"
; --------------------------------------------------------------------------------------------------------------------------------
If !FileExist(AnalyseDatei)
   CreateTestFile(AnalyseDatei)
; --------------------------------------------------------------------------------------------------------------------------------
Menu Tray, Icon, shell32.dll, 50
; --------------------------------------------------------------------------------------------------------------------------------
Gui Font, s10, Verdana
Gui Add, Tab3, x0 y0 w1000 h510 +Buttons +0x8 +AltSubmit, Hauptmenu|Expert Advisor|Detail
Gui Tab, 1
Gui Add, ListView, x100 y45 w800 h200 vLV1, Expert Advisor                |Magicnumber
Gui Add, DropDownList, x100 y255 w305, MT4-1||MT4-2||MT4-3||MT4-4||MT4-5||MT4-6||MT4-7||MT4-8
Gui Add, Button, x415 y254 w100 h23, &Edit
Gui Add, Button, x520 y254 w100 h23, &Save
Gui Add, Button, x625 y254 w100 h23, &New
Gui Add, ListView, x100 y290 w800 h195 vLV2, Kommentar                    |Magicnumber
GoSub, FillLV2
Gui Tab, 2
Gui Add, ListView, x40 y35 w400 h460, Datum              |Tag              |Gewinn
Gui Add, ListView, x460 y35 w300 h460, Jahr         |Monat           |Gewinn
Gui Add, Button, x780 y60 w150 h23, &Komplette Historie
Gui Add, DropDownList, x780 y100 w150, EURUSD||GBPUSD||AUDUSD
Gui Tab, 3
Gui Add, ListView, x0 y20 w1000 h468, Kommentar|Ordernummer|Closetime|Slippage|Typ|Volumen|Symbol|Gewinn
Gui Add, Text, x780 y488 w220 h23 +E0x200, Gesamtsumme:
; --------------------------------------------------------------------------------------------------------------------------------
Gui Show, w1000 h510, Analyse
Return
; --------------------------------------------------------------------------------------------------------------------------------
GuiEscape:
GuiClose:
ExitApp
; --------------------------------------------------------------------------------------------------------------------------------
FillLV2:
Gui, ListView, LV2
LV2_Array := []
LV2_Columns := 2
EA_Index := 8
MN_Index := 4
Loop, Read, %AnalyseDatei%
{
   If (A_Index > 1)
   {
      Split := StrSplit(A_LoopReadLine, ";")
      EA := Split[EA_Index]
      MN := Split[MN_Index]
      If LV2_Array.HasKey(EA)
      {
         If !InStr(LV2_Array[EA], MN)
            LV2_Array[EA] .= ", " . MN
      }
      Else
         LV2_Array[EA] := MN
   }
}
For EA, MN In LV2_Array
   LV_Add("", EA, MN)
Loop, %LV2_Columns%
   LV_ModifyCol(A_Index, "AutoHdr")
Return

; ================================================================================================================================
; Zum Testen
; ================================================================================================================================
CreateTestFile(FileName) {
   Inhalt := "
   (LTrim Join`r`n
      ticket;symbol;typ;magicnumber;netto;day;month;comment
      1234591;EURUSD;SHORT;12381;1,00;Sonntag;Oktober;EA V.1
      1234592;EURUSD;LONG;12380;0,70;Sonntag;Oktober;EA V.1
      1234593;EURUSD;SHORT;12382;-0,10;Sonntag;Oktober;EA V.1
      1234594;EURUSD;SHORT;12382;0,70;Montag;Oktober;EA V.1
      1234595;EURUSD;SHORT;12383;0,80;Montag;Oktober;EA V.1
      1234596;EURUSD;SHORT;666;1,00;Sonntag;Oktober;EA V.2
      1234597;EURUSD;LONG;667;0,70;Sonntag;Oktober;EA V.2
      1234598;EURUSD;SHORT;99000;-0,10;Sonntag;Oktober;EA V.3
      1234599;EURUSD;SHORT;99000;0,70;Montag;Oktober;EA V.3
      1234600;EURUSD;SHORT;77000;0,80;Montag;Oktober;EA V.4
   )"
   FileOpen(FileName, "w").Write(Inhalt)
   VarSetCapacity(Content, 0)
}
Fresh Janine
Posts: 29
Joined: 07 May 2017, 10:15

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

10 Oct 2017, 08:14

Ich wusste doch, dass euch das Spaß macht. Besonders dir just me, danke dir! Hab mich über dein Code sehr gefreut! Mir macht AHK ja auch Spaß, nur diesmal ist das Level für mich ein wenig zu hoch. Ich wollte noch, dass die Magicnumbers numerisch sortiert sind, doch wohin mit dem Befehl: "Sort MN, N D,"? Und das man die Liste editieren kann, nicht um drin rum zu schreiben, sondern einfach nur das man mehrere Magicnumbers markieren kann. Die Dropdownliste mit MT4 soll dann dafür da sein, dass man zwischen verschiedenen Listen wechseln kann. Und ich mach mir ja schon fest entschlossen Gedanken über die konkrete Anforderungsliste, doch nebenbei versuch ich auch so weit zu kommen, wie es geht :)
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

10 Oct 2017, 08:56

Ich geh mal davon aus, dass Du das Skript nur selbst nutzen willst, sodass es reicht, wenn die gewünschten Funktionen überhaupt irgendwie umgesetzt werden.

Wenn Du in einem ListView editieren willst, besteht die einfachste Lösung darin, die zu editierenden Daten in die erste Spalte zu schreiben. Dann geht das mit -ReadOnly.

Über die Sortierung bin ich auch schon gestolpert. Folgende Änderung sollte helfen, stellt die EA aber noch in die erste Spalte:

Code: Select all

Loop, Read, %AnalyseDatei%
{
   If (A_Index > 1)
   {
      Split := StrSplit(A_LoopReadLine, ";")
      EA := Split[EA_Index]
      MN := Split[MN_Index]
      If LV2_Array.HasKey(EA)
         LV2_Array[EA] .= " " . MN
      Else
         LV2_Array[EA] := MN
   }
}
For EA, MN In LV2_Array
{
   Sort, MN, D%A_Space% N U
   LV_Add("", EA, MN)
}
Fresh Janine
Posts: 29
Joined: 07 May 2017, 10:15

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

10 Oct 2017, 13:02

Ja, das Programm ist nur für mich und deine Sortierung funktioniert hervorragend!
Ich hab mir für das markieren des Textes eine andere praktische Lösung überlegt und bin auch kurz vor dem Ziel, doch es klappt nicht ganz. Vielleicht weißt du, just me, voran es liegt, schau:
Analyse01.ahk
(2.78 KiB) Downloaded 43 times
Test.txt
(3.82 KiB) Downloaded 44 times
Die Datei Test.txt entspricht nun der orginalen Liste. Ich hab nur die Kommentare und die Magicnumbers ein wenig verändert.

Das richtige Verwenden von A_EventInfo brauch ich ja dann auch für die Tabelle darüber, wo nach einem Klick dann der 2. Tab fokussiert wird und die 2 Tabellen füllen sich dann anhand der Information, was im 1. Tab in der oberen Tabelle angeklickt wurde.
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

10 Oct 2017, 15:43

AHK geht mit ListViews recht merkwürdig um. Die LV_...() Funktionen beziehen sich immer auf das Standard-ListView des aktuellen Standard-GUIs. Und das ist standardmäßig das zuletzt vor Aufruf der Funktion erstellte ListView. Selbst in dem einem ListView zugeordneten g-label wird das auslösende ListView nicht als Standard gesetzt, sein GUI dagegen schon.

Code: Select all

Copie:
Gui, ListView, LV2 ; LV2 zum Standard-ListView machen
If (A_GuiEvent = "Normal") && (Selected := LV_GetNext()) ; falls in einen leeren Bereich des ListViews geklickt wurde, nichts tun
{
   LV_GetText(MN, Selected, 2) ; Du willst ja den Inhalt der 2. Spalte
   Gui, Copie: New ; wir geben dem GUI einen Namen und machen es per New zum Standard-GUI
   Gui, Add, Edit, x0 y0 h80 w600 vCopieED, %MN%
   Gui, Show, h80 w600, Copie
}
; Guicontrol, Focus, CopieED ; überflüssig
Return
CopieGuiclose:
Gui, Destroy
Return
Fresh Janine
Posts: 29
Joined: 07 May 2017, 10:15

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

12 Oct 2017, 00:24

Hallo,

danke just me. Du hast mir da wirklich sehr geholfen! Ich hab dadurch fleißig weiter getüfftelt. Ich hab schon oft deinen Namen gesehen und wie du geduldig den Menschen weitergeholfen hast. Chapeau! An der Stelle.

Und jetzt weiß ich wieder absolut nicht weiter. Ich hab alles schön programmiert, doch wie ich am Ende, nach dem ich den Eintrag editiert habe oder einen neuen Eintrag schreibe, speichere, versteh ich nicht. Löschen geht auch nicht, doch wenn dann das andere geht, könnte es sein, das sich das von selbst erklärt.

Weiß jemand eventuell weiter?
Analyse01.ahk
(4.98 KiB) Downloaded 44 times
Liste.txt
(3.82 KiB) Downloaded 45 times
MT4-1.ini
(127 Bytes) Downloaded 50 times
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

12 Oct 2017, 03:09

Moin,

ich sehe, das Skript ist gewachsen. Ich will allerdings nicht raten, was die neuen Routinen tatsächlich machen sollen. Würdest Du das bitte genau beschreiben?

Ein paar Anmerkungen vorab:

Code: Select all

FillLV1:
Für mich sieht das so aus, als ob das ListView aus einer von mehreren INI-Dateien gefüllt wird, die über das DDL ausgewählt werden können. Du solltest dabei nicht immer wieder ein neues ListView erstellen. Das würde auch zu Fehlern führen, wenn der Name LV1 ein weiteres Mal genutzt werden soll. Stelle das Gui, Add, ListView, ... deshalb wieder nach oben.

Code: Select all

Gui Add, DropDownList, x100 y255 w305, MT4-1||MT4-2||MT4-3||MT4-4||MT4-5||MT4-6||MT4-7||MT4-8
Die Listeneinträge werden nur durch ein Pipe-Zeichen | getrennt. Nur wenn ein Eintrag ausgewählt werden soll, in diesem Fall wohl MT4-1, folgen ihm zwei Pipes.

Code: Select all

New:
Gui, ListView, LV1
{
   Gui New: New
   Gui Font, s10, Verdana
   Gui Add, Edit, x12 y12 h25 w577 vNew1
   Gui Add, Edit, x12 y50 h80 w577 vNew2
   Gui Add, Button, x240 y140 w120 h25 gSave, &Save
   Gui Show, h177 w600, New
}
Return
Verwende die Block-Klammern { ... } nur dann, wenn sie gebraucht werden. Anderenfalls kann AHK manchmal merkwürdig reagieren, wenn man den an sich funktionierenden Code noch einmal ändert.
Fresh Janine
Posts: 29
Joined: 07 May 2017, 10:15

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

12 Oct 2017, 10:15

Ich hab natürlich gleich alle Hinweise umgesetzt und bei der Dropdownliste hab ich gar keine Doppel-Pipe, weil erstmal keine Listen gefüllt werden sollen, doch das erläutere ich jetzt genauer:

Das mit der Dropdownliste im ersten Tab, hat folgenden Grund. Auf mein Server laufen mehrere MT4-Instanzen (Metatrader 4) und jeder MT4 speichert eine eigene Historie-Liste(in unseren Beispiel ist das die Liste.txt). Und auf jeden MT4 laufen unterschiedliche automatische Handelssysteme, die z.B. dann heissen wie "Pipmaker" oder "Mein eigenes System". Ich hab mir eben überlegt, dass wenn ich das Programm starte, dann soll in der Dropdownliste erstmal gar nichts ausgewählt sein und dementsprechend sollen alle Listviews auch leer sein. Erst wenn ich in der Dropdownliste eine MT4-Instanz auswähle, soll von dieser MT4-Instanz die dazugehörige Historie-Liste, für Listview "LV2", und die dazugehörige Ini-Datei, die im oberen Listview(LV1) angezeigt wird, geladen werden. Und davon hab ich auch kein Plan, wie das alles funktionieren soll.

Wenn z.B. in der Dropdownliste MT4-2 ausgewählt ist, dann soll auch nur in der MT4-2.ini gespeichert werden:
Wenn ich im EditGui auf den Save-Button klicke, dann soll die Information in der Ini-Datei überschrieben werden.
Wenn ich im NewGui auf den Save-Button klicke, dann soll die Information unten in der Ini-Datei hinzugefügt und gespeichert werden. Und jedes mal, wenn was gespeichert wurde, möchte ich die Veränderung auch sofort im Listview(LV1) sehen und genau wie mit dem Speichern, weiß ich nicht, was da der richtige Weg ist. Ergo, ich weiß überhaupt nicht mehr weiter.

Später wenn das Script fertig programmiert ist, soll wenn man im oberen Listview(LV1) auf eine Zeile doppelklickt, die 2 Tabellen im zweiten Tab, nur Informationen anhand dieser in der Zeile befindlichen Magicnumbers und natürlich anhand der aktuell ausgewählten MT4-Instanz, sich füllen.

Ich bezahl dich auch gern dafür, doch ich hab das Gefühl, du möchtest lieber für Nachfolgerschaft sorgen und dein Wissen weitergeben, was ja auch ok ist, denn schließlich gilt: Einmal Autohotkey, immer Autohotkey. Ich meine, ich hätte auch das Programm mit Visual C# entwerfen können, doch da nehm ich lieber Autohotkey.
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

12 Oct 2017, 10:59

Fresh Janine wrote:Ich meine, ich hätte auch das Programm mit Visual C# entwerfen können, doch da nehm ich lieber Autohotkey.
Dann hast Du es gut. Ich kann nur AHK, etwas VBA und LotusScript und die 'nützliche' Sprache COBOL (ohne OO-Erweiterungen).

Wenn wir hier noch weiter zusammenarbeiten, wäre es schön, wenn Du nach Änderungen Deine jeweils aktuelle Skriptversion einstellst, damit wir nicht aneinander vorbei entwickeln.

Ansonsten werde ich versuchen, das Ganze in kleinen Teilen zu realisieren. Das könnte Dich dann in die Lage versetzen, ähnliche Teilprobleme selbst zu lösen. Auch für AHK gilt die alte Weisheit: Versuch macht kluch!

Wenn ich mir Dein bisheriges Skript anschaue, habe ich das Gefühl, dass ich mir Verweise auf die Hilfedatei in der Regel ersparen kann. Ist das für Dich in Ordnung?

Alsdann: Bitte das aktuelle Skript.
Fresh Janine
Posts: 29
Joined: 07 May 2017, 10:15

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

12 Oct 2017, 12:47

Oh, sorry, ich war heute viel unterwegs. Ich hatte nur auf Grund deiner Hinweise die Kleinigkeiten verändert:
Analyse01.ahk
(4.95 KiB) Downloaded 43 times

Ja, die Verweise auf die Hilfedatei kannst du dir in der Regel ersparen. Naja und meine Fähigkeiten in Visual C# ist ähnlich wie bei Autohotkey. Recht bescheiden. Ansonsten freu ich mich, dass du so bist, wie du bist :)
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Txt-Datei auslesen und Teile davon im Gui anzeigen

13 Oct 2017, 03:35

OK, der erste Schritt.
  • Ich habe ein Objekt MT4_Instanzen eingebaut, das für die unterschiedlichen MT4-Instanzen die Namen der INI- und der Log-Dateien verwaltet. Beim Start des Skripts wird geprüft, ob die alle da sind. Die Liste für das DDL wird dabei generiert.
  • Im GUI-Bereich habe ich den übrigen ListViews Namen verpasst und dem DDL einen Namen und ein Label (NewIni:). Über dieses Label werden die Aktionen gesteuert, die beim Wechsel der Instanz erforderlich sind. Die ListViews im ersten Tab werden beim Start des Skripts nicht mehr gefüllt.
  • Ich habe den Aufbau des IniObjects geändert (siehe NewIni:). Zur Zeit enthalten die INI-Dateien ja nur Sektionen, zu denen jeweils eine Zeile mit Werten gehört, und ich denke, das kann auch so bleiben. Darum kann meiner Meinung nach der Sektionsname direkt als Schlüssel genutzt werden, dem als Wert die komplette Wertezeile zugewiesen wird. Das macht auch die spätere Bearbeitung einfacher.

Code: Select all

#NoEnv
#SingleInstance Force
SetWorkingDir %A_ScriptDir%
SetBatchLines -1 ; maximale Ausführungsgeschwindigkeit
; --------------------------------------------------------------------------------------------------------------------------------
; Objekt für die MT4-Instanzen. Als Schlüssel wird der Name der zugehörigen INI-Datei verwendet, die im Skriptverzeichnis liegen
; muss. Der zugewiesene Wert ist der vollständige Pfad der jeweiligen Log-Datei.
MT4_Instanzen := {"MT4-1": A_ScriptDir . "\Liste.txt"
                , "MT4-2": A_ScriptDir . "\Liste.txt"
                , "MT4-3": A_ScriptDir . "\Liste.txt"
                , "MT4-4": A_ScriptDir . "\Liste.txt"
                , "MT4-5": A_ScriptDir . "\Liste.txt"
                , "MT4-6": A_ScriptDir . "\Liste.txt"
                , "MT4-7": A_ScriptDir . "\Liste.txt"
                , "MT4-8": A_ScriptDir . "\Liste.txt"}
IniListe := ""
For Ini, Log In MT4_Instanzen
{
   IniDatei := A_ScriptDir . "\" . Ini . ".ini"
   If !FileExist(IniDatei)
   {
      MsgBox, 16, Fehler!, Die Ini-Datei %IniDatei% fehlt!
      Continue
   }
   If !FileExist(Log)
   {
      MsgBox, 16, Fehler!, Die Log-Datei %Log% konnte nicht gefunden werden!
      Continue
   }
   IniListe .= Ini . "|"
}
IniListe := RTrim(IniListe, "|")
; --------------------------------------------------------------------------------------------------------------------------------
Menu Tray, Icon, shell32.dll, 50
; --------------------------------------------------------------------------------------------------------------------------------
Gui Font, s10, Verdana
Gui Add, Tab2, x0 y0 w1000 h510 +Buttons +0x8 +AltSubmit vTabVariable, Hauptmenu|Expert Advisor|Detail
Gui Tab, 1
Gui, Add, ListView, x100 y45 w800 h200 gShow vLV1, Expert Advisor                |Magicnumber
Gui Add, DropDownList, x100 y255 w305 vDDL1 gNewIni, %IniListe%
Gui Add, Button, x415 y254 w100 h23 gEdit, &Edit
Gui Add, Button, x520 y254 w100 h23 gNew, &New
Gui Add, Button, x625 y254 w100 h23 gDelete, &Delete
Gui Add, ListView,backgroundteal csilver grid x100 y290 w800 h195 altsubmit gCopy vLV2, Kommentar                    |Magicnumber
Gui Tab, 2
Gui Add, ListView, x40 y35 w400 h460 vLV3, Datum              |Tag              |Gewinn
Gui Add, ListView, x460 y35 w300 h460 vLV4, Jahr         |Monat           |Gewinn
Gui Add, Button, x780 y60 w150 h23, &Komplette Historie
Gui Add, DropDownList, x780 y100 w150, EURUSD||GBPUSD|AUDUSD
Gui Tab, 3
Gui Add, ListView, x0 y20 w1000 h468 vLV5, Kommentar|Ordernummer|Closetime|Slippage|Typ|Volumen|Symbol|Gewinn
Gui Add, Text, x780 y488 w220 h23 +E0x200, Gesamtsumme:
; --------------------------------------------------------------------------------------------------------------------------------
Gui Show, w1000 h510, Analyse
Return
; --------------------------------------------------------------------------------------------------------------------------------
GuiEscape:
GuiClose:
ExitApp
; --------------------------------------------------------------------------------------------------------------------------------
NewIni:
GuiControlGet, IniName, , DDL1
IniDatei := A_ScriptDir . "\" . IniName . ".ini"
AnalyseDatei := MT4_Instanzen[IniName]
Loop, 5 ; ListViews leeren
{
   Gui, ListView, LV%A_Index%
   LV_Delete()
}
IniObject := {}
IniRead, Sections, %IniDatei%
Loop, Parse, Sections, `n
{
   Section := A_LoopField
   IniRead, Value, %IniDatei%, %Section%
   IniObject[Section] := Value
}
GoSub, FillLV2
GoSub, FillLV1
Return
; --------------------------------------------------------------------------------------------------------------------------------
FillLV1:
Gui, ListView, LV1
GuiControl, -ReDraw, LV1
For Section, Numbers In IniObject
   LV_Add("", Section, Numbers)
Loop, % LV_GetCount("Column")
   LV_ModifyCol(A_Index, "AutoHdr")
GuiControl, +ReDraw, LV1
Return
; --------------------------------------------------------------------------------------------------------------------------------
FillLV2:
Gui, ListView, LV2
GuiControl, -ReDraw, LV2
LV2_Array := []
LV2_Columns := 2
EA_Index := 12
MN_Index := 4
Loop, Read, %AnalyseDatei%
{
   If (A_Index > 1)
   {
      Split := StrSplit(A_LoopReadLine, ";")
      EA := Split[EA_Index]
      MN := Split[MN_Index]
      If LV2_Array.HasKey(EA)
         LV2_Array[EA] .= " " . MN
      Else
         LV2_Array[EA] := MN
   }
}
For EA, MN In LV2_Array
{
   Sort, MN, D%A_Space% N U
   LV_Add("", EA, MN)
}
Loop, %LV2_Columns%
   LV_ModifyCol(A_Index, "AutoHdr")
GuiControl, +ReDraw, LV2
Return
; --------------------------------------------------------------------------------------------------------------------------------
Copy:
Gui, ListView, LV2
If (A_GuiEvent = "Normal") && (Selected := LV_GetNext())
{
   LV_GetText(MN, Selected, 2)
   Gui Copy: New
   Gui Font, s10, Verdana
   Gui Add, Edit, x0 y0 h80 w600 vCopyED, %MN%
   Gui Show, h80 w600, Copy
}
Return
CopyGuiclose:
Gui, Destroy
Return
; --------------------------------------------------------------------------------------------------------------------------------
Edit:
Gui, ListView, LV1
If (Selected := LV_GetNext())
{
   LV_GetText(CurrentIndex, Selected, 1)
   LV_GetText(CurrentSection, Selected, 2)
   Gui Edit: New
   Gui Font, s10, Verdana
   Gui Add, Edit, x12 y12 h25 w577 vEdit1, %CurrentIndex%
   Gui Add, Edit, x12 y50 h80 w577 vEdit2, %CurrentSection%
   Gui Add, Button, x240 y140 w120 h25 gSave, &Save
   Gui Show, h177 w600, Edit
}
Return
EditGuiclose:
Gui, Destroy
Return

Save:
GuiControl, +Redraw, SysListView321
Gui, Destroy
Return
; --------------------------------------------------------------------------------------------------------------------------------
New:
Gui, ListView, LV1
Gui New: New
Gui Font, s10, Verdana
Gui Add, Edit, x12 y12 h25 w577 vNew1
Gui Add, Edit, x12 y50 h80 w577 vNew2
Gui Add, Button, x240 y140 w120 h25 gSave, &Save
Gui Show, h177 w600, New
Return
NewGuiclose:
Gui, Destroy
Return
; --------------------------------------------------------------------------------------------------------------------------------
Delete:
Gui, ListView, LV1
If (Selected := LV_GetNext())
{
   Loop, 5
    LV_GetText(CurrentIndex, Selected, 1)
   Gui Delete: New
   Gui Font, s10, Verdana
   Gui Add, Text, x10 y22 w380 h25 +0x200 Center, %CurrentIndex% löschen?
   Gui Add, Button, x50 y65 w120 h25 gJa, &Ja
   Gui Add, Button, x220 y65 w120 h25 gNein, &Nein
   Gui Show, w400 h115, Delete
}
Return
Nein:
DeleteGuiclose:
Gui, Destroy
Return

Ja:
Loop, % Line0 - CurrentIndex + 1
{
CurrentIndex := A_Index - 1
CurrentSection := A_LoopField - 1
IniObject[CurrentIndex] := [CurrentSection]
}
Line0--
;GoSub,Filllist
Gui, Destroy
Return
; --------------------------------------------------------------------------------------------------------------------------------
Show:
Gui, ListView, LV1
If (A_GuiEvent = "Doubleclick") && (Selected := LV_GetNext())
{
   LV_GetText(CurrentSection, Selected, 2)
}
Guicontrol, Focus, Gui Tab 2
Return
Über das Thema 'Bezahlung' können wir uns unterhalten, wenn Du mit dem Skript zufrieden bist. Der AutoHotkey Foundation enstehen ja für den Betrieb dieses Forums laufende Kosten. Eine Spende mag da hilfreich sein. Mit einer kommerziellen Weiterverwertung des Skripts bin ich aber unter keinen Umständen einverstanden.

Wenn das bisher OK ist, mach mal einen Vorschlag, womit es weitergehen soll.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 28 guests