![]() |
Text-Dateien in Delphi7
Hallo ihr allwissenden Progger. Ich bin noch ein ziehmlicher Newbie in Sachen Delphi und brauche deshalb eure Unterstützung:
Ich möchte eine Text-Datei erstellen, die an die 300 Zeichenketten speichern soll. Im Programm habe ich dann in der ComboBox eine Liste mit Werten und je nachdem, welchen ich wähle, soll eine dieser Zeichenketten angezeigt werden(Wäre Memofeld dafür geeignet?). Ich habe mir schon einige Tutorials zum Thema durchgelesen, doch leider komme ich da nicht weit. Es muss immer ComboBox.Text mit Zeichenkette übereinstimmen, was ich aber nicht will. Und jetzt kommt die Frage: Wie kann ich das anstellen? Schön wäre auch, wenn die Ausgabe der Zeichenkette nach jedem Komma einen Zeilenumbruch macht, also: Wert 1, Wert 2, Wert 3 ----> Wert 1 Wert 2 Wert 3 Ich würde mich über eine leichte und verständliche Erklärung sehr freuen :) |
Re: Text-Dateien in Delphi7
Hi
Also wie ich dich verstanden habe soll dein Programm eine bestimmte textdatei einlesen, die Werte die da drin stehen in Arrays speichern und je nachdem was aus deiner Combobox ausgewählt wird in z. B. nem Memo ausgeben. Dazu erstmal ne Frage: Wo kiegst du die Werte her, bzw. wie ist deine Datei aufgebaut? Am einfachsten wäre es natürlich du würdest für jedes auswählbare Datenarray eine Zeile in der Datei vorsehen und die Werte durch Komma getrennt reinschreiben. Dann brauchst du beim Einlesen bloß 2 Schleifen. Eine für die Zeilen und eine für die Werte je Zeile. Hoffe das hat dir n bissl geholfen |
Re: Text-Dateien in Delphi7
Schau dir Mal die Methoden .LoadFromFile bzw. .SaveToFile der TStrings-Klasse an ( ComboBox.Items)
|
Re: Text-Dateien in Delphi7
Hi luigied,
ja, du hast alles richtig verstanden :-D Mit Arrays habe ich in Delphi noch nicht gearbeitet(nur in TurboPascal), sollte aber nicht das Problem sein. Mein Problem ist, dass ich nichts darüber finde, wie ich die Zeile auslese, geschweige denn, wie ich die Zeile dann splitte(duch Komma getrennte Werte einzeln im Array ablegen). Ein kleiner Denkanstoß wäre da hilfreich. Um ein konkretes Beispiel zu nennen: Es geht um ein Rollenspiel und ich möchte alle Waffen, die es zu finden gibt über die ComboBox anwählen können, worauf mir deren Schaden, Wert etc. angezeigt wird. Zitat:
Zitat:
EDIT: @mkinzler: Ja, ein bissel habe ich mir da schon zusammengesucht. Bis jetzt hat es aber noch nicht für die Umsetzung gereicht. |
Re: Text-Dateien in Delphi7
HI und erstmal herzlich Willkommen in der DP :dp:
Dateien, die mehrere Datensätze über ein Zeichen trennen sind unter dem Namen CSV (Character Seperated File) bekannt. Such einfach mal in der DP nach ![]() Im Prinzip hat mkinzler schon alles wichtige Gesagt, du kannst mit der Methode LoadFromFile von der Klasse TStrings eine Datei laden. TStrings kannst du dabei nicht direkt instanziieren (solltest es jedenfalls nicht tun), da diese Klasse abstrakt ist. Du musst einfach nur einen der Nachfahren verwenden (TStringsList oder THashedStringList). Beim Laden solltest du darauf achten, dass du einen absoluten Pfad angibst (relative Pfade beziehen sich immer auf das aktuelle Arbeitsverzeichnis, das wechseln kann, was aber ein anderes Thema ist). Am saubersten ist es, sich den absoluten Pfad zur Laufzeit zu generieren. Dazu kannst du einfach den ParamStr(0) verwenden, hier findest du den kompletten Pfad zu deiner Anwendung (Verzeichnis + Name der Exe). Extrahierst du hier den Pfad hast du zwar etwas absolutes, da es aber erst zur Laufzeit erzeugt wird ist dieser auf jedem System gültig. Alles hinter diesem Pfad kann dann relativ sein. Auf die einzelnen Zeilen kannst du in einem TStrings Objekt direkt wie bei einem Array zugreifen. So kommst du schonmal an alle Zeilen, die gespeichert wurden.
Delphi-Quellcode:
Ja, statt doFoo solltest du natürlich eine sinnvolle Funktion verwenden. Der Rest ist dann das zerlegen des Strings anhand der Komma (oder eines Trennzeichens), da wirst du in der Codelib sicherlich eine explode-Funktion finden bzw. einen StringTokenizer oder wie man die sonst so nennt.
var strings : TStrings;
path : String; i : Integer; begin strings := TStringList.Create; try // hier den absoluten Pfad zur Exe ermitteln (der Name der Exe wird "abgeschnitten" path := ExtractFilePath(ParamStr(0)); // einen relativen Pfad (von dem Ordner in dem die Exe liegt) // und den Dateinamen ergänzen path := path + 'DeineDatei.xyz'; // Laden der Datei strings.LoadFromFile(path); if strings.Count > 0 then begin // alle Zeilen auslesen und weiterverarbeiten for i := 0 to strings.Count - 1 do begin // doFoo ist dann die Methode, die den String weiterverarbeitet doFoo(strings[i]); end; // for i := 0 to strings.Count - 1 end; // if strings.Count > 0 finally strings.Free; end; An sich hier aber auch die Bitte, wenn du schon etwas versucht hast und nicht weiter kommst, dann sag doch einfach mal was genau du gemacht hast und was passiert ist. Das hilft dann den Leuten, die dir helfen wollen. Vielleicht bist du ja schon auf dem total richtigen Weg und hast nur einen kleinen Fehler drin. Man kann es dir einfach leichter erklären und man sieht auch, dass du dich bemühst (meine nicht, dass es hier nicht so rüber kam!). Wenn also etwas noch nicht für die Umsetzung reicht, einfach mal sagen was du schon hast und wie du dir das denkst. Gruß Der Unwissende |
Re: Text-Dateien in Delphi7
Hi,
Vielleicht wäre es auch sinnvoll dir vorher zu überlegen, wie die Zeile aufgebaut ist, damit du dann über die Indizes die Werte zuweisen kannst. Ich meine damit sowas wie: Name, normalerSchaden, Feuerschaden, Eisschaden, Wert, Fundort Das würde dann für dein Bsp.: Zitat:
Zitat:
|
Re: Text-Dateien in Delphi7
@ Der_Unwissende:
Danke für die nette Begrüßung. Das mit dem absoluten Pfad ist sehr nützlich. Sehe ich noch als Luxus an, aber nützlich. Danke dafür. Also, ich habe jetzt deinen Code übernommen. Nein, nicht Copy/Paste(würde ich ja nichts lernen). Ich hatte gehofft, alleine weiterzukommen(Google etc.), aber Fehlanzeige. ich finde keine Infos darüber, wie ich weiter vorgehen soll. Ist wohl zu einfach, als dass sich jemand damit befasst^^ In der Text-Datei steht jetzt Zitat:
Die von dir angesprochene explode-Funktion habe ich in der Lib gefunden, aber da verstehe ich mal garnichts. Es gibt doch sicher eine einfachere Möglichkeit, einen String zu zerlegen und deren Einzelteile in ein Memo-Feld auszugeben, oder? Und zu deiner "Kritik": Ich hatte es nur vollbracht, eine Text-Datei zu erstellen. Mehr war nicht drin(ist es immernoch nicht*schnief*). Ich werde mir deinen Ratschlag aber zu Herzen nehmen :wink: @ luigied: So wie ich die Ausgabe der Teilstrings geplant habe, MUSS ich sie machen. Dein Vorschlag ist nett gemeint, aber für meine Zwecke eher unbrauchbar. Wie ich das umsetzen soll, weiss ich aber auch noch nicht. Ich hoffe ja auf eure Hilfe. P.s. Zuviel sollt ihr nicht verraten, aber ich bin leider noch sehr, sehr grün hinter den Ohren, was Programmierung betrifft. Man möge mir verzeihen. |
Re: Text-Dateien in Delphi7
Servus,
Zitat:
So zum Beispiel:
Delphi-Quellcode:
Die Funktion musst du dann für jede Zeile aufrufen.
///Parameter: zu zerlegender string
function Werte(Szeile: String): Array of string; var i, iCur_val: integer; Scur_val, edit: string; begin SetLength(Werte, 1); // mind. ein Wert steht in der Zeile i:=0; // 1. Zeichen im String iCur_val:=0; // 1. Wert, der in der Zeile steht repeat // wiederhohle SetLength(Werte, Length(Werte)+1); Scur_val:=''; // der Wert ist leer repeat sCur_val:=Scur_val + Szeile[i]; // aktuelles Zeichen zum Wert hinzufügen inc(i); // an nächste Stelle springen until Szeile[i] =','; // bis ein Komma kommt Werte[iCur-Val]:= Scur-Val; until Szeile[i+1] = ''; // bis die Zeile zu Ende ist end; PS: Code ist nicht getestet |
Re: Text-Dateien in Delphi7
Zitat:
Was die einfachen Funktionen angeht, so kann ich hier auf Pos (liefert die Position eines Teilstrings in einem String) und Copy (erklärt sich von selbst, oder?) verweisen. Mit diesen beiden Funktionen kannst du dir einen String zerlegen. Natürlich sei hier darauf verwiesen, dass du nicht mit der Geschwindigkeit anderer Lösungen konkurrierst, aber das sollte dir im Moment wohl eher egal sein (oder?). Eine weitere Alternative, die du auch hast liegt in den Ini-Dateien (OH zum Thema TIniFile und TMemIniFile), der vollständigkeit halber sei natürlich auch XML erwähnt. In beiden Fällen hast du weitere strukturierte Textdateien. Im Falle von Ini folgt der Aufbau dabei der Struktur [Sektion1] Schluessel1 = Wert Schluessel2 = Wert ... [Sektion2] Schluessel1 = Wert Schluessel2 = Wert ... Die Namen der Sektionen kannst du dir dabei mit der Kapselung in der VCL zurückgeben lassen. Die Schluessel könnten dem Level, Bezeichner, ... entsprechen und hier kannst du direkt den Wert zu einer Sektion und hier dem Schlüssel abfragen, ohne dass du dich um das Trennen kümmern musst. Bei XML sollte es ähnlich einfach aussehen! |
Re: Text-Dateien in Delphi7
Nach unzähligen Stunden des Probierens bin ich am Verzweifeln. Ich hänge immer bei dem Problem fest, dass ich TStrings nicht in Memo-Feldern ausgeben kann.
Bis jetzt habe ich 2 halbe Programme zu einem zusammengeschraubt, um wenigstens mal eine Ausgabe zu bekommen:
Delphi-Quellcode:
Ich würde nun gerne der Variablen s die Werte aus strings übergeben, was aber an TString/String scheitert. Gibt es da eine Möglichkeit für, denn dann könnte ich vlt. weiterkommen*hofft*
function parse(s: string):TStringList;
var s:string; begin result := TstringList.Create; result.CommaText := s; end; procedure TForm1.Button1Click(Sender: TObject); begin close; end; procedure TForm1.ComboBox1Change(Sender: TObject); begin s :='"Azuras Stern","Fundort: Azuras Schrein","Voraussetzung: Stufe 2","Opfergabe: Glühstaub"'; memo1.lines.Commatext := s; end; begin strings := TStringList.Create; try path := ExtractFilePath(ParamStr(0)); path := path + 'Testdatei.txt'; strings.LoadFromFile(path); if strings.Count > 0 then begin for i := 0 to strings.Count - 1 do begin end; end; finally strings.Free; end; P.s. Delphi-Hilfe/Suche/Google wurde ausreichend genutzt. Hat leider nichts gebracht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:44 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