AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Speichern Von daten aus einem array endet in leerer Datei
Thema durchsuchen
Ansicht
Themen-Optionen

Speichern Von daten aus einem array endet in leerer Datei

Ein Thema von Pitti911 · begonnen am 29. Jan 2009 · letzter Beitrag vom 31. Jan 2009
Antwort Antwort
Seite 1 von 3  1 23      
Pitti911

Registriert seit: 28. Jan 2009
22 Beiträge
 
#1

Speichern Von daten aus einem array endet in leerer Datei

  Alt 29. Jan 2009, 11:52
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 dann bekommt er von mirein paar virtuelle ausgegeben
ich Find ihn nich den Fehler
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Speichern Von daten aus einem array endet in leerer Date

  Alt 29. Jan 2009, 12:03
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
Klaus
  Mit Zitat antworten Zitat
Pitti911

Registriert seit: 28. Jan 2009
22 Beiträge
 
#3

Re: Speichern Von daten aus einem array endet in leerer Date

  Alt 29. Jan 2009, 12:24
ja schon klar ursprünglich hab ich ja auch high genommen aber da das nich funktioniert hat hab ich's dann mit sizeOf probiert^^ einen Versuch wars ja wert

ich war halt relativ ratlos
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Speichern Von daten aus einem array endet in leerer Date

  Alt 29. Jan 2009, 13:32
.. 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
Klaus
  Mit Zitat antworten Zitat
Pitti911

Registriert seit: 28. Jan 2009
22 Beiträge
 
#5

Re: Speichern Von daten aus einem array endet in leerer Date

  Alt 29. Jan 2009, 14:04
stimmt -.- ich bin vllt doof xD das werd ich gleich mal probieren das mir immer sowas dämliches passiert^^

naja danke dir erstma

EDIT: juhhuuuuu danke dir jetzt klappts und hier:

  Mit Zitat antworten Zitat
Pitti911

Registriert seit: 28. Jan 2009
22 Beiträge
 
#6

Re: Speichern Von daten aus einem array endet in leerer Date

  Alt 30. Jan 2009, 14:47
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
  Mit Zitat antworten Zitat
Pitti911

Registriert seit: 28. Jan 2009
22 Beiträge
 
#7

Re: Speichern Von daten aus einem array endet in leerer Date

  Alt 30. Jan 2009, 23:29
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
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Speichern Von daten aus einem array endet in leerer Date

  Alt 31. Jan 2009, 08:24
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.

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
Klaus
  Mit Zitat antworten Zitat
Pitti911

Registriert seit: 28. Jan 2009
22 Beiträge
 
#9

Re: Speichern Von daten aus einem array endet in leerer Date

  Alt 31. Jan 2009, 13:16
ich hab auch schon die Fehlerquelle gefunden 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
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Speichern Von daten aus einem array endet in leerer Date

  Alt 31. Jan 2009, 13:31
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:06 Uhr.
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