AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ProgressBar (Update GUI)

Ein Thema von sILeNt heLLsCrEAm · begonnen am 29. Nov 2021 · letzter Beitrag vom 1. Dez 2021
Antwort Antwort
Seite 1 von 2  1 2      
sILeNt heLLsCrEAm

Registriert seit: 19. Dez 2012
13 Beiträge
 
Delphi 11 Alexandria
 
#1

ProgressBar (Update GUI)

  Alt 29. Nov 2021, 15:29
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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#2

AW: ProgressBar (Update GUI)

  Alt 30. Nov 2021, 06:32
Moin...
...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. ...aber bitte den Komponenten auch sprechende Namen geben.(ProgressBar1, Label1)
3. Einrückung könnte besser sein.

  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#3

AW: ProgressBar (Update GUI)

  Alt 30. Nov 2021, 08:06
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

Geändert von venice2 (30. Nov 2021 um 08:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: ProgressBar (Update GUI)

  Alt 30. Nov 2021, 09:11
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)
$2B or not $2B
  Mit Zitat antworten Zitat
sILeNt heLLsCrEAm

Registriert seit: 19. Dez 2012
13 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: ProgressBar (Update GUI)

  Alt 30. Nov 2021, 22:36
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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#6

AW: ProgressBar (Update GUI)

  Alt 1. Dez 2021, 06:57
Moin...
Delphi-Quellcode:
TForm1 = class
private
...
  procedure StatusShown;
public
...
end;
.
.
procedure TForm1.StatusShown;
begin
...
end;
  Mit Zitat antworten Zitat
sILeNt heLLsCrEAm

Registriert seit: 19. Dez 2012
13 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: ProgressBar (Update GUI)

  Alt 1. Dez 2021, 08:40
Guten Morgen,
das hatte ich bereits probiert.
Da meckert die IDE wegen nicht genügend Forward Deklarationen...
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#8

AW: ProgressBar (Update GUI)

  Alt 1. Dez 2021, 08:51
zeig mal die gesamte Unit.

PS: wie spricht man eigentlich deinen Nicknamen aus? Keiner denkt an die alten Knacker hier...

Geändert von haentschman ( 1. Dez 2021 um 08:59 Uhr)
  Mit Zitat antworten Zitat
sILeNt heLLsCrEAm

Registriert seit: 19. Dez 2012
13 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: ProgressBar (Update GUI)

  Alt 1. Dez 2021, 11:28
@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...
Angehängte Dateien
Dateityp: rar Unit1.rar (4,8 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#10

AW: ProgressBar (Update GUI)

  Alt 1. Dez 2021, 11:29
PS: wie spricht man eigentlich deinen Nicknamen aus?
Deutsche Übersetzung: Leise Höllensahne
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:38 Uhr.
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