Entwickler-Ecke
Dateizugriff - Assoziative Arrays und andere Fragen.
Anonymous - Do 13.03.03 18:43
Titel: Assoziative Arrays und andere Fragen.
Moin,
vor über einem halben Jahr hat das schon mal jemand gefragt, aber die Antwort dazu ist inakzeptabel: Gibt es in Delphi assoziative Arrays? Spricht man ein Array normalerweise mit array[12] an, so geht das mit ass. Arrays mit array['feldname']. Also gibt es das? Wenn ja, warum will das bei mir nicht?
Zweite Frage: Bei PHP gibt es mindestens zwei Funktionen (explode und split, wer sich das Manual von PHP dazu mal antuen möchte...), mit denen man einen String an bestimmten Stellen aufsplitten kann und die Teilstücke in einem Array gespeichert werden. Gibt es das etwa auch nicht bei Delphi?
Dritte Frage: Bei PHP gibt es (was gibt es da nicht...) eine Funktion, die Leerzeichen, Zeilenumbrüche (\r und \n z.B.) und andere Dinge am Anfang und am Ende eines Strings entfernt. Gehe ich recht in der Annahme, dass Delphi wieder passen muss?
Erstes Problem: Ich hab mir aus der Hilfe von diesem Progrämmchen einen bisschen Code, zum auslesen von Dateien kopiert und eben jenen ein wenig gekürzt. Das sieht dann so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| var fh: textfile; var ch: string; { ...einige Zeilen später... } assignfile(fh, 'test.dat'); reset(fh); while not eof(fh) do read(fh, ch); closefile(fh); |
Er bleibt in einer Endlosschleife hängen. Wieso ist mir nicht klar. Die Datei gibt es selbstverständlich und ist mit 08/15-Text gefüllt.
So, das war's erstmal von mir hier. Wäre fein, wenn die Fragen nicht ewig offen bleiben.
Danke.
naleh - Do 13.03.03 18:55
Wenn du mit strings arbeiten willst wuerde ich dir zu ner Stringlist raten(TStrings) koennte so gehen:
Quelltext
1: 2: 3: 4: 5:
| var sl: TStrings; i: integer; begin sl:= TStringList.create; sl.LoadFromFile('test.txt'); |
und zum anzeigen in einem memo
Quelltext
1: 2:
| memo1.clear; for i := 0 to sl.count-1 do memo1.lines.add(sl[i]); |
hab das aber nicht getestet
MfG naleh
alex_id - Do 13.03.03 19:11
Hi
hier was zu deinen assoziativen Arrays !!! es geht !!
so kann man es erzeugen und darauf zugreifen !!
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Button1Click(Sender: TObject); var Feld: TStrings; begin Feld := TStringList.Create; Feld.Add(Format('%s=%s', ['alex', '01.01.2000'])); ShowMessage(Feld.Values['alex']) // zeigt den Geburtstag an Feld.Free; end; |
ich hoffe es hilft !!
Alex
mars - Do 13.03.03 20:08
Versuchs mal mit ReadLn statt Read. Ich denke, das sollte eher deinen Wünschen entsprechen..
Tower - Fr 14.03.03 09:48
Zur dritten Frage: Nein, falsche Annahme. "Trim" heißt das Zauberwort.
Delete - Fr 14.03.03 10:05
1. Bitte für jede Frage ein Thread.
2. Wo ist der Bezug deiner Fragen zu der Sparte wo du postes?
1. Frage: Hat das was mit Dateien zu tun? Nein.
2. Frage: Hat das was mit Dateien zu tun? Nein.
3. Frage: Hat das was mit Dateien zu tun? Nein.
4. Der Code,
ja, der hat was mit der Sparte zu tun.
Also, zur 2. Frage:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| {----------------------------------------------------------------------------- Procedure : Explode Purpose : Seperates a CSV-line Arguments : const Separator, S: string; Limit: Integer = 0 Result : TStringDynArray -----------------------------------------------------------------------------} type TStringDynArray = array of string;
function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray; var SepLen: Integer; F, P: PChar; ALen, Index: Integer; begin SetLength(Result, 0); if (S = '') or (Limit < 0) then Exit; if Separator = '' then begin SetLength(Result, 1); Result[0] := S; Exit; end; SepLen := Length(Separator); ALen := Limit; SetLength(Result, ALen);
Index := 0; P := PChar(S); while P^ <> #0 do begin F := P; P := StrPos(P, PChar(Separator)); if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F); if Index >= ALen then begin Inc(ALen, 5); // mehrere auf einmal um schneller arbeiten zu können SetLength(Result, ALen); end; SetString(Result[Index], F, P - F); Inc(Index); if P^ <> #0 then Inc(P, SepLen); end; if Index < ALen then SetLength(Result, Index); // wirkliche Länge festlegen end; |
Zur 3. Frage:
trim,
StringReplace.
Zum Code: Versuch es mal mit ReadLn
Tino - Fr 14.03.03 10:25
Hallo und willkommen hier im Forum,
bitte beachte in Zukunft die Richtlinien. Speziell folgender Absatz:
| Richtlinien hat folgendes geschrieben: |
1.2 Posten in die richtige Sparte
Das Delphi-Forum ist - wie du sicherlich schon bemerkt hast - in verschiedene Sparten unterteilt, wobei sich mehrere direkt mit der Behandlung programmiertechnischer Probleme befassen. Es ist aufgrund der Anzahl von Fragen notwendig, diese in die richtige Sparte zu posten, damit kein Chaos entsteht und jedem Mitglied gezielt geholfen werden kann. |
Danke Dir!
Gruß
TINO
AndyB - Fr 14.03.03 18:38
| Luckie hat folgendes geschrieben: |
Also, zur 2. Frage:
Quelltext 1: 2: 3: 4: 5: 6:
| {----------------------------------------------------------------------------- Procedure : Explode Purpose : Seperates a CSV-line Arguments : const Separator, S: string; Limit: Integer = 0 Result : TStringDynArray -----------------------------------------------------------------------------} | |
Der Quellcode kommt mir so
bekannt [
http://www.delphipraxis.net/viewtopic.php?t=3538#25415] vor.
Delete - Fr 14.03.03 21:53
Jupp. Und? Ich habe niegrgens behauptet der Code wär von mir. Da jbg auch keinen Autor genannt hat, kann nich auch nicht sagen, ob es von ihm ist.
AndyB - Sa 15.03.03 01:34
| Luckie hat folgendes geschrieben: |
| Jupp. Und? |
War nicht böse gemeint.
| Zitat: |
| Da jbg auch keinen Autor genannt hat, kann nich auch nicht sagen, ob es von ihm ist. |
Er ist von mir.
Gruß
jbg
hitstec - Sa 15.03.03 03:00
Titel: Eine ein einbißchen einfachere Variante
Ich darf mich selbst zitieren:
http://www.swissdelphicenter.ch/de/showcode.php?id=1488
Hier ein Auszug:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type ArrOfStr = array of string;
function explode(sPart, sInput: string): ArrOfStr; begin while Pos(sPart, sInput) <> 0 do begin SetLength(Result, Length(Result) + 1); Result[Length(Result) - 1] := Copy(sInput, 0,Pos(sPart, sInput) - 1); Delete(sInput, 1,Pos(sPart, sInput)); end; SetLength(Result, Length(Result) + 1); Result[Length(Result) - 1] := sInput; end; |
Delete - Sa 15.03.03 04:59
| AndyB hat folgendes geschrieben: |
| Luckie hat folgendes geschrieben: | | Jupp. Und? |
War nicht böse gemeint.
|
Habe ich auch nicht so verstanden. :wink:
| Zitat: |
| Zitat: | | Da jbg auch keinen Autor genannt hat, kann nich auch nicht sagen, ob es von ihm ist. |
Er ist von mir.
Gruß
jbg |
Aha, also jbg und AndyB sind ein und die gleiche Person. Wenn du mir sagst, was du für einen Namen da stehen haben willst, dann wirst du mit deinem Namen namentlich in meiner AdressSB im Code erwähnt, wenn du es wünscht. Wenn es dein realer Name sein soll, schick mir eine PN.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!