Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Speichern Von daten aus einem array endet in leerer Datei (https://www.delphipraxis.net/128406-speichern-von-daten-aus-einem-array-endet-leerer-datei.html)

Pitti911 29. Jan 2009 11:52


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:

Klaus01 29. Jan 2009 12:03

Re: Speichern Von daten aus einem array endet in leerer Date
 
Delphi-Quellcode:
 
while (i<sizeof(hilf)) And (hilf[i].acc<>'') do
  Begin
    Write(users,hilf[i]);
    inc(i);
  end;
Es ist, so glaube ich, nicht die beste Idee
sizeOf zur Größenbestimmung von dyn. Arrays zu verwenden.


Delphi-Quellcode:
while (i <= high(hilf) and (hilf[i].acc <> '' ) do
  begin
   // ..
  end;
Grüße
Klaus

Pitti911 29. Jan 2009 12:24

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 :(

Klaus01 29. Jan 2009 13:32

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

Pitti911 29. Jan 2009 14:04

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:

Pitti911 30. Jan 2009 14:47

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:
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;
ich würd mich doch ungemein freuen wenn mir wieder so schnell und kompetent geholfen werden könnte

Pitti911 30. Jan 2009 23:29

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

Klaus01 31. Jan 2009 08:24

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:
tmpbot.Botlvl:=strtoint(copy(hilf[i].Bots,1,p-1));
Wenn copy einen Leerstring zurückliefert, ist das ein ungültiger Integerwert.

Wenn Du Dich mal selber mit dem Debuggen beschäftigen möchtest, findest
Du hier ein Tutorial von MaBuSe
das die ersten Schritte in diese Richtung beschreibt.


Grüße
Klaus

Pitti911 31. Jan 2009 13:16

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

DeddyH 31. Jan 2009 13:31

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 20:25 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz