![]() |
Delphi Telefonbuch
Hi!
Ich muss für die Schule ein Adressbuch in Delphi entwerfen dass die eingelesenen Daten in einem File speichert. Ich komme aber beim Einlesen Löschen und Abrufen nicht weiter. Kann mir jemand helfen? Danke im Voraus! Joe.Fresh
Delphi-Quellcode:
[edit=Luckie]CCode-Tags durch Delphi-Tags ersetzt.[/edit]
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Label2: TLabel; ausgabe: TButton; schliessen: TButton; ListBox1: TListBox; Edit2: TEdit; Edit3: TEdit; adden: TButton; delete: TButton; Image1: TImage; Edit4: TEdit; Label3: TLabel; Bevel1: TBevel; Button1: TButton; Edit5: TEdit; procedure ausgabeClick(Sender: TObject); procedure schliessenClick(Sender: TObject); procedure deleteClick(Sender: TObject); procedure addenClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} type teintrag=Record name,vorwahl,nummer,email:string end; telefonbuch = file; var telebuch:array[1..300] of teintrag; speicherdatei:telefonbuch; procedure TForm1.ausgabeClick(Sender: TObject); //Var teledenis:teintrag; begin end; procedure TForm1.schliessenClick(Sender: TObject); begin close; end; procedure TForm1.deleteClick(Sender: TObject); var i:integer; begin if listbox1.itemindex = -1 then showmessage ('Bitte erst Eintrag markieren') else showmessage ('Eintrag gelöscht'); for i:=0 to 300 do begin if listbox1.itemindex = i then listbox1.items.delete (i); end; end; procedure TForm1.addenClick(Sender: TObject); var hilf:string ;i:integer; begin hilf:=edit1.text; if edit1.text='' then showmessage ('Bitte erst den Namen eingeben') else listbox1.items.add(hilf); listbox1.items.count; with telebuch[i] do end; end. |
Erst mal allegemein: Du solltest dir angewüöhnen deinen Code zu fromatieren. Dann kann man ihn leichter lesen und auch Fehler schneller finden.
Zu deinem Problem: Auf meiner Seite findest du eine Klasse, um mit typisisrten Dateien zu arbeiten. Eventuell kannst du dir da die ein oder andere Anregung holen. |
Luckie hat Recht. Mit untypisierten Dateien, wie bei Dir, wird das nichts.
|
Ok Danke euch!
Habe es jetzt ein bischen anders versucht. Und zwar versuche ich jetzt direkt die Daten in einem File zu speichern aber ich weiss nich wie ich den Dateizeiger eine Stelle weiter bewege nachdem ich die Datei beschrieben habe bzw weiss ich nicht ob die Daten bei mir Überhaupt gespeichert werden. Könnt ihr mir da helfen? Danke! Joe.Fresh
Code:
hilf:=edit1.text;
if edit1.text='' then showmessage ('Bitte erst den Namen eingeben') else listbox1.items.add(hilf); hilf1:=listbox1.items.count; assignfile(speicherdatei,'telefonbuch.dat'); {$I-} reset (speicherdatei); {$I+} if ioresult <>0 then rewrite (speicherdatei); with telebuch do begin vorwahl:=edit2.text; nummer:=edit3.text; name:=edit1.text; email:=edit4.text; write(speicherdatei); hilf2:=FilePos(speicherdatei); if hilf2+1=hilf1 then showmessage ('Datei gespeichert'); //edit5.text:= inttostr (hilf2); closeFile(speicherdatei); |
Du könntest das Laden und Speichern der Daten ganz bequem per StringListen erledigen.
Du hast folgenden Typ, den du speichern willst:
Delphi-Quellcode:
Du kannst deine Strings aus dem record z.B. Tab-getrennt als einen String in eine StringListe stopfen. Also ein Telefonbucheintrag - ein StringList-Eintrag.
type teintrag=Record
name,vorwahl,nummer,email:string end; Speichern kannst du:
Delphi-Quellcode:
Laden:
eintragliste.SavetoFile(filename);
Delphi-Quellcode:
eintragliste.LoadFromFile(filename);
Mit
Delphi-Quellcode:
kannst du den zusammengestopften String wieder in deine record-Strings aufteilen.
IniParseString
mfg Daniel |
Aha,hört sich gut an.
Das heisst dann ein Eintrag ist eine Stringlist die dann in dem File gespeichert wird oder? und beim Auslesen wird alles wieder durch den Befehl IniParseString aufgeteilt ja? Wo finde ich die String List in der Menü Leiste? Danke im Voraus joe.fresh |
TStringlist ist keine Kompo sondern eine Klasse.
Verwenden kannst du sie so:
Delphi-Quellcode:
Jetzt hast du jede Zeile aus der Datei in einem eigenen Listeneintrag
var Liste : TStringList;
i, px : integer; begin Liste := TStringList.Create; Liste.LoadFromFile(dateiname); So kannst du dein record füllen: (#9 also Tabulator ist dein Trennzeichen)
Delphi-Quellcode:
px := 1;
for i:=0 to List.Count - 1 do begin telebuch[i].name := IniParseString(List[i],px,9); telebuch[i].vorwahl := IniParseString(List[i],px,#9); telebuch[i].nummer := IniParseString(List[i],px,#9); telebuch[i].email := IniParseString(List[i],px,#9); end; Liste.Free; Sorry mir ist grad aufgefallen das IniParseString eine eigene Funktion ist. Sie trennt aber nur den String am Trennzeichen auf:
Delphi-Quellcode:
Das zurüchschreiben der Einträge läuft halt genau umgekehrt.
function IniParseString (const z:string;var px:integer;const TRENN:char):string;
var i, len :integer; h : string; begin len := length (z); h := ''; for i := px to len do begin px := px + 1; if z[i] = TRENN then begin result:= h; exit; end; h := h + z[i]; end; result:= h; end; mfg Daniel |
ok habe das mal alles in mein programm reinkopiert.
aber was ist ein trennzeichen? was soll ich da denn einfügen? danke im voraus Joe.fresh |
'#9' würde sich als Trennzeichen anbieten (Tabulator), du kannst natürlich auch jedes andere Zeichen verwenden (ev. '#',...).
Es dient einfach dazu, dass du die Zeile aus der Datei wieder in die Strings von teintrag aufsplitten kannst. Ohne Trennzeichen weisst du ja nicht, wo ein String aufhört und der nächste beginnt. mfg Daniel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:53 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