Autor |
Beitrag |
uNkn0wn_d4_r3aL
Hält's aus hier
Beiträge: 12
|
Verfasst: Mi 02.03.05 23:10
So,
hab ein neues Problem:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| DosCommand1.CommandLine := 'ftp.exe holedaten'; DosCommand1.Execute; DosCommand1.OutputLines := Memo1.Lines;
DosCommand1.CommandLine := 'ftp.exe holedaten'; DosCommand1.Execute; DosCommand1.OutputLines := Memo1.Lines; |
Das ist ein Beispiel für das Problem.
Das Programm holt Daten von einem Server, schreibt das Ergebnis in die Memo1 und soll erst, wenn die Daten da sind, den nächsten Command ausführen (bzw. die nächsten Daten holen)!
Man könnte eine Zeit zum warte setzen oder irgendwie mit if warten bis was in die Memo geschrieben wird, aber ich weis nicht wie ich das umsetzten soll
gruß
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 03.03.05 00:03
probiere mal den zweiten aufruf in das ereignis memo1OnChange zu schreiben.
|
|
uNkn0wn_d4_r3aL 
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 03.03.05 00:08
Ich denke nicht, dass es so funktioniert, da es mehr als 2 Aufrufe sind!
Wie sollte der Code denn dann aussehen?
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 03.03.05 00:14
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| proc button1click; begin DosCommand1.CommandLine := 'ftp.exe holedaten'; DosCommand1.Execute; DosCommand1.OutputLines := Memo1.Lines; end;
proc memo1change; begin DosCommand1.CommandLine := 'ftp.exe holedaten'; DosCommand1.Execute; DosCommand1.OutputLines := Memo1.Lines; end; |
kannst natürlich auch nen counter einbauen und abhängig von dessen wert bei memo1change jeweils andere befehle ausführen
|
|
uNkn0wn_d4_r3aL 
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 03.03.05 00:21
Hm, das mit dem Counter hab ich nicht ganz verstanden!
Wenn man Button klickt, soll das so ausgeführt werden:
holedaten1, wenn fertig
=> hole daten2, wenn fertig
=> hole daten3, wenn fertig
.....
Natürlich alles mit DosCommand!
Wie man das einbaut, ist mir noch nicht so ganz klar!?
gruß
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 03.03.05 00:26
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| var counter : integer = 0;
proc button1click; begin inc(counter); DosCommand1.CommandLine := 'ftp.exe holedaten1'; DosCommand1.Execute; DosCommand1.OutputLines := Memo1.Lines; end;
proc memo1change; begin inc(counter); case counter of 2: DosCommand1.CommandLine := 'ftp.exe holedaten2'; 3: DosCommand1.CommandLine := 'ftp.exe holedaten3'; end; DosCommand1.Execute; DosCommand1.OutputLines := Memo1.Lines; end; |
edit: gibt aber sicher auch bei dem doscommand teil ein event OnFinished oder so
das würde ich eher hernehmen
|
|
uNkn0wn_d4_r3aL 
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 03.03.05 00:39
Danke, das sieht nicht schlecht aus!
Das Problem ist jetzt allerdings Folgendes:
Es gibt noch andere Aufrufe, die etwas in die Memo1 schreiben!
Wie kann ich nun verhindern, dass die Befehle von Memo1Change nur bei speziellen (ftp z.B.) Aufrufen ausgeführt werden udn nicht bei allen, die etwas in die Memo1 schreiben!
gruß
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 03.03.05 00:42
siehe das was ich unter meinen letzten post dazugeschrieben hab.
|
|
uNkn0wn_d4_r3aL 
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 03.03.05 00:46
Ja, eben gesehen.
In der "Anleitung" steht das hier:
Zitat: | - you can have an event for each new line and for the end of the process
with the events 'procedure OnNewLine(Sender: TObject; NewLine: string;
OutputType: TOutputType);' and 'procedure OnTerminated(Sender: TObject);' |
Nur leider kann ich damit wenig anfange und weis wieder nicht wie ich es einbinde kann!?
Danke für deine Bemühungen!
/edit:
Vielleicht kennt sich einer speziell mit TDosCommand aus und kann helfen!
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 03.03.05 01:00
das onTerminate sieht nicht schlecht aus
mach also nach jedem aufruf von doscommand1 ein terminate.
in dem event erstellst du das teil erst nochmal und führst dann das jeweils nächste aus
n andrer vorschlag wäre das einfach alles in eine batchdatei zu schreiben und die dann auszuführen
|
|
uNkn0wn_d4_r3aL 
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 03.03.05 08:19
Zitat: | in dem event erstellst du das teil erst nochmal und führst dann das jeweils nächste aus |
hm, kannst mir das bisschen erläutern?
|
|
uNkn0wn_d4_r3aL 
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 03.03.05 17:01
Also das mit der Batch ist schlecht, da ich dann keine Variablen als Parameter benutzen kann ( ftp.exe -var1 -var2 ...)
Weis sosnt keiner eine Lösung?
Wie binde ich OnTerminate ein?!
gruß
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 03.03.05 17:25
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| assignfile(f, GetPath(Edit1.Text) + 'zipvalid.bat'); rewrite(f); writeln(f, 'cd ' + GetPath(Edit1.Text)); writeln(f, 'for %%a in (*.zip) do "' + GetPath(Application.exeName) + 'pkunzip" %%a -t >> zipvalid.txt'); closefile(f); Application.ProcessMessages; runcaptured(GetPath(Edit1.Text) + 'zipvalid.bat',''); |
dies ist code aus dem prog zipchecker von meiner hp gibts dort mit source
da wird erst ne batch mit variablem inhalt erstellt und dann ausgeführt.
|
|
wdbee
      
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: Do 03.03.05 18:08
 Wenn ich dein Problem verstehen würde, könnte ich dir wohl helfen.
Du hast da etwas, was DosCommand1 heißt. Du sagst dem Teil, was es machen soll und lässt die Bestie dann mit Execute los. Anschließend teilst du dem Biest dann mit, was es als Ausgabe (OutputLines) haben soll?
Soll das vieleicht heißen, du möchtest alles was in OutputLines steht im Memo sehen? Dann sollte das doch sicher umgekehrt sein:
Quelltext 1:
| Memo1.Lines.Assign(DosCommand1.OutputLines); |
Also nicht den Zeiger Memo1.Lines mit dem Zeiger DosCommand1.OutputLines überschreiben (nicht Memo1.Lines := DosCommand1.OutputLines;, was umgekehrt in dem Code steht), sondern alle Zeilen der einen Stringliste in die andere kopieren! Habe ich das so richtig verstanden?
Wenn ja, dann die Frage, wann kehrt der Aufruf von Execute zurück?
Wenn das Teil synchron arbeitet, es also erst dann kommt, wenn alle Aufgaben erledigt sind, dann hast du doch kein Problem. Wenn es aber sofort zurückkommt und die Bearbeitung asynchron abläuft, dann musst du erst mal warten, bevor du die Ergebnisse in dein Memo übernimmst!
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| var BitteWarten: Boolean; MaxLoops: Integer; procedure DoTerminate(Sender: TObject); ... DosCommand1.OnTerminate := DoTerminate; ... BitteWarten := True; MaxLoops := 1000; DosCommand1.Command := 'Was auch immer'; DosCommand1.Execute; while BitteWarten do begin Application.ProcressMessages; Sleep(60); Dec(MaxLoops); if MaxLoops < 1 then break; end;
if BitteWarten then begin ... Exit; end;
... procedure DoTerminate(Sender: TObject); begin Memo1.Lines.Assign(DosCommand1.OutputLines); BitteWarten := False; end; |
Passt das oder habe ich da was falsch verstanden?
|
|
uNkn0wn_d4_r3aL 
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 03.03.05 21:59
Danke, danke!
Könnte passen, aber ich hab das ganze jetzt erstmal mit einer Batch realisiert.
Das klappt auch.
Die "Delphi-Umsetzung" kommt erst später
Werd dann wieder hier posten, wenns weitere Probleme gibt!
gruß
|
|