Entwickler-Ecke
Sonstiges (Delphi) - INI Files auslesen klappt nicht
oOXTCOo - Di 09.06.09 03:41
Titel: INI Files auslesen klappt nicht
schon wieder ein problem...
ich versuche eine ini datei auzulesen und einfach zum testen ins memo schreiben.
mit dem code;
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| try Ini:=TIniFile.Create('c:\test.ini'); memo1.Text:=Ini.ReadString('[120]', '0','Keine Daten!');
finally Ini.Free; end; |
doch es wird nichts erstellt?
auch wird nichts gelesen wenn die datei exestiert...
worann kann es liegen?
volle rechte habe ich natürlich und ordner sind nicht schreibgeschützt...
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
jaenicke - Di 09.06.09 05:01
Erstens wendest du den Ressourcenschutzblock falsch an:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| Ini := TIniFile.Create('c:\test.ini'); try Memo1.Text := Ini.ReadString('[120]', '0', 'Keine Daten!'); finally Ini.Free; end; |
Zweitens: Wie sieht denn die INI aus?
Dem Quelltext nach müsste die ja so aussehen:
Popov - Di 09.06.09 07:23
Mal davon abgesehen, daß die Zeile
Delphi-Quelltext
1:
| Ini:=TIniFile.Create('c:\test.ini'); |
vor Try stehen muß, da dieser Bereich nicht geschützt werden muß, denn wenn es nicht klappt, dann klappt es eben nicht, dann muß Free auch kein Speicher freigeben, weil er nicht reserviert wurde, ist kein Fehler zu sehen. Ach ist Create im Try-Block kein Fehler, es muß nur nicht sein. Die Unit ist wohl angegeben und die Variable deklariert, sonst hättest du eine Fehlermeldung.
Da du nur liest gibt es auch keine Fehlermeldung wenn es die Datei unter 'c:\test.ini' nicht gibt. Wenn es die Datei nicht gibt, dann kommt eben der Default-Wert zum Einsatz, also eben 'Keine Daten!'.
'Keine Daten!' wird also angegeben wenn die Ini-Datei nicht existiert oder der Schlüssel nicht vorhanden ist. Wenn nichts kommt, also leerer String, dann ist der Schlüssel da, aber kein Wert.
Also die Ini ist eigentlich Idiotensicher. Irgendwas kommt auf jeden Fall, oder zumindest die Fehlermeldung.
jaenicke - Di 09.06.09 07:26
Der Fehler dürfte schlicht und einfach sein, dass die INI eben nicht so aussieht:
jaenicke hat folgendes geschrieben : |
| Dem Quelltext nach müsste die ja so aussehen: |
sondern so:
;-)
dummzeuch - Di 09.06.09 07:42
oOXTCOo hat folgendes geschrieben : |
ich versuche eine ini datei auzulesen und einfach zum testen ins memo schreiben.
|
Der Fehler liegt im Read, das muesste so aussehen
Delphi-Quelltext
1:
| memo1.Text:=Ini.ReadString('120', '0','Keine Daten!'); |
Also keine eckigen Klammern, die ergaenzt TInifile selbst. Es sei denn, Deine Ini enthaelt eine Section [[120]] - also mit doppelten Klammern - was ich nicht annehme.
| Zitat: |
doch es wird nichts erstellt?
|
Erstellt wird eine .ini nur, wenn man in sie schreibt.
twm
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
Popov - Di 09.06.09 08:07
Am besten so machen und gucken wo es rauskommt ;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| Ini := TIniFile.Create('c:\test.ini'); try Ini.WriteString('[120]', '0', Memo1.Text); finally Ini.Free; end; |
oOXTCOo - Di 09.06.09 14:30
danke jetzt klapps...
---
Moderiert von
Narses: Beiträge zusammengefasst---
sorry das ich schon wieder fragen muss aber diese misst ini files wollen nicht so wie ich will ;)
ich habe den code nun so geschrieben:
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:
| procedure TForm1.Button7Click(Sender: TObject); var Ini: TIniFile; pmname, pmini :string; pmlen, i:integer; begin
opendialog1.filter:='*.pm'; if OpenDialog1.Execute then pmname:=(Opendialog1.FileName);
Ini := TIniFile.Create(pmname); try pmini:=Ini.ReadString('120', '0','Keine Daten!'); finally Ini.Free; end;
pmlen:=(length(pmini)); for i:= 1 to pmlen do begin pmodd[i]:=pmini[i] + pmini[i + 1]; memo1.lines.add(pmodd[i]); pmlen:= pmlen + 1; end; |
nun habe ich das problem das er natürlich immer zwei zeichen nimmt aber im nächsten wieder
das zeichen von vorheringen was ja klar ist...
was mit aber nicht klar ist, wenn ich diese zeile in die schleife schreibe
sollte er ja praktisch immer einen auslassen oder habe ich da einen denk fehler?
oder wie kann man es sonst noch hin bekommen?
die zeile die ich einlese sieht so aus:
Quelltext
1: 2: 3:
| 0000000000000000219010000000000000180200000000000028000001FFFFFF003 C000001FFFFFF000000003F007F206F07FFFFF800005003000502000000007FFF6F 07FFFFFFFFF80000530300050221901F21901FFFFF |
es sieht dann aber immer so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 21 ... (gekürzt) |
nun soll immer ein byte in ein array gespeicher werden.
also so:
Delphi-Quelltext
1: 2: 3: 4:
| pmodd[1]:=$00; pmeven[1]:=$00; pmodd[2]:$00; pmeven[2]:=$00; |
uns so weiter bis alle zeichen in die arrays gespeichert wurden...
damit kann ich dann pratkisch die checksumme berechnen und weiter senden (das ist kein problem).
wenn ich dann wissen will wiviele array verwendet wurden, muss ich ja nur
pmlent durch 4 teilen, dann habe ich jeweils die länge der odd variablen und jweils der even variabeln ?
Moderiert von
Narses: Quote- in Delphi-Tags geändert, Formatierungs überarbeitet
---
Moderiert von
Narses: Beiträge zusammengefasst---
ach schon klar, pmlen ist ja die end länge...
aber so:
klappts auch nicht...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| pmlen:=(length(pmini));
for i:= 1 to pmlen do begin
pmodd[i]:=pmini[i] + pmini[i + 1]; pmeven[i]:=pmini[i + 3] + pmini[i + 4];
i:= (i + 4); end; |
klappt alles nicht :(
Moderiert von
Narses: Quote- durch Delphi-Tags ersetzt
Lannes - Di 09.06.09 17:44
Hallo,
entweder du nimmst eine while-Schleife, etwa so(Randbedingungen nicht berücksichtigt):
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| i := 1; while i < Length(s) do begin inc(i,2); end; |
oder Du arbeitest mit
mod:
Delphi-Quelltext
1: 2: 3:
| for z := 1 to length(s) do if z mod 2 = 1 then |
Popov - Di 09.06.09 19:31
oOXTCOo hat folgendes geschrieben : |
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:
| procedure TForm1.Button7Click(Sender: TObject); var Ini: TIniFile; pmname, pmini :string; pmlen, i:integer; begin
opendialog1.filter:='*.pm'; if OpenDialog1.Execute then pmname:=(Opendialog1.FileName);
Ini := TIniFile.Create(pmname); try pmini:=Ini.ReadString('120', '0','Keine Daten!'); finally Ini.Free; end;
... | |
Hier hast du jetzt einen bösen Fehler der dir um die Ohren fliegen kann. Du fragst zwar über OpenDialog den Dateinamen ab, aber die Routine mit der Ini wird durchgeführt egal ob du Ok oder Abbrechen Button im OpenDialog geklickt hast. Besser ist so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| opendialog1.filter:='*.pm'; if OpenDialog1.Execute then begin pmname:=(Opendialog1.FileName);
Ini := TIniFile.Create(pmname); try pmini:=Ini.ReadString('120', '0','Keine Daten!'); finally Ini.Free; end;
... end; |
Pack den Rest in den Block der ausgeführt wird wenn Ok geklickt wird. Wird jetzt Abbrechen wird der Teil ignoriert.
oOXTCOo - Di 09.06.09 20:15
danke danke danke!
werde ich gleich mal ausprobieren...
Popov - Di 09.06.09 20:59
Ich verstehe zwar noch nicht ganz was du willst, aber ich glaube du willst eine Zeile mit Hex Zahlen in zweier Werte zerlegen.
Hier eine kleine Routine die das sehr einfach macht. Sie ist zwar nicht elegant, aber auch nicht peinlich. Sie ist einfach nur einfach und verständlich.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var s, s2: String; begin s := '0000000000000000219010000000000000180200000000000028000001FFFFFF003' + 'C000001FFFFFF000000003F007F206F07FFFFF800005003000502000000007FFF6F' + '07FFFFFFFFF80000530300050221901F21901FFFFF';
while Length(s) > 0 do begin s2 := Copy(s, 1, 2); Delete(s, 1, 2);
ListBox1.Items.Add(s2); end; end; |
oOXTCOo - Di 09.06.09 21:06
PERFEKT DANKE!
mit dem ersten code habe ichs nicht so hinbekommen wie ichs brauche,
dafür aber mit dem zweiten.
habs so gemacht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| for i := 0 to pmlen do if i mod 4 = 1 then begin pmodd[j]:=pmini[i] + pmini[i + 1]; pmeven[j]:=pmini[i + 2] + pmini[i + 3]; memo1.lines.add('ODD ' + inttostr(j) + ': ' + pmodd[j]); memo1.lines.add('EVEN ' + inttostr(j) + ': ' + pmeven[j]); J:=(J+1); end; |
jetzt passts, jetzt kommt das gewünschte ergebnis so raus wie es soll:
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: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88:
| ODD 1: 00 EVEN 1: 00 ODD 2: 00 EVEN 2: 00 ODD 3: 00 EVEN 3: 00 ODD 4: 00 EVEN 4: 00 ODD 5: 21 EVEN 5: 90 ODD 6: 10 EVEN 6: 00 ODD 7: 00 EVEN 7: 00 ODD 8: 00 EVEN 8: 00 ODD 9: 00 EVEN 9: 18 ODD 10: 02 EVEN 10: 00 ODD 11: 00 EVEN 11: 00 ODD 12: 00 EVEN 12: 00 ODD 13: 00 EVEN 13: 28 ODD 14: 00 EVEN 14: 00 ODD 15: 01 EVEN 15: FF ODD 16: FF EVEN 16: FF ODD 17: 00 EVEN 17: 3C ODD 18: 00 EVEN 18: 00 ODD 19: 01 EVEN 19: FF ODD 20: FF EVEN 20: FF ODD 21: 00 EVEN 21: 00 ODD 22: 00 EVEN 22: 00 ODD 23: 3F EVEN 23: 00 ODD 24: 7F EVEN 24: 20 ODD 25: 6F EVEN 25: 07 ODD 26: FF EVEN 26: FF ODD 27: F8 EVEN 27: 00 ODD 28: 00 EVEN 28: 50 ODD 29: 03 EVEN 29: 00 ODD 30: 05 EVEN 30: 02 ODD 31: 00 EVEN 31: 00 ODD 32: 00 EVEN 32: 00 ODD 33: 7F EVEN 33: FF ODD 34: 6F EVEN 34: 07 ODD 35: FF EVEN 35: FF ODD 36: FF EVEN 36: FF ODD 37: F8 EVEN 37: 00 ODD 38: 00 EVEN 38: 53 ODD 39: 03 EVEN 39: 00 ODD 40: 05 EVEN 40: 02 ODD 41: 21 EVEN 41: 90 ODD 42: 1F EVEN 42: 21 ODD 43: 90 EVEN 43: 1F ODD 44: FF EVEN 44: FF |
danke nochmals!
oki - Di 09.06.09 21:42
Hallo,
hier noch mal ein Nachtrag von mir. Der Beitrag ist in der Zwischenzeit abhandengekommen. Ich möchte ihn aber trotzdem noch mal hier einfügen.
Zeig doch mal deine Ini-Datei. Das sieht alles sehr umständlich aus was du da machst. Schau dir doch mal ReadSection der Klasse TIniFile an. Ich denke das ist eine Überlegung wert.
Für das zerlegen eines Strings in einzelne Wordsegmente (du redest immer von Byte schreibst aber $00 usw.) reicht eine Schleife:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var OddArr, EvenArr : Array of Word; Even : Boolean; ... SetLength(OddArr, Length(pmini) div 2); SetLength(EvenArr, Length(pmini) div 2); Even := True; For Counter := 1 to Length(pmini) do begin if not odd(Counter) then begin if Even then EvenArr[Counter div 4] := InttoStr(Copy(pmini, Counter, 2)) else OddArr[Counter div 4] := InttoStr(Copy(pmini, Counter, 2)); Even := not Even; end; end; |
Ich hab das jetzt mal so live getippt. Hoffe nichts vergessen zu haben.
Gruß oki
oOXTCOo - Di 09.06.09 22:24
hier ist die ini...
aber so wie ich jetzt habe funktioniets super...
Popov - Di 09.06.09 23:02
Nur mal so als Info. Wenn du eine Datei nur mit Schlüsseln und Werten hast, also keine weiteren Sektionen, dann brauchst du auch keine Ini zu bemühen. Das geht auch mit Stringlist. Hier ein Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| var Path: String; s, s2: String; sl: TStringList; begin Path := ExtractFilePath(ParamStr(0)) + 'RM-400_353103020937301_120_120.pm';
sl := TStringList.Create; try if FileExists(Path) then begin sl.LoadFromFile(Path);
s := sl.Values['0'];
end; finally sl.Free; end;
end; |
oOXTCOo - Di 09.06.09 23:59
danke dir, bin aber froh das es nun läuft ;)
habs jetzt schon fast komplett am laufen:
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: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112:
| FT_out_Buffer[0]:=$1E FT_out_Buffer[1]:=$00 FT_out_Buffer[2]:=$10 FT_out_Buffer[3]:=$23 FT_out_Buffer[4]:=$00 FT_out_Buffer[5]:=$68 FT_out_Buffer[6]:=$00 FT_out_Buffer[7]:=$08 FT_out_Buffer[8]:=$01 FT_out_Buffer[9]:=$02 FT_out_Buffer[10]:=$00 FT_out_Buffer[11]:=$78 FT_out_Buffer[12]:=$00 FT_out_Buffer[13]:=$00 FT_out_Buffer[14]:=$00 FT_out_Buffer[15]:=$00 FT_out_Buffer[16]:=$00 FT_out_Buffer[17]:=$00 FT_out_Buffer[18]:=$00 FT_out_Buffer[19]:=$58 FT_out_Buffer[20]:=$00 FT_out_Buffer[21]:=$00 FT_out_Buffer[22]:=$00 FT_out_Buffer[23]:=$00 FT_out_Buffer[24]:=$00 FT_out_Buffer[25]:=$00 FT_out_Buffer[26]:=$00 FT_out_Buffer[27]:=$00 FT_out_Buffer[28]:=$21 FT_out_Buffer[29]:=$90 FT_out_Buffer[30]:=$10 FT_out_Buffer[31]:=$00 FT_out_Buffer[32]:=$00 FT_out_Buffer[33]:=$00 FT_out_Buffer[34]:=$00 FT_out_Buffer[35]:=$00 FT_out_Buffer[36]:=$00 FT_out_Buffer[37]:=$18 FT_out_Buffer[38]:=$02 FT_out_Buffer[39]:=$00 FT_out_Buffer[40]:=$00 FT_out_Buffer[41]:=$00 FT_out_Buffer[42]:=$00 FT_out_Buffer[43]:=$00 FT_out_Buffer[44]:=$00 FT_out_Buffer[45]:=$28 FT_out_Buffer[46]:=$00 FT_out_Buffer[47]:=$00 FT_out_Buffer[48]:=$01 FT_out_Buffer[49]:=$FF FT_out_Buffer[50]:=$FF FT_out_Buffer[51]:=$FF FT_out_Buffer[52]:=$00 FT_out_Buffer[53]:=$3C FT_out_Buffer[54]:=$00 FT_out_Buffer[55]:=$00 FT_out_Buffer[56]:=$01 FT_out_Buffer[57]:=$FF FT_out_Buffer[58]:=$FF FT_out_Buffer[59]:=$FF FT_out_Buffer[60]:=$00 FT_out_Buffer[61]:=$00 FT_out_Buffer[62]:=$00 FT_out_Buffer[63]:=$00 FT_out_Buffer[64]:=$3F FT_out_Buffer[65]:=$00 FT_out_Buffer[66]:=$7F FT_out_Buffer[67]:=$20 FT_out_Buffer[68]:=$6F FT_out_Buffer[69]:=$07 FT_out_Buffer[70]:=$FF FT_out_Buffer[71]:=$FF FT_out_Buffer[72]:=$F8 FT_out_Buffer[73]:=$00 FT_out_Buffer[74]:=$00 FT_out_Buffer[75]:=$50 FT_out_Buffer[76]:=$03 FT_out_Buffer[77]:=$00 FT_out_Buffer[78]:=$05 FT_out_Buffer[79]:=$02 FT_out_Buffer[80]:=$00 FT_out_Buffer[81]:=$00 FT_out_Buffer[82]:=$00 FT_out_Buffer[83]:=$00 FT_out_Buffer[84]:=$7F FT_out_Buffer[85]:=$FF FT_out_Buffer[86]:=$6F FT_out_Buffer[87]:=$07 FT_out_Buffer[88]:=$FF FT_out_Buffer[89]:=$FF FT_out_Buffer[90]:=$FF FT_out_Buffer[91]:=$FF FT_out_Buffer[92]:=$F8 FT_out_Buffer[93]:=$00 FT_out_Buffer[94]:=$00 FT_out_Buffer[95]:=$53 FT_out_Buffer[96]:=$03 FT_out_Buffer[97]:=$00 FT_out_Buffer[98]:=$05 FT_out_Buffer[99]:=$02 FT_out_Buffer[100]:=$21 FT_out_Buffer[101]:=$90 FT_out_Buffer[102]:=$1F FT_out_Buffer[103]:=$21 FT_out_Buffer[104]:=$90 FT_out_Buffer[105]:=$1F FT_out_Buffer[106]:=$FF FT_out_Buffer[107]:=$FF FT_out_Buffer[108]:=$01 FT_out_Buffer[109]:=$43 FT_out_Buffer[110]:=$AC FT_out_Buffer[111]:=$CC |
so wirds weiter zum ftdi device gesendet...
der buffer 109 ist die sequence nummer
der buffer 110 ist die odd checksumme
der buffer 111 ist die even checksumme
ich habe nur noch ein problem mit den beiden checksummen...
ins memo kann ichs so schreiben, aber wenn ichs direkt
so in den ft buffer schreiben will bekomme ich die fehlermeldung:
[Fehler] Unit1.pas(4672): Inkompatible Typen: 'Byte' und 'String'
das liegt jetzt aber darann das ich arrays statt normale variablen verwende...
gibt es eine möglichkeit byte zu string zu konvertieren?
oder das array umzuwandeln?
jaenicke - Mi 10.06.09 00:00
Du meinst wohl Byte zu Char, oder? Den Buchstaben zu einem Asciicode bekommst du mit Chr.
oOXTCOo - Mi 10.06.09 00:11
jaenicke hat folgendes geschrieben : |
| Du meinst wohl Byte zu Char, oder? Den Buchstaben zu einem Asciicode bekommst du mit Chr. |
ich poste mal das stück source code was ich habe und fast funktioniert:
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: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106:
| opendialog1.filter:='*.pm'; if OpenDialog1.Execute then begin pmname:=(Opendialog1.FileName);
Ini := TIniFile.Create(pmname); try pmini:=Ini.ReadString('120', '0','Keine Daten!'); finally Ini.Free; end;
J:=11; pmlen:=(length(pmini));
for i := 0 to pmlen do if i mod 4 = 1 then begin pmodd[j]:='$' + pmini[i] + pmini[i + 1]; pmeven[j]:='$' + pmini[i + 2] + pmini[i + 3]; memo2.lines.add('ODD ' + inttostr(j) + ': ' + pmodd[j]); memo2.lines.add('EVEN ' + inttostr(j) + ': ' + pmeven[j]); J:=(J+1); end;
pmodd[1]:='$1E'; pmeven[1]:='$00'; pmodd[2]:='$10'; pmeven[2]:='$23'; pmodd[3]:='$00'; pmeven[3]:='$68'; pmodd[4]:='$00'; pmeven[4]:='$08'; pmodd[5]:='$01'; pmeven[5]:='$02'; pmodd[6]:='$00'; pmeven[6]:='$78'; pmodd[7]:='$00'; pmeven[7]:='$00'; pmodd[8]:='$00'; pmeven[8]:='$00'; pmodd[9]:='$00'; pmeven[9]:='$00'; pmodd[10]:='$00'; pmeven[10]:='$58'; pmodd[55]:='$01'; pmeven[55]:='$43'; pmbuffer:='$'; pmbuffer2:='$';
memo2.lines.add('ODD_RESULT: ' + inttostr(oddresult));
oddresult:=$; evenresult:=$;
pmlen:= (pmlen div 4 ); pmlen:= (pmlen + 11 );
for i:=1 to pmlen do begin oddresult:= oddresult xor strtoint(pmodd[i]); end; memo2.lines.add('ODD_RESULT: ' + inttostr(oddresult));
for i:=1 to pmlen do begin evenresult:= evenresult xor strtoint(pmeven[i]); end; memo2.lines.add('EVEN_RESULT: ' + inttostr(evenresult));
memo2.lines.add('ODD CHECKSUM = ' + IntToHex(oddresult, 1)); memo2.lines.add('EVEN CHECKSUM = ' + IntToHex(evenresult, 1));
Soddresult:= ('$' + IntToHex(oddresult, 1)); Sevenresult:=('$' + IntToHex(evenresult, 1));
memo2.Lines.add('SO WIRDS EINGEFÜGT: ' + SoddResult); memo2.LineS.add('SO WIRDS EINGEFÜGT: ' + SevenResult);
J:=0;
for i:=1 to pmlen do begin pmbuffer:=pmodd[i]; pmbuffer2:=pmeven[i]; memo2.lines.add('FT_out_Buffer['+ inttostr(j) +']:=' + pmodd[i]); J:=j+1; memo2.lines.add('FT_out_Buffer['+ inttostr(j) +']:=' + pmeven[i]); J:=J+1; end;
FT_out_Buffer[j]:=soddresult; memo2.lines.add('FT_out_Buffer['+ inttostr(j) +']:=' + Soddresult); j:= (j + 1); FT_out_Buffer[j]:=sevenresult; memo2.lines.add('FT_out_Buffer['+ inttostr(j) +']:=' + Sevenresult); |
hier liegt das problem:
Delphi-Quelltext
1: 2: 3: 4: 5:
| FT_out_Buffer[j]:=soddresult; memo2.lines.add('FT_out_Buffer['+ inttostr(j) +']:=' + Soddresult); j:= (j + 1); FT_out_Buffer[j]:=sevenresult; memo2.lines.add('FT_out_Buffer['+ inttostr(j) +']:=' + Sevenresult); |
ins memom wirds richitg geschrieben so wie ichs brauche...
aber in den ft_buffer bekomme ich die oben genannte fehlermeldung...
Popov - Mi 10.06.09 00:12
Du kannst Char oder Byte auch bei Arrays haben, du mußt es nur so deklarieren.
oOXTCOo - Mi 10.06.09 00:17
Popov hat folgendes geschrieben : |
| Du kannst Char oder Byte auch bei Arrays haben, du mußt es nur so deklarieren. |
und wie mache ich das?
bzw. umwandeln geht nicht?
denn ich habe nur noch mit den beiden checksummen das problem, dann würde es laufen...
oOXTCOo - Mi 10.06.09 00:23
Popov hat folgendes geschrieben : |
Ich verstehe zwar noch nicht ganz was du willst, aber ich glaube du willst eine Zeile mit Hex Zahlen in zweier Werte zerlegen.
Hier eine kleine Routine die das sehr einfach macht. Sie ist zwar nicht elegant, aber auch nicht peinlich. Sie ist einfach nur einfach und verständlich.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var s, s2: String; begin s := '0000000000000000219010000000000000180200000000000028000001FFFFFF003' + 'C000001FFFFFF000000003F007F206F07FFFFF800005003000502000000007FFF6F' + '07FFFFFFFFF80000530300050221901F21901FFFFF';
while Length(s) > 0 do begin s2 := Copy(s, 1, 2); Delete(s, 1, 2);
ListBox1.Items.Add(s2); end; end; | |
das wäre auch nicht schlecht gewesen, so habe ichs schon ein paar mal gemacht...
---
Moderiert von
Narses: Beiträge zusammengefasst---
wenn ich so mache:
Delphi-Quelltext
1: 2: 3: 4:
| oddresult:=strtoint(Soddresult);
FT_out_Buffer[j]:=oddresult; memo2.lines.add('FT_out_Buffer['+ inttostr(j) +']:=' + inttostr(oddresult)); |
gehts zwar, aber es kommen natülich integer werte raus:
Delphi-Quelltext
1: 2: 3: 4: 5:
| FT_out_Buffer[106]:=$FF FT_out_Buffer[107]:=$FF FT_out_Buffer[108]:=$01 FT_out_Buffer[109]:=$43 FT_out_Buffer[110]:=172 <-- Sollte aber $AA sein. |
---
Moderiert von
Narses: Beiträge zusammengefasst---
ich denke ich habs, muss es aber noch testen...
Delphi-Quelltext
1:
| FT_out_Buffer[j]:=strtoint(soddresult); |
Popov - Mi 10.06.09 00:45
Was du nicht machen kannst ist ein String einem Char übergeben. Das geht nicht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var s: String; c: Char; begin s := 'a'; c := s; |
auch wenn s nur ein Zeichen enthält.
Was aber geht ist das:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var s: String; c: Char; begin s := 'a'; c := s[1]; |
Hier wird nur ein Zeichen übergeben (die 1 steht für das erste Zechen, nicht für ein Zeichen). Aber Vorsicht! ein Char besteht immer aus einem Zeichen, ein String kann mehr Zeichen enthalten, auch auch keins.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var s: String; c: Char; begin c := s[1]; |
Hier gibt es eine Fehlermeldung, da s leer ist, als keine Zeichen entgällt.
Wenn du also auf diese Art ein Zeichen übergeben willst, dann prüf vorher ob der String mindestens ein Zeichen enthält:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var s: String; c: Char; begin if Length(s) > 0 then c := s[1] else ShowMessage('Fehler, String enthält keine Zeichen'); |
oOXTCOo - Mi 10.06.09 00:52
es funktioniert!
ich musste einfach nur den string zu integer convertieren ;)
zu einfach damit ich sofort drauf komme... tzzz
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!