Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Listenindex überschreitet Maximum(1) (https://www.delphipraxis.net/170401-listenindex-ueberschreitet-maximum-1-a.html)

DelphiUser1 15. Sep 2012 11:59

Listenindex überschreitet Maximum(1)
 
Ich weiß, es wurde jetzt schon oft genug gefragt, aber ich bin noch ein Anfänger und konnte aus den anderen Beiträgen nicht so viel entnehmen. Was ist falsch daran?:?
ich versuche aus der textdatei die kontaktdaten auszulesen und als Labels auszugeben. Die Datei wird Info(Benutzername).txt genannt.

Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
var sdd: TStrings;
begin
if Form3.Visible then
if FileExists(path+'Info'+Form1.Edit1.Text+'.txt') then
begin
sdd:=TStringList.Create;
sdd.LoadFromFile(path+'Info'+Form1.Edit1.Text+'.txt');
Label3.Caption:=sdd.Strings[0];
Label4.Caption:=sdd.Strings[1];
Label4.Caption:=sdd.Strings[2];
Label6.Caption:=sdd.Strings[3];
end;
end;

stahli 15. Sep 2012 12:40

AW: Listenindex überschreitet Maximum(1)
 
Mal ein Versuch, damit Du etwas weiter kommst:

Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
var
  sdd: TStringList; // identischer Typ mit Instanz
  FN: String; // damit nicht zwei mal die gleiche "Berechnung" verwendet werden muss
begin
  if Form3.Visible then
  begin
    FN := path+'Info'+Form1.Edit1.Text+'.txt';
    if FileExists(FN) then
      begin
        sdd := TStringList.Create;
        sdd.LoadFromFile(FN); // es ist unsicher, wie viele Zeilen in der StringList stehen
        if ssd.Count > 0 then
          Label3.Caption:=sdd[0]
        else
          Label3.Caption:='';
        if ssd.Count > 1 then
          Label4.Caption:=sdd[1]
        else
          Label4.Caption:='';
        if ssd.Count > 2 then
          Label4.Caption:=sdd[2] // müsste Label5 heißen?
        else
          Label4.Caption:='';
        if ssd.Count > 3 then
          Label6.Caption:=sdd[3]
        else
          Label6.Caption:='';
        FreeAndNil(ssd);
      end;
  end;
end;

himitsu 15. Sep 2012 12:41

AW: Listenindex überschreitet Maximum(1)
 
Fangen wir mal klein an:
Wir haben hier [code]- und sogar [delphi]-Tags, für die Quellcodes.
Delphi-Quellcode:
begin
  ShowMessage('Hallo');
end;
Warum gibst du dein erstellte TStringList (sdd) nicht wieder frei? (Speicherleck)



Und nun zum Problem:
Die Fehlermeldung sagt dir doch, was du falsch machst. (und der Debugger sagt dir sogar wo)

Du willst vermutlich auf eine Zeile (Index) der Stringliste zugreifen, welche es nicht gibt.

Laut Fehlermeldung ist eine Datei scheinbar nicht voll genug und entält nur eine Zeile (größter Index ist 0) und demnach kannst du da auch keine weiteren Zeilen (Index über 0) auslesen. :zwinker:



Und dann noch
Delphi-Quellcode:
if Form3.Visible then
.
Du bist doch schon in TForm3 drin, als solltest du auch nicht den Umweg über Form3 gehn (laß' das
Delphi-Quellcode:
Form3.
einfach weg)

[add]
Und es kann nichts schaden, wenn du etwas über Resourcenschutzblöcke lernst. (Try-Finally)

DelphiUser1 15. Sep 2012 14:07

AW: Listenindex überschreitet Maximum(1)
 
Danke erst mal für die schnelle und ausführliche Antwort (:
Ich habe stahlis Code mal versucht zu compilieren, leider ereilte mich das selbe Schicksal wie vorher, selbe Fehlermeldung :roll:
Die StringList freizugeben habe ich wohl ganz vergessen, danke für die Anmerkung.
Das seltsame ist, das meine Text-Datei 6 Zeilen hat..
Hier der Code zum abspeichern der Datei, vielleicht hilft der weiter: (Treg ist eine eigene Klasse TForm und sl und sd speichern einmal das Kennwort ab und einmal die Kontaktinformationen)

procedure TReg.Button1Click(Sender: TObject);
var sl, sd: TStrings;
begin
sl := TStringlist.Create;
sl.add(Edit1.Text);
sl.savetofile(path+ Edit2.Text +'.txt');
sd :=TStringlist.Create;
sd.Add(Form1.Edit3.Text);
sd.Add(Form1.Edit4.Text);
sd.Add(Form1.MaskEdit1.Text);
sd.Add(Form1.Edit6.Text);
sd.Add(Form1.ComboBox3.Text);
sd.SaveToFile(path+'Info'+Edit2.Text+'.txt');
sd.free;
sl.free;
Showmessage ('Sie haben erfolgreich ein Konto angelegt');
myForm.close;
Form1.Close;

nahpets 15. Sep 2012 14:37

AW: Listenindex überschreitet Maximum(1)
 
Hallo,

bitte ändere Deinen Quelltext mal entsprechend:
Zitat:

Zitat von DelphiUser1 (Beitrag 1182998)
Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
var sdd: TStrings;
begin
  if Form3.Visible then
  begin
    if FileExists(path+'Info'+Form1.Edit1.Text+'.txt') then
    begin
      sdd:=TStringList.Create;
      sdd.LoadFromFile(path+'Info'+Form1.Edit1.Text+'.txt');

      ShowMessage(IntToStr(sdd.Count)); // <!-- Diese Ausgabe muss mindestens den Wert 4 ergeben!!!
      ShowMessage(sdd.text) // <!-- Werden hier alle von Dir erwarteten Zeilen angezeigt oder nur eine?

      Label3.Caption:=sdd.Strings[0];
      Label4.Caption:=sdd.Strings[1];
      Label4.Caption:=sdd.Strings[2];
      Label6.Caption:=sdd.Strings[3];
      sdd.free;
    end;
  end;
end;

Sind die Ausgaben entsprechend Deinen Erwartungen? Andernfalls prüfe mal das Erstellen der Datei, ob hier eventuell Informationen verlorengehen.

himitsu 15. Sep 2012 15:20

AW: Listenindex überschreitet Maximum(1)
 
Wieso SchowMessage?

Man glaubt es kaum, aber der Debugger liefert genau die selben ergebnisse und das sogar schneller/einfacher.

nahpets 15. Sep 2012 15:26

AW: Listenindex überschreitet Maximum(1)
 
Zitat:

Zitat von himitsu (Beitrag 1183033)
Wieso SchowMessage?

Man glaubt es kaum, aber der Debugger liefert genau die selben ergebnisse und das sogar schneller/einfacher.

Weil das einfacher ist, als den Umgang mit dem Debugger zu erklären.

DelphiUser1 15. Sep 2012 15:38

AW: Listenindex überschreitet Maximum(1)
 
Ich habe das Problem gelöst, danke an alle die geholfen haben (:
Ich baue gerade Facebook mit Delphi nach, falls ihr zufällig Ideen zur Umsetzung habt, würde ich mich über Anmerkungen freuen :-D

sx2008 15. Sep 2012 16:04

AW: Listenindex überschreitet Maximum(1)
 
Zitat:

Zitat von DelphiUser1 (Beitrag 1183040)
Ich baue gerade Facebook mit Delphi nach

Lol :-D und ich baue gerade meinen eigenen Learjet auf.

Popov 15. Sep 2012 17:04

AW: Listenindex überschreitet Maximum(1)
 
Zitat:

Zitat von DelphiUser1 (Beitrag 1183040)
Ich baue gerade Facebook mit Delphi nach, falls ihr zufällig Ideen zur Umsetzung habt, würde ich mich über Anmerkungen freuen :-D

Viel Glück mit den Milliarden, aber wann du an die Börse gehst, ruf mich bitte nicht an ;)

EWeiss 15. Sep 2012 17:07

AW: Listenindex überschreitet Maximum(1)
 
Zitat:

Man glaubt es kaum, aber der Debugger liefert genau die selben ergebnisse und das sogar schneller/einfacher.
Aber nicht wenn es um Facebook geht
Die brauchen keinen Debugger die machen alles selbst.

gruss

DelphiUser1 15. Sep 2012 19:09

AW: Listenindex überschreitet Maximum(1)
 
Wenn wir schonmal dabei sind:
Ich will jetzt Informationen einer Checklistbox abspeichern, so wie unten gecoded klappt das auch, aber ich will das er die Informationen nicht in fa sondern in sd mit abspeichert (2)
Ideen?
(1)
procedure TForm1.Button3Click(Sender: TObject);
var i:integer;
begin
for i := 0 to Checklistbox1.Items.Count-1 do
begin
if Checklistbox1.Checked[i] then
fa:=TstringList.Create;
fa.Add(Checklistbox1.Items[i])
end;

(2)
procedure TReg.Button1Click(Sender: TObject);
var sl, sd: TStrings;
i: Integer;
begin
sl := TStringlist.Create;
sl.add(Edit1.Text);
sl.savetofile(path+ Edit2.Text +'.txt');
sd :=TStringlist.Create;
sd.Add(Form1.Edit3.Text);
sd.Add(Form1.Edit4.Text);
sd.Add(Form1.MaskEdit1.Text);
sd.Add(Form1.Edit6.Text);
sd.Add(Form1.ComboBox3.Text);
sd.SaveToFile(path+'Info'+Edit2.Text+'.txt');
sd.free;
sl.free;
Showmessage ('Sie haben erfolgreich ein Konto angelegt');
myForm.close;
Form1.Close;

stahli 15. Sep 2012 19:17

AW: Listenindex überschreitet Maximum(1)
 
Nur mal am Rande:
- Setze Deinen Quelltext in Delphi-Tags (das Helm-Symbol oben im Editor).
- Schau Dir mal alternativ zum Speichern TIniFile an. Dann stehen nicht nur die Werte in den Dateien sondern jeweils eine Bezeichnung und ein Wert.

GHorn 17. Sep 2012 10:31

AW: Listenindex überschreitet Maximum(1)
 
Zitat:

Ich habe das Problem gelöst, danke an alle die geholfen haben (:
Wäre nett, wenn Du andere an der Lösung teilhaben lässt :roll:

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var i:integer;
begin
  for i := 0 to Checklistbox1.Items.Count-1 do
    begin
      if Checklistbox1.Checked[i] then
        fa:=TstringList.Create;
      fa.Add(Checklistbox1.Items[i])
    end;
Wenn Du Deinen Text vernünftig einrücken würdest, könntest Du sehen, dass da das schließende "end;" fehlt. Außerdem erstellst Du in der For-Schleife jedesmal eine neue Stringliste. Ist das so gewollt? Wenn Checklistbox1.Checked[0] False ist, geht Dein f.Add(...) auf die Bretter :shock:

DelphiUser1 19. Sep 2012 11:13

AW: Listenindex überschreitet Maximum(1)
 
GHorn, danke für die Bemühungen, aber das war nicht mein Problem.
Inzwischen habe ich auch dieses Problem gelöst. Ja du hast recht ich lasse euch daran teilhaben:-D
Wie gesagt ich meinte das anders. Ich weiß schon wie ich das abspeichern kann, aber um den Sachverhalt genauer zu erklären:
Der User Registriert sich das erste Mal, er gibt die Informationen also ein und sie werden der Stringlist hinzugefügt. Dann wird eine neue Form erzeugt auf der man Benutzername und Passwort eingeben kann. Erst wenn der Benutzername eingegeben ist, sollen die Daten abgespeichert werden, da die Datei dem Nutzernamen entspricht. Mein Problem war, das ich die Items nicht in die Stringlist packen konnte, dabei ist es doch so leicht :o


Delphi-Quellcode:
procedure TReg.Button1Click(Sender: TObject);
var sl, sd: TStrings;
i:integer;
begin
  sl := TStringlist.Create;
  sl.add(Edit1.Text);
  sl.savetofile(path+ Edit2.Text +'.txt');
  sd :=TStringlist.Create;
sd.Add(Form1.Edit3.Text);
sd.Add(Form1.Edit4.Text);
sd.Add(Form1.MaskEdit1.Text);
sd.Add(Form1.Edit6.Text);
sd.Add(Form1.ComboBox3.Text);
  for i := 0 to Form1.Checklistbox1.Items.Count-1 do
    begin
      if Form1.Checklistbox1.Checked[i] then
      sd.Add(Form1.Checklistbox1.Items[i])
    end;
  sd.SaveToFile(path+'Info'+Edit2.Text+'.txt');
  sd.free;
  sl.free;
  Showmessage ('Sie haben erfolgreich ein Konto angelegt');
  myForm.close;
  Form1.Close;

end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:01 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