![]() |
Speichern Von daten aus einem array endet in leerer Datei
in folgener OnClick-Routiene sollen daten aus einer Datei in einen Dyn. Array eingelesen werden, nach einem Bestimmten Begriff gesucht werden(dann werden paar vergleiche angestellt)
und dann Falls gefunden Daten editiert und falls der eintrag nicht vorhanden ist ein neuer dazugesetzt werden aber iwie Endet das ganze wenn der eintrag schon Vorhanden ist in totalem Wirrwar -.- aber schaut euch den code selber an:
Code:
Type Thunter =record // das datenformat in dem gespeichert werden soll
Acc: String[40]; Bots: String[255]; Score: Integer; end; procedure Sortier(var A: array of Thunter); //sortieralgorythmus var i: Integer; j: Integer; tmp: Thunter; begin for i:= 1 to high(A) do begin j:= i; tmp := A[i]; while (j > 0) and (A[j-1].Score > tmp.Score) do begin // Verschieben: A[j]:= A[j-1]; Dec(j); end; A[j]:= tmp; end; end; procedure TForm1.Button1Click(Sender: TObject); Var users: file Of Thunter; hilf: array of Thunter; c:boolean; i:integer; s:string; begin i:=0; //loop Variable null setzen c:=true; //abfrage Variable Falsch setzen Assignfile(Users,'Hunter.dat'); //datei zuweisen if Fileexists('Hunter.dat') then Begin //falls existiert Reset(users); Setlength(hilf,Filesize(users)+1); seek(users,0); while not EOF(users) do Begin read(users,hilf[i]); inc(i); END; closefile(users); for i := 0 to high(hilf) do Begin if AnsiLowercase(hilf[i].Acc)=AnsiLowercase(Labelededit1.Text) then Begin c:=false; //auf gefunden setzen ;) wichtig für paar zeilen später if pos(Ansilowercase(labelededit2.Text+' '+Labelededit3.text),Ansilowercase(hilf[i].Bots)+',')=0 then Begin s:=hilf[i].bots; hilf[i].Bots:=s+', '+Labelededit2.text+' '+Labelededit3.text; case strtoint(Labelededit3.Text) of 0..90: hilf[i].Score:=hilf[i].Score+1; 91..94:hilf[i].score:=hilf[i].score+2; 95..96:hilf[i].score:=hilf[i].score+4; 97:hilf[i].score:=hilf[i].score+6; 98:hilf[i].score:=hilf[i].score+10; 99:hilf[i].score:=hilf[i].score+20; end; END Else Showmessage('bot wurde bereits vom entsprechenden Hunter erlegt'); end ELSE if (i=high(hilf)) AND c then //falls nicht gefunden dann Neunen 'acceinttrag' anlegen (das funktioniert soweit getestet auch sehr gut) Begin hilf[i].Acc:=Labelededit1.Text; hilf[i].Bots:=labelededit2.Text+' '+Labelededit3.text; case strtoint(Labelededit3.Text) of 0..90: hilf[i].Score:=1; 91..94:hilf[i].score:=2; 95..96:hilf[i].score:=4; 97:hilf[i].score:=6; 98:hilf[i].score:=10; 99:hilf[i].score:=20; end; end; end; CopyFile('hunter.dat','hunterbackup.dat',False); Delay(20); AssignFile(users,'hunter.dat'); Rewrite(users); sortier(hilf); i:=0; // loop wieder null setzen für das einspeichern der daten while (i<sizeof(hilf)) And (hilf[i].acc<>'') do Begin Write(users,hilf[i]); inc(i); end; closefile(users); end //iwo hiervor muss der Fehler stecken aber wo??? ELSE Begin i:=0; Rewrite(users); setlength(hilf,1); hilf[0].Acc:=labelededit1.Text; hilf[0].Bots:=labelededit2.Text+ ' '+ Labelededit3.text; case strtoint(Labelededit3.Text) of 0..90:hilf[i].Score:=1; //funktioniert einwandfrei 91..94:hilf[i].score:=2; 95..96:hilf[i].score:=4; 97:hilf[i].score:=6; 98:hilf[i].score:=10; 99:hilf[i].score:=20; end; Write(users,hilf[0]); Closefile(users); end; end; Falls jemand den Fehler findet und mir auch verrät wo :D dann bekommt er von mirein paar virtuelle :cheers: ausgegeben :D ich Find ihn nich den Fehler :wall: |
Re: Speichern Von daten aus einem array endet in leerer Date
Delphi-Quellcode:
Es ist, so glaube ich, nicht die beste Ideewhile (i<sizeof(hilf)) And (hilf[i].acc<>'') do Begin Write(users,hilf[i]); inc(i); end; sizeOf zur Größenbestimmung von dyn. Arrays zu verwenden.
Delphi-Quellcode:
Grüße
while (i <= high(hilf) and (hilf[i].acc <> '' ) do
begin // .. end; Klaus |
Re: Speichern Von daten aus einem array endet in leerer Date
ja schon klar ursprünglich hab ich ja auch high genommen :D aber da das nich funktioniert hat hab ich's dann mit sizeOf probiert^^ einen Versuch wars ja wert
ich war halt relativ ratlos :( |
Re: Speichern Von daten aus einem array endet in leerer Date
.. und funktioniert es jetzt?
Wenn nicht wie schaut es denn mit hilf[i].acc aus. Bei dem ersten auftreten von hilf[i].acc = '' bist Du aus der Schleife raus. Wenn Du nur die Einträge abspeichern willst die hilf[i].acc <> '' solltest Du das mit einer if Abfrage innerhalb der Schleife machen. Grüße Klaus |
Re: Speichern Von daten aus einem array endet in leerer Date
stimmt -.- ich bin vllt doof xD das werd ich gleich mal probieren :D das mir immer sowas dämliches passiert^^
naja danke dir erstma EDIT: juhhuuuuu :) :love: :bounce1: :party: :spin2: :cheers: danke dir jetzt klappts :) und hier: :cheers: :cheers: |
Re: Speichern Von daten aus einem array endet in leerer Date
mh gleiches Programm neuer Quelltext (leicht abgeändert weil der Bequemlichkeit halber soll ein text aus nem Post der das entsprechende Format hat nur noch in ein Memo kopiert werden müssen)
aber es soll auch ne "botliste erstellt werden" das einlesen in die datei "hunter.dat" funktioniert aus dem Memo raus wunderbar aber das erstellen der botliste liefert immer wieder einen Fehler :( und zwar sowas: "" ist kein gültiger integer hier der quelltext der Funktion:
Code:
ich würd mich doch ungemein freuen wenn mir wieder so schnell und kompetent geholfen werden könnte
procedure TForm1.Button1Click(Sender: TObject);
Var users: file Of Thunter; hilf: array of Thunter; Bots: file of Tbot; bot:array of Tbot; tmpbot: Tbot; tmp: Thunter; c:boolean; i,j,p:integer; s,hs,hs2,hs3:string; begin Button1.Enabled:=false; i:=0; c:=true; Try If memo1.Lines.Count=2 then //Beginn einlese algorythmus aus dem Memo Begin CopyFile('hunter.dat','hunterbackup.dat',False); tmp.Score:=0; tmp.Acc:=''; tmp.Bots:=''; hs:=memo1.lines[0]; hs:=trim(hs); tmp.Acc:=hs; hs:=memo1.Lines[1]; hs:=trim(hs); if hs[length(hs)]<>';' then hs:=hs+';'; repeat hs:=trim(hs); p:=pos(' ',hs); hs2:=copy(hs,1,p-1); Delete(hs,1,p); tmp.Bots:=tmp.Bots+hs2; p:=pos(';',hs); hs2:=copy(hs,1,p-1); Delete(hs,1,p); hs2:=trim(hs2); tmp.Bots:=tmp.Bots+' '+hs2+';'; tmp.Bots:=trim(tmp.Bots); case strtoint(hs2) of 0..90:tmp.Score:=tmp.Score+1; 91..94:tmp.Score:=tmp.Score+2; 95..96:tmp.Score:=tmp.Score+4; 97:tmp.Score:=tmp.Score+6; 98:tmp.Score:=tmp.Score+10; 99:tmp.Score:=tmp.Score+20; end; until hs=''; end; //ende des einlese algorythmus in tmp Assignfile(Users,'Hunter.dat'); if Fileexists('Hunter.dat') then Begin Reset(users); Setlength(hilf,Filesize(users)+1); seek(users,0); while not EOF(users) do Begin read(users,hilf[i]); inc(i); END; closefile(users); for i := 0 to high(hilf) do Begin hs:=''; hs2:=''; if AnsiLowercase(hilf[i].Acc)=AnsiLowercase(tmp.acc) then Begin c:=false; s:=hilf[i].bots; hs:=tmp.Bots; Repeat hs:=trim(hs); p:=pos(' ',hs); hs2:=copy(hs,1,p-1); Delete(hs,1,p); p:=pos(';',hs); hs3:=copy(hs,1,p-1); Delete(hs,1,p); hs3:=trim(hs3); if pos(hs2+' '+hs3,s)=0 then Begin s:=s+' '+hs2+' '+hs3+';'; s:=trim(s); end Else Begin case strtoint(hs3) of 0..90:tmp.Score:=tmp.Score-1; 91..94:tmp.Score:=tmp.Score-2; 95..96:tmp.Score:=tmp.Score-4; 97:tmp.Score:=tmp.Score-6; 98:tmp.Score:=tmp.Score-10; 99:tmp.Score:=tmp.Score-20; end; ShowMessage('Bot: '+hs2+' '+hs3+#13#10+'has been hunted down already'); end; until hs=''; hilf[i].Bots:=s; hilf[i].Score:=hilf[i].Score+tmp.score; end ELSE if (i=high(hilf)) AND c then Begin hilf[i]:=tmp; end; end; AssignFile(users,'hunter.dat'); Rewrite(users); sortierH(hilf); i:=0; while (i<=high(hilf)) do Begin if hilf[i].Acc<>'' then Write(users,hilf[i]); inc(i); end; closefile(users); end ELSE Begin i:=0; Rewrite(users); Write(users,tmp); Closefile(users); Memo1.Text:=''; end; //botliste I:=0; AssignFile(bots,'bots.dat'); if Fileexists('Hunter.dat') then Begin Reset(users); Setlength(hilf,Filesize(users)); seek(users,0); while not EOF(users) do Begin read(users,hilf[i]); inc(i); END; Closefile(users); end; I:=0; if Fileexists('bots.dat') then Begin Reset(bots); Setlength(bot,Filesize(bots)+100); seek(bots,0); while not EOF(users) do //DA IS EIN FEHLER -.- da mus bots hin xD Begin read(bots,bot[i]); inc(i); END; Closefile(bots); end ELSE Setlength(bot,500); I:=0; J:=0; Repeat c:=true; p:=pos(' ',hilf[i].Bots); tmpbot.Botname:=copy(hilf[i].Bots,1,p-1); Delete(hilf[i].Bots,1,p); hilf[i].Bots:=trim(hilf[i].bots); p:=pos(';',hilf[i].Bots); tmpbot.Botlvl:=strtoint(copy(hilf[i].Bots,1,p-1)); j:=0; While (j<=high(bot)) AND c do Begin if (ansilowercase(bot[j].Botname)=ansilowercase(tmpbot.Botname)) And (Not (bot[j].Botname='')) then Begin c:=false; if tmpbot.Botlvl>bot[j].Botlvl then bot[j].Botlvl:=tmpbot.Botlvl; end ELSE Begin if c then Begin bot[j]:=tmpbot; end; end; inc(j); end; inc(i); until i=high(hilf); Application.ProcessMessages; Sortierb(bot); rewrite(bots); i:=0; while (i<=high(bot)) do Begin if bot[i].botname<>'' then Write(bots,bot[i]); inc(i); end; Closefile(bots); //ende Botliste Button1.Enabled:= true; Except showMessage('Fehleingabe bei den erlegten Bots! Bitte überprüfe das Format!!'+#13#10+'Es muss lauten:'+#13#10+'Bot1 Botlvl; Bot2 Botlvl;...;'); CopyFile('hunterbackup.dat','hunter.dat',false); button1.enabled:=true; memo1.Text:=''; end; |
Re: Speichern Von daten aus einem array endet in leerer Date
mag denn keiner was sagen?
oder versteht den quelltext keiner? auch wenn jemand den sinn nicht versteht kann er mich ja wenigstens Fragen was der sinn is ;) ich antworte dann auch ganz lieb :) ich wollt eigentlich nur keinen neuen thread auf machen wenn ich hier aber keine Hilfe mehr bekomme dann mach ich doch nen neuen auf mfg Pitti |
Re: Speichern Von daten aus einem array endet in leerer Date
Guten Morgen Pitti,
pushen nach nur 10 Stunden wird hier nicht so gern gesehen. Ausserdem wäre es hilfreich uns zu sagen wo der Fehler auftritt. Um das genauer festzustellen kannst Du mit F8/F7 schrittweise Dein Programm abarbeiten. Kandidaten für Dein beschriebenebs Fehlverhalten sind IntToStr() Operation.
Delphi-Quellcode:
Wenn copy einen Leerstring zurückliefert, ist das ein ungültiger Integerwert.
tmpbot.Botlvl:=strtoint(copy(hilf[i].Bots,1,p-1));
Wenn Du Dich mal selber mit dem Debuggen beschäftigen möchtest, findest Du ![]() das die ersten Schritte in diese Richtung beschreibt. Grüße Klaus |
Re: Speichern Von daten aus einem array endet in leerer Date
ich hab auch schon die Fehlerquelle gefunden :D zumindest die eine mit dem "" not a Valid integer is gefixt ;) danke für das tutorial :) ich glaub das wird mir in Zukunft noch viel helfen
aber das nächste Problem Kommt schon :( jetzt wird von dem algorithmus nur der erste Bot gespeichert (in der 'bots.dat') leider aber wahr :( wo der Fehler liegt konnte ich leider nicht rausfinden falls ich die Fehlerquelle noch finde werd ich das hier posten :D an sonsten muss ich wohl leider noch ein bissel warten bis iwem hier die Fehlerquelle 'ins auge springt' tja und das mit dem uppen des threads tut mir leid was is denn hier so die regel nach welcher zeit man das machen darf ;) wenn man das darf mfg Pitti |
Re: Speichern Von daten aus einem array endet in leerer Date
Wenn nach Ablauf von 24 Stunden keine Antwort erfolgt ist, ist das Pushen legitim. Und ich möchte Dich bitten, künftig nur die relevanten Codestellen zu posten und in Delphi- statt Code-Tags einzuschließen. Mir ist das so wie oben einfach zuviel zu lesen ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz