Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Text-Dateien in Delphi7 (https://www.delphipraxis.net/81840-text-dateien-delphi7.html)

Frischling 4. Dez 2006 18:55


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

luigied 4. Dez 2006 21:31

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

mkinzler 5. Dez 2006 05:37

Re: Text-Dateien in Delphi7
 
Schau dir Mal die Methoden .LoadFromFile bzw. .SaveToFile der TStrings-Klasse an ( ComboBox.Items)

Frischling 5. Dez 2006 05:53

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:

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.

Der_Unwissende 5. Dez 2006 08:25

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

luigied 5. Dez 2006 14:54

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

Frischling 5. Dez 2006 16:01

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:

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

luigied 5. Dez 2006 16:44

Re: Text-Dateien in Delphi7
 
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

Der_Unwissende 5. Dez 2006 16:45

Re: Text-Dateien in Delphi7
 
Zitat:

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

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!

Frischling 6. Dez 2006 11:20

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:44 Uhr.
Seite 1 von 2  1 2      

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