Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Editbox ein/auslesen


Don Krawallo - Mo 23.08.10 17:35
Titel: Editbox ein/auslesen
Ich wünsche einen schönen guten Tag an alle Member hier im Forum...

Tja... Wo fange ich am besten an? Wie das Thema schon sagt gehts um das Ein- bzw. Auslesen einer Editbox.

Folgender Fall liegt dem zugrunde... Ich hab schon ein paar Spieletrainer programmiert und teilweise kommen auch ganz schöne
Datenmengen zusammen. Die Daten die ich per "WriteProcessMemory" in den fremden Prozess einfüge werden wie folgt geschrieben:

Delphi-Quelltext
1:
CCCrystal: array[0..37of byte = ($80$3d$fe$03, .............., $e9$97$86$5e$00$90);                    

Wie ihr seht sind in diesem array 38 Zeichen aufgeführt. Jedes Mal wenn ich ein solches array schreibe muss ich praktisch
das "$" vor jedem Hex-Zeichen und ein ", " nach jedem Hex-Zeichen mühselig eintippen...

Mein Ziel ist es nun eine Art Converter zu programmieren der mir diese Arbeit abnimmt. Aber da ich auch grade mit Delphi anfange
mehr als nur simple Trainer zu schreiben stellt dieses doch ein Problem für mich dar.
Der Converter in seiner Grundform existiert schon, d.h. ich habe eine Form1 auf der sich 2 Editboxen befinden. Eine (Edit1) um einen String
nach beispielsweise diesem Format "c7 81 00 01 00 00 00 00 00 00" einzulesen, die andere (Edit2) um den umgewandelten String, der dann
folgendermaßen aussehen würde "($c7, $81, $00, $01, $00, $00, $00, $00, $00, $00)" wieder auszugeben.

Ich hab mich ein bissl in Delphi eingelesen was Schleifen betrifft und ich muss sagen das ich da schon am verzweifeln bin.

Vielleicht kann einer von euch mir einen, oder auch zwei Tipps in die richtige Richtung geben?

Vielen Dank schon mal im vorraus.
MFG Don Krawallo

PS: Falls das noch hilfreich sein sollte... Als Programmierumgebung steht mir Delphi 2010 zur Verfügung.


FinnO - Mo 23.08.10 17:39

Moin,

also in deinem Fall könntest du mit Suche in der Delphi-Reference STRINGREPLACE komplett ohne Schleife auskommen.

du müsstest dann die Leerzeichen nur mit der entsprechenden kombination ersetzen ;-)

LG


platzwart - Mo 23.08.10 17:40


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
myResult:= '(' + CCCrystal[0];

for i:=1 to CCCrystal.Count-1 do
 begin
  myResult:= myResult + ', $' + CCCrystal[i];
 end;

myResult:= myResult + ')';


Habe ich das so richtig verstanden?


elundril - Mo 23.08.10 17:42

Alternativ falls du es doch mit Schleifen probieren willst, mit PosEx und einer while-schleife sollte es gehen.

Das hier könnte dir helfen:

Delphi-Wikibook [http://de.wikibooks.org/wiki/Programmierkurs:_Delphi]
Christian's Crashkurs [http://www.christian-stelzmann.de/index_tutorials_crashkurs.html]


FinnO - Mo 23.08.10 17:44

Hey,

@Platzwart:

ich glaube, das hast du nicht richtig verstanden. Ich habe das so interpretiert, dass er ein hilfetool haben möchte, dass aus "00 82 FE 23" $00, $82, $FE, $23" macht. Das ginge mit Stringreplace relativ unkompliziert in etwa einer Zeile.

LG


platzwart - Mo 23.08.10 17:48

Aso, jap, in dem Fall gebe ich dir recht ;)


Don Krawallo - Mo 23.08.10 17:55

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
Hey,

@Platzwart:

ich glaube, das hast du nicht richtig verstanden. Ich habe das so interpretiert, dass er ein hilfetool haben möchte, dass aus "00 82 FE 23" $00, $82, $FE, $23" macht. Das ginge mit Stringreplace relativ unkompliziert in etwa einer Zeile.

LG


Genau so möchte ich das verstanden wissen... @FinnO hat die Problematik richtig erkannt.
Es muss natürlich keine Schleife durchlaufen werden wenn das auch ohne geht.

Ich hab mal interessehalber im netz nach anderen Programmiersprachen in diesem Zusammenhang gegoogelt.
Bei Visual Basic gibts eine eigene Funktion um Strings zu splitten, das ganze in Verbindung mit einer FOR Schleife soll da gute
Ergebnisse liefern. Von daher "dachte" ich das in Delphi ebenfalls eine Schleife nötig sei.

Insofern werd ich das mal mit Stringreplace probieren... Bei Problemen... Ich weiß ja wo ich euch finden kann :lol: :lol: :lol:

Aber bis dahin Danke erstmal


Don Krawallo - Mo 23.08.10 19:42

Hallöchen nochmal...

Also um ehrlich zu sein kann ich mit der Funktion wie sie hier http://docwiki.embarcadero.com/VCL/de/SysUtils.StringReplace beschrieben ist nicht viel anfangen.

Momentan hab ich das insofern gelöst...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Edit1Change(Sender: TObject);

begin
    NewString := StringReplace(Edit1.Text, ' '', $', [rfReplaceAll, rfIgnoreCase]);
    Edit2.Text := 'array [0..] of byte = ($' + NewString + ')';
end;
Ist vielleicht nicht unbedingt die professionelste Variante, aber für meine Verhältnisse (zu was ich den Converter nutze) langt das vollkommen.


Was mich allerdings noch interessieren würde, bzw. um das komplett zu automatisieren wäre das ganz hilfreich
wenn die Array Größe gleich mit berechnet wird. Ob ich mich klar ausgedrückt habe weiß ich nicht, deshalb hier ein Beispiel:
...aus "D3 C8 7C 48 85 DC C7 68 D3 C8" wird

Delphi-Quelltext
1:
array [0..9of byte = ($D3$C8$7C$48$85$DC$C7$68$D3$C8)                    

Was ich nun meinte ist das die Zahl 9 in den [] automatisch berechnet wird.
Dann wäre insofern der Converter auch komplett.

Gruß Don Krawallo


elundril - Mo 23.08.10 19:46

Du könntest dann einfach alle Beistriche Zählen. Das gibt dir dann die zweite Zahl in der Klammer.

lg elundril


Don Krawallo - Mo 23.08.10 21:34

Männers... Ihr seid echt ne Wucht.
An dieser Stelle bedank ich mich ganz herzlich für eure konstruktiven Beiträge.
Das Forum hier ist wirklich ganz große Klasse.

Vielen Dank.

Zum Abschluss noch für die die es interessiert. So habe ich das nun gelöst...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Edit1Change(Sender: TObject);
var s: string;
    i,z: integer;

begin
    NewString := StringReplace(Edit1.Text, ' '', $', [rfReplaceAll, rfIgnoreCase]);
    Edit2.Text := 'array [0..] of byte = ($' + NewString + ')';

    s := Edit2.Text ;
    z := 0;
    for i := 0 to length(s) do begin
     if (UpperCase(s[i]) = ','then inc(z);
    end;

    ArrayZähler1  := IntToStr(z);
    Edit2.Text :=  'array [0..' + ArrayZähler1 + '] of byte = ($' + NewString + ')';

end;


Gruß Don Krawallo


Marc. - Mo 23.08.10 22:55

user profile iconDon Krawallo hat folgendes geschrieben Zum zitierten Posting springen:
[...]

Delphi-Quelltext
1:
2:
3:
4:
    for i := 0 to length(s) do begin
     if (UpperCase(s[i]) = ','then inc(z);
    end;
[...]

Kleiner Verbesserungsvorschlag: Strings beginnen immer bei 1! :)


jaenicke - Di 24.08.10 05:50

Außerdem kannst du dir das UpperCase sparen. Denn ein Komma großgeschrieben ist... richtig, auch nur ein Komma. ;-)


elundril - Di 24.08.10 06:50

wäre man mit ner schleife + posex nicht schneller dran?

lg elundril


jaenicke - Di 24.08.10 12:34

Nein, denn das muss auch alle Zeichen durchgehen, nur dass man jeweils die Aufrufe von PosEx und die entsprechenden Checks für den Start noch hat.
Das ist zwar nicht viel langsamer, aber ganz bestimmt nicht schneller.

Schneller ginge es höchstens mit repne scasb auf Assemblerebene oder mit Delphiquelltext über einen Pointer auf das aktuelle Char und Inc statt normalem zeichenweisem Durchgehen. Das lohnt sich aber kaum, weil es bei einer solchen Schleife nicht viel zu optimieren gibt.