Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi ProgressBar (Update GUI) (https://www.delphipraxis.net/209383-progressbar-update-gui.html)

sILeNt heLLsCrEAm 29. Nov 2021 14:29

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

haentschman 30. Nov 2021 05:32

AW: ProgressBar (Update GUI)
 
Moin...:P
...probiere Mal:
Delphi-Quellcode:
procedure StatusShown();
begin
  // Label Caption - Anzeige was gemacht wird...
  Form1.Progressar1.StepBy(5);
  Form1.Progressar1.Repaint; // alternativ: ApplicationProcessMessages;
end;
Ein paar Tipps:
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:

venice2 30. Nov 2021 07:06

AW: ProgressBar (Update GUI)
 
Oder der Progressbar etwas zeit geben zum zeichnen.

Delphi-Quellcode:
 
Progress := trunc(100 * (Bass_ChannelGetPosition(Channel, BASS_POS_BYTE) / Bass_ChannelGetLength
  (Channel, BASS_POS_BYTE)));  
if (ProgressBar1.Position <> Progress) then
  ProgressBar1.Position := Progress;
Bei mir ist Progress die aktuelle Position im stream.
Vor allem entlastet diese abfrage die CPU doch ungemein.

Dokumentation mit und ohne vergleich

himitsu 30. Nov 2021 08:11

AW: ProgressBar (Update GUI)
 
Zitat:

Delphi-Quellcode:
Form1.Progressar1.StepBy(5);
Form1.Progressar1.Repaint;

Sobalb Windows, ab etwa 5 Sekunden (so viel ist in der Registry eingestellt), das Fenster durch's AppHang-Fenster ersetzt, war es das damit ... also besser nicht die Maus auch nur einen Pixel über's Fenster bewegen.

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)

sILeNt heLLsCrEAm 30. Nov 2021 21:36

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

haentschman 1. Dez 2021 05:57

AW: ProgressBar (Update GUI)
 
Moin...8-)
Delphi-Quellcode:
TForm1 = class
private
...
  procedure StatusShown;
public
...
end;
.
.
procedure TForm1.StatusShown;
begin
...
end;

sILeNt heLLsCrEAm 1. Dez 2021 07:40

AW: ProgressBar (Update GUI)
 
Guten Morgen,
das hatte ich bereits probiert.
Da meckert die IDE wegen nicht genügend Forward Deklarationen...

haentschman 1. Dez 2021 07:51

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:

sILeNt heLLsCrEAm 1. Dez 2021 10:28

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

Uwe Raabe 1. Dez 2021 10:29

AW: ProgressBar (Update GUI)
 
Zitat:

Zitat von haentschman (Beitrag 1498479)
PS: wie spricht man eigentlich deinen Nicknamen aus?

Deutsche Übersetzung: Leise Höllensahne


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:44 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz