AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Text-Dateien in Delphi7

Ein Thema von Frischling · begonnen am 4. Dez 2006 · letzter Beitrag vom 6. Dez 2006
Antwort Antwort
Seite 1 von 2  1 2      
Frischling

Registriert seit: 4. Dez 2006
24 Beiträge
 
Delphi 7 Enterprise
 
#1

Text-Dateien in Delphi7

  Alt 4. Dez 2006, 18:55
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
  Mit Zitat antworten Zitat
Benutzerbild von luigied
luigied

Registriert seit: 14. Jan 2006
31 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Text-Dateien in Delphi7

  Alt 4. Dez 2006, 21:31
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
mfg, Luigi
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Text-Dateien in Delphi7

  Alt 5. Dez 2006, 05:37
Schau dir Mal die Methoden .LoadFromFile bzw. .SaveToFile der TStrings-Klasse an ( ComboBox.Items)
Markus Kinzler
  Mit Zitat antworten Zitat
Frischling

Registriert seit: 4. Dez 2006
24 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Text-Dateien in Delphi7

  Alt 5. Dez 2006, 05:53
Hi luigied,
ja, du hast alles richtig verstanden

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:
Feuerschaden 35 Pkt., 12.000 Gold, Mephalas Schrein
Zitat:
Flammenschwert
Feuerschaden 35 Pkt.
Wert: 12.000 Gold
Fundort: Mephalas Schrein
Die Waffen schreibe ich alle in die ItemList der ComboBox(Könnte ich ja eigentlich auch aus einer Text-Datei auslesen, oder?).


EDIT:
@mkinzler:
Ja, ein bissel habe ich mir da schon zusammengesucht. Bis jetzt hat es aber noch nicht für die Umsetzung gereicht.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#5

Re: Text-Dateien in Delphi7

  Alt 5. Dez 2006, 08:25
HI und erstmal herzlich Willkommen in der 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 Hier im Forum suchencsv.
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:
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;
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.

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
  Mit Zitat antworten Zitat
Benutzerbild von luigied
luigied

Registriert seit: 14. Jan 2006
31 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Text-Dateien in Delphi7

  Alt 5. Dez 2006, 14:54
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:
Flammenschwert
Feuerschaden 35 Pkt.
Wert: 12.000 Gold
Fundort: Mephalas Schrein
z.B. so aussehen:

Zitat:
Flammenschwert, 0, 35, 0, 12000, Mephalas Schrein
Is nur n Vorschlag.
mfg, Luigi
  Mit Zitat antworten Zitat
Frischling

Registriert seit: 4. Dez 2006
24 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Text-Dateien in Delphi7

  Alt 5. Dez 2006, 16:01
@ 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:
Azuras Stern,Azuras Schrein,Stufe 2,Glühstaub
Ebenholz-Klinge,Mephalas Schrein,Stufe 15,Tollkirsche
Habe also das aus der ComboBox auswählbare Item an erster Stelle stehen, damit die Suche einfacher ist.

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


@ 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.
  Mit Zitat antworten Zitat
Benutzerbild von luigied
luigied

Registriert seit: 14. Jan 2006
31 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Text-Dateien in Delphi7

  Alt 5. Dez 2006, 16:44
Servus,

Zitat:
Es gibt doch sicher eine einfachere Möglichkeit, einen String zu zerlegen und deren Einzelteile in ein Memo-Feld auszugeben, oder?
Du kannst dir die explode-Funktion doch auch selbst schreiben.

So zum Beispiel:

Delphi-Quellcode:
///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;
Die Funktion musst du dann für jede Zeile aufrufen.

PS: Code ist nicht getestet
mfg, Luigi
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#9

Re: Text-Dateien in Delphi7

  Alt 5. Dez 2006, 16:45
Zitat von Frischling:
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
Hm, du möchtest dir die Kritik zu Herzen nehmen, ich vermisse aber was genau du zum Thema Explode gefunden hast und was du nicht verstehst. Da es wahrscheinlich eine sehr perfomante Lösung sein wird, denke ich wirst du wohl einen großen Teil nicht so ganz verstehen, aber selbst dann wäre es halt wieder schön, wenn du einfach sagst wo grob die Probleme liegen.
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!
  Mit Zitat antworten Zitat
Frischling

Registriert seit: 4. Dez 2006
24 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Text-Dateien in Delphi7

  Alt 6. Dez 2006, 11:20
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:
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;
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*

P.s.
Delphi-Hilfe/Suche/Google wurde ausreichend genutzt. Hat leider nichts gebracht.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:57 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