Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - aus memo auslesen? edit1 mit den ersten 5 zeichen überprüfen
5M17H - So 24.09.06 12:35
Titel: aus memo auslesen? edit1 mit den ersten 5 zeichen überprüfen
Hallo an alle.
Ich möchte memo1 eine zeile einfügen, wo ich dann n passwort reinschreibe.
Man soll also die datei öffnen können, sieht aber nur zahlen (siehe freeware projekte 'sf editor v 1.3'). Dann gibts nen menüe punkt wo steht: 'Ver-/Entschlüsseln'.
Jetzt kann man die datei ja mit dem wineditor öffnen, und ich will nicht, das man da dan weis: die ersten 4 zahlen sind das passwort, und dass passwort dan weis. Desswegen möchte ich das passwort aufteilen. Quasi zerhacken. 2stellen in zeile 11 und 5 steleln und zeile 13 oder so.
Wie geht das?
PS: memo1.lines.add bringt ja nix, fügt ja nur am schluss eine zeile dran.
Moderiert von
Christian S.: Topic aus Dateizugriff verschoben am So 24.09.2006 um 12:57
[edit]
habe jetzt folgendes gemacht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Verschlsseln1Click(Sender: TObject); var a : integer; begin a := strtoint (edit1.text); if a > 9999 then memo1.Text := edit1.text + memo1.text else memo1.text := memo1.text + ' Passwort konnte nciht vergeben werden: Zahl muss größer als 10000 sein.'; end; |
so, nun schreibt er die 5zahlen an den anfang des memo1. Allerdings muss ich auch sagen dass er beim öffnen schauen soll ob edit1 auch mit den ersten 5 stellen übereinstimmt.
Wie bekomme ich dafür einen befehl also: schaue ob edit1 mit den ersten 5 stellen des memo1 übereinstimmt.
[edit]
So nun habe ich shcon viel geschafft.
Jetzt ist ein problem:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| if edit1.text <> #0 then begin zahl[1] := strtoint(edit1.text[1]); zahl[2] := strtoint(edit1.text[2]); zahl[3] := strtoint(edit1.text[3]); zahl[4] := strtoint(edit1.text[4]); zahl[5] := strtoint(edit1.text[5]); end else memo1.text := 'Bitte 5stelliges passwort eingeben.'; |
Hier soll er prüfen ob edit1.text lehr ist aber er stürzt trotzdem ab.
Wie lautet der befehl dafür?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| if (strtoint (memo1.text[1]) = zahl[1]) and (strtoint (memo1.text[2]) = zahl[2]) and (strtoint (memo1.text[3]) = zahl[3]) and (strtoint (memo1.text[4]) = zahl[4]) and (strtoint (memo1.text[5]) = zahl[5]) then begin [ .. ] DECODIERUNG [ .. ] end else memo1.text := 'Bitte richtiges passwort eingeben.'; |
In diesem abschnitt soll decodiert werden, natürlich nur wenn edit1 mit den ersten 5 zahlen aus der sf datei übereinstimmt, die natürlich decodiert sind!.
Allerdings sagt er immer das selbe. Wie bekomme ich das hin?
Carl Johnson - Mo 25.09.06 14:00
Also:
Um die Ersten fünf zeichen des Memo mit dem Text des Edit zu Vergleichen, musst du sowohl die ersten fünf Zeichen des Memo (siehe StrPLCopy in der Hilfe) als auch den Edit-Text (siehe StrPCopy) jeweils in einen nullterminierten String umwandeln. Danach vergleichst du beide mit StrComp.
Schau einfach mal in der Delphi-Hilfe nach. Da findest du einige Befehle für den Umgang mit Strings.
Dadurch sparst du dir auch dein gebastel mit dem and-Operator.
Um abzufragen, ob das Edit leer ist, versuch mal
Delphi-Quelltext
1:
| if Edit1.Text = '' then... |
Wenn du die Zeichen in Integer-Werte umwandeln möchtest, obwohl keine Zeichen vorhanden sind, solltest du dich nicht über
eine Fehlermeldung wundern!Deshalb solltest du erst abfragen, ob das Edit leer ist, und danach den Vergleich vornehmen.
Bei weiteren Fragen kannst du dich ja nochmal melden.
Viel Spaß.
5M17H - Mo 25.09.06 15:55
So nun habe ich folgendes genutzt: Board Suche; Delphi 2005 PE Hilfe; Google; Wiki.
Wer kann mir StrPLCopy erklären, das andere StrPCopy habe ich noch nicht gesucht, aber kann ja derjenige gliehc miterklären.
Bin kein Profi leute.... :lol:
wulfskin - Mo 25.09.06 16:46
5M17H hat folgendes geschrieben: |
So nun habe ich folgendes genutzt: [...] Delphi 2005 PE Hilfe |
Glaub ich dir nicht:
Delphi-Hilfe hat folgendes geschrieben: |
StrPLCopy Routine
Kopiert eine bestimmte Anzahl Zeichen von einem AnsiString (long) in einen nullterminierten String.
Unit
SysUtils
Syntax
[Delphi] function StrPLCopy(Dest: PAnsiChar, const Source: string, MaxLen: Cardinal): PAnsiChar;
Beschreibung
StrPLCopy kopiert bis zu MaxLen Zeichen von Source in den nullterminierten String Dest. Die Funktion gibt anschließend einen Zeiger auf Dest zurück.
Hinweis: Dest muss auf einen Speicherbereich zeigen, in dem genug Platz für MaxLen + 1 Zeichen ist (einschließich Nullterminator). |
Bei StrPCopy kannst du nicht die maximale Länge angeben.
Gruß Hape!
5M17H - Mo 25.09.06 22:42
Delphi-Quelltext
1:
| function StrPLCopy(Dest: PAnsiChar, const Source: string, MaxLen: Cardinal): PAnsiChar; |
sobald ich DAS dahin schreibe, unterstreicht er es.
Hat jemand evtl, nen codebeispiel, oder ne idee wie ich das (erstmal) anders lösen kann?
wulfskin - Di 26.09.06 00:12
Äh ja, du solltest schon die Parameter mit deinen Werten füllen?!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var S: String; P: PChar; begin S := 'abcdefg'; GetMem(P, Length(S)); P := StrPLCopy(P, S, Length(S) - 2); ShowMessage(P); FreeMem(P); |
Gruß Hape!
5M17H - Di 26.09.06 07:57
Ich glaube ich lasse mir das besser von meinem leherer erklären.
Was ist GetMem? Und warum ist dass alles so verschachtelt.
Ja nun ja, es weis kein mensch eine antwort. Nur die Schlauen können auf die Pauke hauen... xD bin ja nen dichter. Nein schon gut.
Ich lasse das Projekt warscheinlich erstmal warten, bis mir mein leherer Diese codestruktur erklärt hat. Mit worten.
Erstmal will er mit uns Excel Programmieren, zumindest sowas in der Form.
Danke für alle eure Posts.
ZeitGeist87 - Di 26.09.06 09:18
Hallo!
Hab mich mal ne Viertelstunde hingesetzt!
Rausgekommen ist das im Anhang!
Hoffe das geht in die Richtung
LG
Stefan
5M17H - Sa 30.09.06 01:07
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| procedure TForm1.Button1Click(Sender: TObject); var zahl1, zahle, i, i2, r, rs : integer; zeile : array of integer; zahl : array of char; code : array[1..5] of char; f : TextFile; dir, s : string; begin zahl1 := strtoint (edit1.text); SetLength(zeile, 5000); zahle := 0; i2 := 0; i := 0; dir := 'C:\code.txt'; AssignFile (f, dir); Reset (f); while not EOF(f) do begin inc(i); ReadLn(f, zeile[i]); end; if zahl1 > 9999 then begin if edit2.text = 'a' then zahle := 21322;
rs := 0; r := 0;
s := inttostr(zahle); setlength(zahl, length(s)); for i := 1 to high(zahl) do zahl[i] := s[i];
for i := i2 to 5 do begin code[i2] := edit1.text[i2]; if Pos(zahl[i], inttostr(zahl1)) > 0 then r := r + 1;
if code[i2] = zahl[i] then rs := rs + 1;
if rs < 5 then label3.caption := 'Sie haben '+ inttostr (r) +' richtige und davon '+ inttostr (rs) +' an der richtigen Stelle.' else label3.Caption := 'Sie haben den Code geknackt: '+ code[1] +''+ code[2] +''+ code[3] +''+ code[4] +''+ code[5] +' !';
r := 0; rs := 0; end; end else label3.caption := 'Geben Sie Mindestens 10000 ein.'; end; |
Wenn also in edit2 'a' steht soll man die zahl '21322' "hacken".
Dazu soll er hilfe geben.
Jetzt kommt aber manchmal die meldung:
'0Richtige und 1 an der Richtigen Stelle'! Wenn ich 0 Richtige habe kann ich keine an der richtigen stelle haben. Wo ist in diesem code der fehler?
Danke jetzt schon für eine antwort
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!