![]() |
ProgressBar (Update GUI)
Hallo Liebe Community,
ich Versuche hier mal mein Problem zu schildern... Folgendes, ich programmiere recht erfolgreich die unterschiedlichsten Trainer für verschiedene Games. Nun kann es manchmal passieren das ein User den entsprechenden Trainer passend zur Spielversion nutzt, aber dennoch nicht funktioniert. So, nun habe ich mir einen Address Searcher gebastelt welchen dann ein User nutzen kann bzw. ich die entsprechenden Offsets im Spieleprozess auf dem Rechner des Users suche. Das funktioniert auch soweit, das ist nicht das Problem. Nun bin ich dabei diesen Searcher zu optimieren und wollte nun eine ProgressBar einbauen. Der Code sieht nun folgendermaßen aus...
Code:
procedure StatusShown();
begin // Label Caption - Anzeige was gemacht wird... Form1.ProgressBar1.StepBy(5); end; procedure TForm1.Button1Click(Sender: TObject); begin // Search Button deaktivieren Button1.Enabled:= False; // ProgressBar zurücksetzen bzw. auf Anfang ProgressBar1.Position:= 0; ProgressBar1.Min:= 0; ProgressBar1.Max:= 300; // MD5 Hash ermitteln MD5Hash:= MD5(GetModulePath(ProcessFile, ProcID)); StatusShown(); //Dateipfad ermitteln Dateipfad:= GetModulePath(ProcessFile, ProcID); // Dateiversion ermitteln Versionsergebnis:= GetFileVersion(Dateipfad); StatusShown(); // Produktversion ermitteln Produktversion:= GetFileInfo(Dateipfad, 'ProductVersion'); StatusShown(); // Basisadresse ermitteln GetBaseAddy(DLLName, BaseAddy); // Hier werden die einzelnen Addy's gesucht... // Beispiel... // AmmoAddy:= Search(AmmoSearch); SectionAuslesen(BaseAddy); StatusShown; HealthAddy:= SearchMore(BaseAddy, HealthSearch); StatusShown; OneHitKillAddy:= SearchMore(BaseAddy, OneHitKillSearch); StatusShown; Stamina1Addy:= SearchMore(BaseAddy, Stamina1Search); StatusShown; Stamina2Addy:= SearchMore(BaseAddy, Stamina2Search); StatusShown; AmmoAddy:= SearchMore(BaseAddy, AmmoSearch); StatusShown; NoReloadAddy:= SearchMore(BaseAddy, NoReloadSearch); StatusShown; ThrowablesAddy:= SearchMore(BaseAddy, ThrowablesSearch); StatusShown; FreeSection; // Die Anzahl der auszulesenden Bytes kann/sollte noch angepasst werden... HealthValue:= ReadMemory(50, HealthAddy); StatusShown; OneHitKillValue:= ReadMemory(50, OneHitKillAddy); StatusShown; Stamina1Value:= ReadMemory(50, Stamina1Addy); StatusShown; Stamina2Value:= ReadMemory(50, Stamina2Addy); StatusShown; AmmoValue:= ReadMemory(50, AmmoAddy); StatusShown; NoReloadValue:= ReadMemory(50, NoReloadAddy); StatusShown; ThrowablesValue:= ReadMemory(50, ThrowablesAddy); StatusShown; end; // Search Button aktivieren Button1.Enabled:= True; if ProcID = -1 then begin Label1.Caption:= 'DyingLightGame.exe not found in memory...' + #13#10 + 'Please make sure that the game is running...'; end; end; Nun ist es ja so daß die ProgressBar innerhalb dieses Button.Click Ereignisses zwar aktualisiert wird, allerdings ist dieses nicht sichtbar. Erst wenn die Button Prozedur komplett abgearbeitet wurde ist auch die ProgressBar bei 100%. Als workaround hab ich die "ProgressBar1.Stepby(5)" innerhalb einer eigenen Prozedur verfasst. Das funktioniert auch soweit ganz gut, wenn da nicht die Antiviren-/Firewalllösung dazwischen funken würde. Ich nutze z.B. Kaspersky, wenn der Searcher ausgeführt wird meldet sich Kaspersky und ich muss z.B. das Ausführen des Programms erlauben. Ist ja auch okay, aber die ProgressBar wird wiederrum erst nach dem kompletten abarbeiten geändert. Starte ich diesen Searcher das zweite Mal (mittlerweile ist der Searcher Kaspersky bekannt) dann funktioniert auch das updaten der ProgressBar. Nun wäre meine Frage ob es nicht eine bessere Lösung hierfür gibt. Mit Threads habe ich hier noch nicht gearbeitet, das wäre noch meine nächste Idee... Vielen Dank für's aufmerksame lesen und vielen Dank für eure Lösungsvorschläge... MfG sILeNt |
AW: ProgressBar (Update GUI)
Moin...:P
...probiere Mal:
Delphi-Quellcode:
Ein paar Tipps:
procedure StatusShown();
begin // Label Caption - Anzeige was gemacht wird... Form1.Progressar1.StepBy(5); Form1.Progressar1.Repaint; // alternativ: ApplicationProcessMessages; end; 1. procedure StatusShown; besser als private procedure in der Form Klasse anlegen. Dann braucht man Form1. nicht mehr. 2. HealthAddy etc. :thumb: ...aber bitte den Komponenten auch sprechende Namen geben.(ProgressBar1, Label1) 3. Einrückung könnte besser sein. :zwinker: :wink: |
AW: ProgressBar (Update GUI)
Oder der Progressbar etwas zeit geben zum zeichnen.
Delphi-Quellcode:
Bei mir ist Progress die aktuelle Position im stream.Progress := trunc(100 * (Bass_ChannelGetPosition(Channel, BASS_POS_BYTE) / Bass_ChannelGetLength (Channel, BASS_POS_BYTE))); if (ProgressBar1.Position <> Progress) then ProgressBar1.Position := Progress; Vor allem entlastet diese abfrage die CPU doch ungemein. ![]() |
AW: ProgressBar (Update GUI)
Zitat:
Threads? Nja, ich hatte mal ApplicationProcessMessages so umgebaut, dass Tastatur- und Mausevents später oder nicht ausgeführt werden. (Timer kann man leider nicht verschieben, weil die nie in der MessageQueue speichert sind) |
AW: ProgressBar (Update GUI)
Erstmal vielen lieben Dank für eure reichhaltigen Antworten. Fürs erste hab ich mich für die Lösung von "haentschman" entschieden, was aber nicht heißt das ich die anderen nicht auch noch testen werde. Vielleicht werde ich das in die Richtung mit Threads lösen, oder auch so daß wenn der Searcher gestartet wird der Search Button deaktiviert bleibt solange bis der entsprechende Game Prozess gefunden wurde. Denn wenn dieser dann gefunden wird bzw. eine Interaktion stattfindet und sich die Antiviren-/Firewalllösung des Users meldet muss dieser erstmal hier aktiv werden bevor der Button freigeschaltet wird. Ist dies dann einmal geschehen klappt's ja auch reibungslos mit dem Searcher...
Eine Frage hätte ich dann noch... Wie sieht denn da die Private Deklaration für die Prozeduren StatusShown aus? MfG sIleNt |
AW: ProgressBar (Update GUI)
Moin...8-)
Delphi-Quellcode:
TForm1 = class
private ... procedure StatusShown; public ... end; . . procedure TForm1.StatusShown; begin ... end; |
AW: ProgressBar (Update GUI)
Guten Morgen,
das hatte ich bereits probiert. Da meckert die IDE wegen nicht genügend Forward Deklarationen... |
AW: ProgressBar (Update GUI)
zeig mal die gesamte Unit.
PS: wie spricht man eigentlich deinen Nicknamen aus? :wink: Keiner denkt an die alten Knacker hier...:stupid: |
AW: ProgressBar (Update GUI)
Liste der Anhänge anzeigen (Anzahl: 1)
@haentschman
Wohnort Seifhennersdorf??? Das is ja quasi um die Ecke... :-)) Unit1 --- Siehe Anhang. Da ich mir nebenbei noch ein Tool schreibe welches mir jeweils nen passenden Sourcecode ausspuckt bedarf es hier noch einiger Schönheitskorrekturen. Aber es geht ja erstmal ums Prinzip... |
AW: ProgressBar (Update GUI)
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz