Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ArrayRecord von Listboxen+anderen object speichern und laden (https://www.delphipraxis.net/132428-arrayrecord-von-listboxen-anderen-object-speichern-und-laden.html)

Ness64 12. Apr 2009 15:08


ArrayRecord von Listboxen+anderen object speichern und laden
 
Hullo,
ich komme an einer Stelle meines Proghramms nicht weiter!
Undzwar ich habe eine Listbox,wo Personen generiert werden.
Name1,Name3
maximal 5 Personen!
Ich habe gedacht einen Array Record zu erstellen,da diese 5 Personen ihre eigenen Nummern haben. Wieso Array? Weil ich später auf 30 Personen hochgehen will und da sind einzelne nicht empfehlenswert. ;)


Erstmal die definierungen! Keine Angst,momentan funktioniert alles! Wenn "end" oder sowas fehlt,dann anscheinend vergessen zu kopieren!

Delphi-Quellcode:
type
  TGast = record        //Meine Main Record! Nur
    Name: string[15];   //Stringwert
    skill1: string[5]; //Zahlenwert
    skill2: string[5]; //Zahlenwert
    aktiv:boolean;     //boolean

 TGastListe = array of TGast; //Zweite Record

var
  Form1: TForm1;
  GastListe: TGastListe; //Namen der Leute in Listbox1 werden dannach in gaslite gespeichert!
  Gast: TGast;
  maxanzahl:integer;

 end;
Die Formcreate:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
button2.hide;
SetLength(GastListe, 5); //Gastliste darf nur 5 Leute haben! Dynamisches Array*hust* 
end;
Soweit so gut haben wir also einen Array Record! IN diesen Arrayrecord Gastliste speichern wir die Namen der Gäste,die in die Listboxen eingetragen werden.

Jetzt die ButtonNamen Prozedur,wo ich durch ein Edit Feld Namen generiere,die in eine Listbox reingetan werden:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
forbidden:boolean;
begin
Gast.name := Edit1.text;
Listbox1.items.add(Gast.name); //Listbox wird jetzt der Name von Edit1.text addiert!
end;
Jetzt kommt die sehr wichtige Listboxfunction,wenn ich auf die Namen in der Listbox anklicke:
Delphi-Quellcode:
procedure TForm1.ListBox1Click(Sender: TObject);
begin
Gastliste[Listbox1.itemindex].name := Listbox1.items[Listbox1.itemindex];
//Gastliste bekommt den Namen von der Stelle,wo man in listbox 1 geklickt hat!

    Label1.caption := 'Angeklickte Person: ' + Gastliste[Listbox1.itemindex].name; //Dient zur Sicherstellung,ob der geklickte auch wirklich geklickt wurde!
end;
Bei Button2 kann man einstellen,ob derjenige aktiv ist! Vorsicht! Ich habe kein FALSE! Und das mit Absicht....
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  Gastliste[Listbox1.itemindex].aktiv := true; //Die Person,die man in Listbox angeklickt hat,wird jetzt auf aktiv gestellt!
end;
Verwirrt euch nicht bei gast.name und gastliste.name!
Ich brauche gastliste.name,damit ich weiß,an welcher Stelle in derListbox welcher Gast gemeint ist!
ich kann also nicht gast.name[i] schreiben! da komtm ein Fehler! Deshalb brauche ich einen zweiten record,der sogar ein array besitzt!

Soweit funktioniert ALLES! Wenn ich 5 Personen generiere und Person 1 aktiv mache,dann ist auch wirklich Person1 aktiv und die anderen nicht!
Jetzt die große PREISFRAGE:

Wie kann ich diesen Record in eine RICHTIGE Text-/INIdatei speichern UND erfolgreich Laden,so das die gespeicherten Leute wieder in Listbox zu sehen sind und,das auch wirklich die jenigen aktiv dargestellt werden?


Ich habe in mehreren Foren gefragt und bisher blieb die Antwort aus :(
Ich hoffe ihr könnt mir Helfen! Auf Wunsch bi ich sogar Bereit meine Pas Datei hochzuladen,aber ich denke meine Erklärungen sind GENAU genug,um euch weiterhelfen zu können ;)
Mit GROßEM DANK im Voraus! :)

jaenicke 12. Apr 2009 15:19

Re: ArrayRecord von Listboxen+anderen object speichern und l
 
Für INI-Dateien kannst du hier einmal schauen:
http://www.delphi-treff.de/tipps/dat...i/Ini-Dateien/

Wenn du aber Records einer festen Größe hast wie in deinem Fall, dann bieten sich typisierte Dateien an, die sind einfach, dafür kannst du eben nur gleiche feste Datentypen darin speichern.

Ness64 12. Apr 2009 16:33

Re: ArrayRecord von Listboxen+anderen object speichern und l
 
wie das mit array records geht will ich ja wissen ^^
Von datenspeicherung habe ich nicht so viel Ahnung wie die Profis hier im Forum :)

Blackheart 12. Apr 2009 16:43

Re: ArrayRecord von Listboxen+anderen object speichern und l
 
Hast du schon mal dort geschaut.

DeddyH 12. Apr 2009 16:44

Re: ArrayRecord von Listboxen+anderen object speichern und l
 
Schau doch mal in der Suche unter Hier im Forum suchenTypisierte Datei

Ness64 12. Apr 2009 17:30

Re: ArrayRecord von Listboxen+anderen object speichern und l
 
