| Autor |
Beitrag |
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 06.08.04 17:24
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| for i:=0 to (Memo1.Lines.count-1) do begin a:=''; s:=''; If globals then begin for o:=1 to length(Memo1.Lines[i]) do begin If not eq then begin If Memo1.Lines[i][o]=';' then Memo1.Lines[i]:=''; If Memo1.Lines[i][o]<>'=' then s:=s+Memo1.Lines[i][o] else eq:=true; end else begin If Memo1.Lines[i][o]=';' then Memo1.Lines[i]:=''; If Memo1.Lines[i]<>''then begin If Memo1.Lines[i][o]<>'=' then a:=a+Memo1.Lines[i][o]; end; end; end; Form3.ListBox1.Items.Add(s); Form3.ListBox2.Items.Add(a); eq:=false; end; |
In diesem code wird Wert und Name einer Variable die in der Datei nach dem Schema
name=12345;
angeordnet sind, in 2 ListBoxes einzufügen.
Problem: wenn der name mehr als 4 Zeichen hat, dann hört er auf, überhaupt was zu tun! er fügt alle Variablen ein, bis zu der zu langen, und lässt dann die restlichen, die sich darunter befinden, weg!! das ist ein riesen mist, denn bei meinem Program soll der User nicht auf 4 zeichen lange variablen beschränkt sein! wo liegt der fehler bzw was kann ich tun?
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Segelflieger
      
Beiträge: 124
WinXP Pro
D7 Prof
|
Verfasst: Fr 06.08.04 20:25
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| If Memo1.Lines[i][o] = ';' then Memo1.Lines[i] := ''; If Memo1.Lines[i][o] <> '=' then s := s + Memo1.Lines[i][o] else eq := true; |
Wenn die erste Abfrage wahr ist, wird Memo1.Lines[i] ein leerer String ('') zugewiesen. Das wird in der zweiten Abfrage unweigerlich zu einer Zugriffsverletzung führen, da dann versucht wird, auf ein nicht vorhandenes Zeichen in diesem String zuzugreifen.
_________________ Früher hatten die Menschen Angst vor der Zukunft. Heute muss die Zukunft Angst vor den Menschen haben.
|
|
JayEff 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Sa 07.08.04 13:25
Lies dir Zeile 11 noch mal durch... da steht
If Memo1.Lines[i]<>'' then begin
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
WinDiag
Hält's aus hier
Beiträge: 5
Win 98, Win XP
D5
|
Verfasst: Sa 07.08.04 15:06
Hallo JayEff,
ich weiss nicht, was Du wirklich mit dem Code machen willst. Bei mir funktioniert der Code einwandfrei (ohne Zeile "if globals..."), zumindest solange ich hinter ";" nichts schreibe, egal wie lange der Name oder der Wert ist. Solbald ich etwas hinter ";" schreibe stürzt das Programm ab, daher auch die Bemerkung von Segelflieger, das 'o'te-Zeichen gibt es nicht mehr sobald einen Leerstring zugeordnet hast. Deine for o=1 to length...-Schleife funktioniert nicht, da die Anfangslänge des Strings verwendet wird und nicht mit der aktuellen Länge des Strings.
Muss es unbedingt zeichenweise sein?
Hier mein Vorschlag:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| for i:=0 to (Memo1.Lines.count-1) do begin st:=Memo1.Lines[i]; o:=1; if pos('=',st)=0 then begin ShowMessage('Zeile '+IntToStr(i)+' ungültiges Format!'); end else begin ListBox1.Items.Add(copy(st,1,pos('=',st)-1)); delete(st,1,pos('=',st)); if pos(';',st)<>0 then st:=copy(st,1,pos(';',st)-1); ListBox2.Items.Add(st); end; Memo1.Lines[i]:=''; end; |
Es gibt bestimmt auch eine Lösung zeichenweise.
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt.
|
|
JayEff 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Sa 07.08.04 17:55
bestimmt klappt es auch so, aber ich kannte den "pos" befehlt und was damit zusammen hängt noch nicht. Ich werds glcih mal versuchen!
Leider passiert bei deiner version das gleiche! cih gebe dir mal den rest des Codes vom Button Datei öffnen.
Vlt ist irgentwo anders der Wurm drin...?
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:
| if OpenDialog.Execute then begin Memo2.Text:=''; Memo1.Lines.LoadFromFile(Opendialog.FileName); Statusbar1.Panels[0].Text:='Unverändert'; Savedialog.FileName:=Opendialog.FileName; Statusbar1.Panels[1].Text:=OpenDialog.FileName; ListBox1.Items.Clear; For i:=0 to (Memo1.Lines.Count-1) do begin If Length(Memo1.Lines[i])>=8 then begin If (Memo1.Lines[i][1]+Memo1.Lines[i][2]+Memo1.Lines[i][3]+Memo1.Lines[i][4]+Memo1.Lines[i][5]+Memo1.Lines[i][6]+Memo1.Lines[i][7]+Memo1.Lines[i][8])='function' then ListBox1.Items.Add(Memo1.Lines[i]); globals:=false; end; If Length(Memo1.Lines[i])>=13 then begin If (Memo1.Lines[i][1]+Memo1.Lines[i][2]+Memo1.Lines[i][3]+Memo1.Lines[i][4]+Memo1.Lines[i][5]+Memo1.Lines[i][6]+Memo1.Lines[i][7]+Memo1.Lines[i][8]+Memo1.Lines[i][9]+Memo1.Lines[i][10]+Memo1.Lines[i][11]+Memo1.Lines[i][12]+Memo1.Lines[i][13])='function Init' then init:=true;end; If init then begin Memo2.Lines.Add(Memo1.Lines[i]); Memo1.Lines[i]:=''; end;
If globals then begin st:=Memo1.Lines[i]; o:=1; if pos('=',st)=0 then begin ShowMessage('Zeile '+IntToStr(i)+' ungültiges Format!'); end else begin Form3.ListBox1.Items.Add(copy(st,1,pos('=',st)-1)); delete(st,1,pos('=',st)); if pos(';',st)<>0 then st:=copy(st,1,pos(';',st)-1); Form3.ListBox2.Items.Add(st); end; Memo1.Lines[i]:=''; end; end; end;
clearStrings(Memo1.Lines); end; |
So.
versuche damit mal die datei hier zu laden:
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:
| 1=1; 12=1; 123=1; 1234=1; 12345=1; 123456=1; 1234567=1; 12345678=1; function NameDerFunktion() Suicide(); end; function neu() SwitchWeather(1) EnableAviation(1,0); EnableAviation(1,1); EnableAviation(1,2); EnableAviation(1,4); EnableAviation(3,0); EnableAviation(3,1); EnableAviation(3,2); EnableAviation(3,4); EnableAviation(5,0); EnableAviation(5,1); EnableAviation(5,2); EnableAviation(5,4); DisableAviation(1,3); DisableAviation(3,3); DisableAviation(5,3); Suicide(); end; function Init() RunScript("neu", 10000); end; |
schau mal ob er dir die gleichen fehler bringt.
du brauchst einen button zum laden, 2 memos, eine listbox, und auf einem anderen Form 2 listboxen. das andere form sollte form 3 sein. ach und einen opendialog genannt "opendialog" ohne 1 der so. ich kann mir denken dass das umständlich ist, aber bitte versuchs mal... wenns dann klappt zweifle ich an meinem verstand.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
WinDiag
Hält's aus hier
Beiträge: 5
Win 98, Win XP
D5
|
Verfasst: Sa 07.08.04 21:30
Ich weiss noch nicht so recht, was das ganze Programm machen soll, daher ist es auch etwas schwierig Dir zu helfen. Als erstes habe ich Deine beiden Monsterzeilen wie folgt geändert:
Quelltext 1: 2: 3: 4: 5: 6: 7:
| If Length(Memo1.Lines[i])>=8 then begin If pos('function',Memo1.Lines[i])>0 then ListBox1.Items.Add(Memo1.Lines[i]); globals:=false; end; if Length(Memo1.Lines[i])>=13 then begin If Pos('function Init',Memo1.Lines[i])>0 then init:=true; end; |
Meine erste Frage ist, wann globals auf True gesetzt wird und wann init auf False gesetzt wird?
Ab einer Länge von Memo1.Lines[i] von 8 (z.B. "12345=1;") wird globals auf jeden Fall auf false gesetzt. Damit wird das kopieren im Form3 nicht mehr durchgeführt! Es hat also nichts mit der Länge von Name zu tun, sondern mit der Länge der gesamten Zeile.
Übrigens die Zeile mit "SaveDialog" habe ich bei meinem Test auskommentiert, da ich nicht wußte was abgespeichert werden sollte.
Wenn Du mir sagst was Deine Funktion insgesamt mit Deiner Datei machen soll, dann kann ich Dir wahrscheinlich weiterhelfen.
|
|
JayEff 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: So 08.08.04 00:49
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
|