Autor Beitrag
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 06.08.04 17:24 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 124

WinXP Pro
D7 Prof
BeitragVerfasst: Fr 06.08.04 20:25 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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
BeitragVerfasst: 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:
ausblenden 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));   //Name und '=' löschen
      if pos(';',st)<>0 then st:=copy(st,1,pos(';',st)-1);
      ListBox2.Items.Add(st);
    end;
    Memo1.Lines[i]:='';   //Zeile durch Leerzeile ersetzen (falls gewünscht)
  end;


Es gibt bestimmt auch eine Lösung zeichenweise.


Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
JayEff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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...?
ausblenden volle Höhe 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:
  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));   //Name und '=' löschen
      if pos(';',st)<>0 then st:=copy(st,1,pos(';',st)-1);
      Form3.ListBox2.Items.Add(st);
    end;
    Memo1.Lines[i]:='';   //Zeile durch Leerzeile ersetzen (falls gewünscht)
      end;
    end;
end;

clearStrings(Memo1.Lines);
end;


So.
versuche damit mal die datei hier zu laden:
ausblenden volle Höhe 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:
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
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: So 08.08.04 00:49 
OHHHHHHHHHHHHHHH :shock: :shock: :shock: NEIIIIIIIIIIIIN!
WELCH ELEMENTARER FEHLER IST DAS?!Ich hab doch glatt das globals:=false ausserhalb der If anweisungen geschrieben!!! DARAN LAG ES NATÜRLICH!! ich hab nur ein läppisches "begin" und "end;" hinzu fügen müssen... ich DEPP!
Danke! du hast es geschafft!! du hast mein leben gerettet! äh.. nein aber du hast vielen Leuten auf www.blitzkrieg-maps.de geholfen! dafür ist mein editor nämlich. Vielen dank! damit ist meine frage beantwortet!
Soll ich dir mal das Program schicken? oder uploaden? dann kannste mal schaun was beim öffnen einer datei passiert. muss natürlcih ne blitzkrieg scriüt datei sein aber egal wenn du wills, dann schick ich dir mal EXE und eine test datei per email. im grossen und ganzen wird in der Procedure eine Datei geladen, dann werden die Globalen Variablen in Form3 eingefügt und aus dem Script entfernt, danach werden noch alle functionen in eine Listbox übernommen, und die spezielle Funktion "Init()" wird in ein seperates Memofeld gelegt. zur übersicht. das letzte was fehlt, wär ein syntax highlighter aber wie das funzt weis cih nicht. da gibt es noch ne Topic von mir, aber irgentwie... weis keiner so recht, wie ers mir erklären kann... Danke aber! meine Frage ist hiermit beantwortet. :D :D :D :rofl: :dance: :beer: :flehan: :mrgreen:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.