Naja,irgendwie wendet keiner davon das an,was ich versuche... :(
Das richtige Speichern wird mir dadurch zu einem noch größerem Rätsel...

PS :INI Dateien würden nicht gehen,da ich IMMER eine "=x" angeben muss und das will ich nicht.
Für jeden müsste ich eine ini datei machen und das wäre ein bisschen zu umständlich :(
Die Anwendungen mit Filestream sind ganz anders,meins kann man mit den record Werten der anderen nicht vergleichen :/

jaenicke 12. Apr 2009 17:35

Re: ArrayRecord von Listboxen+anderen object speichern und l
 
Du brauchst eine "file of TGast", und der Rest sollte den Beispielen gleichen.

Ness64 12. Apr 2009 20:27

Re: ArrayRecord von Listboxen+anderen object speichern und l
 
ok,jemand hat gemeint ich solle Ini Dateien nutzen.
Das habe ich jetzt probiert,das Speichern funktioniert SUPER,aber wie bereits erwartet habe ich großes Schwierigkeiten mit
dem Laden!

Erstmal die Prozedur des neuen Buttons,der die Ini Datei generiert.

Delphi-Quellcode:
var Ini: TIniFile;
VAR i:integer;
begin
 Ini.Free;
    Ini:=TIniFile.Create('C:\Programme\Borland\Delphi7\Projects\RECORDS\Test.ini');
  try
    for i:= 0 to Listbox1.count -1 do
    begin
      Ini.WriteString('Memberlist',Listbox1.items[i],''); // Hier werden die Namen reingeschrieben!
      Ini.WriteInteger('Skill1',Listbox1.items[i],);
      Ini.WriteInteger('Skill2',Listbox1.items[i], 10);
      Ini.WriteBool('Aktiv',Listbox1.items[i],gastliste[i].aktiv);
    end;
  finally
    Ini.Free;
  end;
Somit speichert der jetzt diese Werte in die Ini Datei!
In der INI Datei steht beispielsweise folgendes:
Delphi-Quellcode:
[Memberlist]
Ness=
Ness 64=
Testplayer=
[Skill1]
Ness=5
Ness 64=5
Testplayer=6
Es ist extrem komisch ,wieso da jetzt ein Gleichheitszeichen ist,aber ein Verusch bei InI war es wert.
Das Problem ist jetzt,ich habe Schwierigkeiten,das wieder in die LISTBOX1 hinzuzufügen. Wenn wir annehmen,dass das oben jetzt unsere wirkliche INI Datei ist,m+sste durch den Laden Button in der Listbox folgendes stehen:
Ness
Ness 64
Testplayer

Und die Record Varaible müsste dann so gefühlt sein:
gastliste[0].name = Ness
gastliste[1].name = Ness 64
gastliste[2].name = Testplayer
gastliste[0].level = 5
gastliste[1].level = 5
gastliste[2].level = 6

Und wie man das jetzt macht ist mir noch ein Rätsel!!
Da INI ja für feste SAchen genutzt werden,ist es ien zustäzliches Problem,denn wir können nicht wissen,wieviele Personen beim nächsten Mal generiert werden...

jaenicke 12. Apr 2009 20:31

Re: ArrayRecord von Listboxen+anderen object speichern und l
 
Wie eine INI-Datei aufgebaut ist, ist dir offenbar nicht klar...
Innerhalb der Sektionen stehen immer Wertepaare.
Code:
[Sektionsname]
Wertname1=Wert2
Wertname2=Wert2
...
Bei dir also z.B. so:
Code:
[Memberlist]
Member1=Ness
Member2=Ness 64
Member3=Testplayer
[Skill1]
Ness=5 
Ness 64=5 
Testplayer=6
Du kannst auch eine Liste der Wertenamen holen, usw.

Ness64 13. Apr 2009 13:39

Re: ArrayRecord von Listboxen+anderen object speichern und l
 
Da es keine umfangreichen Tuts gibt naja srry dafür!
Ich habe das sofort umgeändert,nur jetzt taucht zum ersten Mal ein Fehler auf:

Delphi-Quellcode:
procedure TForm1.Button5Click(Sender: TObject);
var Ini: TIniFile;
var i :integer;
begin

  Ini:=TIniFile.Create('C:\Programme\Borland\Delphi7\Projects\RECORDS\Test.ini');
  try
    for i:= 0 to Listbox1.count -1 do
    begin
     Ini.WriteString('Memberlist','Name',listbox1.Items[i]); // Die Namen werden am Ende hinzugefügt!

      Ini.WriteInteger('Skill1',Listbox1.items[i], 5); //Ob sie einen Skill Wert besitzen und jeder soll den Wert 5 haben

    end;
  finally
    Ini.Free;
  end;

end;
FEHLER: Wenn ich mehr als 2 Namen generiere,dann erscheint in der INI File nicht der zweite Name!
Sagen wir,ich habe Ness und Ness 64 generiert und beide haben den Skillwert 5! Dann steht folgendes in der INI File:

Delphi-Quellcode:
[Memberlist]
Name=Ness 64
[Skill1]
Ness=5
Ness 64=5
Komischerweise wird Ness unterschlagen! Immer der letzte generierte wird der INI File hinzugefügt...
Aber was noch komischer ist: Alle generierten Leute werden unter der Skil lSection wieder hieingeschrieben!
Das was ich da oben geändert habe,war nur von der dritten Stelle in (Ini.WriteString) zur zweiten Stelle zu tauschen.
MFG Ness


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 Uhr.
Seite 1 von 2  1 2      

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