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..37] of 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
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?
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
FinnO hat folgendes geschrieben : |
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..9] of 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
Don Krawallo hat folgendes geschrieben : |
[...] 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!