Autor Beitrag
Asgar
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 160

XP Home Edition
D5
BeitragVerfasst: Di 03.05.05 14:05 
Hallo erstmal.
Ich habe folgendes Problem.
In einer Textdatei steht ein Link (z.B.:%PROGRAMMS%\%PROGRAMMGROUP%\Uninstall)
Der Link besteht aus den Teilen Position des Links=%PROGRAMMS%, Verzeichnis des Links=%PROGRAMMGROUP% und dem Namen des Links=Uninstall
Jetzt soll das programm diesen Link aufteilen und seine Einzelteile in eine Tabelle schreiben. Wie mache ich das am Besten? Kenne keinen Befehl dafür da ich noch Anfänger bin.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 03.05.05 15:15 
Nun ja, es gibt den Befehl Pos. Der gibt die Position eines Strings innerhalb eines anderen zurück.
Und mit Copy kann ein bestimmter Teil des durchsuchten Strings geholt werden.

Damit solltest du es mal versuchen.

Aber hier mal ein bisschen Quelltext...
Ich hab irgendwann mal ne Funktion geschrieben, die das ganze etwas langsamer aber dafür selbstständig durchführt...

ausblenden volle Höhe Delphi-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:
procedure ParseString(AnalyzeString, Trennung: String;
  var Daten: TStringList); overload;
var tmpString: String;
begin
  if Daten = nil then
    Daten:=TStringList.Create
  else
  Daten.Clear;
  //Neue Stringliste erzeugen
  while Length(AnalyzeString)>0 do begin
    //Solange noch etwas im String enthalten ist,...
    //Alle schon berücksichtigten Teile werden ja entfernt
    If Pos(Trennung,AnalyzeString)>0 then begin
      tmpString:=Copy(AnalyzeString,1,Pos(Trennung,AnalyzeString)-1);
      Delete(AnalyzeString,1,Pos(Trennung,AnalyzeString));
    end Else begin
      tmpString:=AnalyzeString;
      AnalyzeString:='';
    end;
    Daten.Add(tmpString);
    //Bestandteil hinzufügen
  end;
  //WICHTIG: Stringliste wieder aus dem Speicher entfernen
  //(mit Free), da nur ggf. die Erzeugung hier stattfindet
end;

//Aufruf:

var
  Parts: TStringList;
  i: Integer;
begin
  ParseString(DeinString, '\', Parts);
  for i := 0 to Parts.Count - 1 do
    ShowMessage(Parts[i]);
  Parts.Free;
    //Wichtig: Mit Free freigeben, erzeugt wird die Liste zwar, aber nicht wieder freigegeben...
end;


Erklärung:
ParseString bekommt den zu parsenden String und das Trennzeichen, an dem es trennen soll. Außerdem muss eine Variable vom Typ TStringlist mit übergeben werden, in die dann die einzelnen Teile kommen.
Dann kann mit Parts[i] auf die einzelnen Bestandteile zugegriffen werden, als Beispiel zeigt der Code oben die mit jeweils einem Meldungsfenster an...
Asgar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 160

XP Home Edition
D5
BeitragVerfasst: Di 03.05.05 15:19 
Danke für die schnelle Hilfe.
Das mit pos funktioniert bei mir, aber wenn das selbe Zeichen nach dem ich suche noch einmal in dem String vorkommt, soll er mir auch die Position davon sagen. Aber er gibt mir nur die erste Position aus.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 03.05.05 15:27 
Dafür gibts Delete, das löscht einen Teil des Strings, d.h. nachdem ein teil mit Copy fertig ist, kann er mit denselben Parametern an Delete gelöscht werden.
Der String muss aber ein einfacher String sein, d.h. darf nicht eine Eigenschaft oder so sein, aber das merkst du, wenn der Compiler meckert...

2. Möglichkeit, falls der String unverändert bleiben soll: Es gibt PosEx, das macht dasselbe wie Pos, sucht aber erst ab einer angegebenen Stelle...
Asgar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 160

XP Home Edition
D5
BeitragVerfasst: Di 03.05.05 15:30 
ok, es funktioniert jetzt.
Danke.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 03.05.05 15:33 
Wie wäre es mit Suche in: Delphi-Forum, Delphi-Library EXPLODE?