AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Herauslösen eines Strings im string
Thema durchsuchen
Ansicht
Themen-Optionen

Herauslösen eines Strings im string

Ein Thema von Ajintaro · begonnen am 28. Feb 2014 · letzter Beitrag vom 4. Mär 2014
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#1

AW: Herauslösen eines Strings im string

  Alt 28. Feb 2014, 11:44
Anstatt immer nur mit Pos() und Delete() zu arbeiten würde ich besser eine Funktion einsetzen die spezieller auf die Aufgabe zugeschnitten ist:
Delphi-Quellcode:
function StrToken(var S: string; Separator: Char): string; // kopiert aus der JCL
var
  I: Integer;
begin
  I := Pos(Separator, S);
  if I <> 0 then
  begin
    Result := Copy(S, 1, I - 1);
    Delete(S, 1, I);
  end
  else
  begin
    Result := S;
    S := '';
  end;
end;
Und dann:
Delphi-Quellcode:
  s := ListBox2.Items[ListBox2.ItemIndex];
  s_1 := StrToken(s, ','); // ID abtrennen
  s_2 := StrToken(s, ','); // Headline abtrennen
Dieser Code ist wesentlich besser zu verstehen als die ganze Serie von Delete, Pos und Length.
Sollte in Zukunft ein ähnliches Problem anstehen, dann hast du gleich eine Funktion um es zu lösen.
fork me on Github
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#2

AW: Herauslösen eines Strings im string

  Alt 28. Feb 2014, 15:17
Warum zerlegst du es erst wenn das angeklickt wird, wieso hängst du nicht gleich einen Datensatz an das Item und liest dann bequem die Infos aus dem Datensatz?
Delphi-Quellcode:
Type
  TDatensatz = class
    ID: String; //oder Integer
    HEADLINE: String;
    TEXT1: String;
    TEXT2: String;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
  Datensatz: TDatensatz;
begin
  s := '12345,[WASSER],Wasser ist, wie es ist=Muss geschützt werden, oder?';

  Datensatz := TDatensatz.Create;
  Datensatz.ID := '12345';
  Datensatz.HEADLINE := 'WASSER';
  Datensatz.TEXT1 := 'Wasser ist, wie es ist';
  Datensatz.TEXT2 := 'Muss geschützt werden, oder?';

  with ListBox2 do Items.AddObject(s, Datensatz);
end;

procedure TForm1.ListBox2Click(Sender: TObject);
var
  s: String;
  Datensatz: TDatensatz;
begin
  with ListBox2 do if ItemIndex < 0 then Exit;

  with ListBox2 do s := Items[ItemIndex];
  with ListBox2 do Datensatz := TDatensatz(Items.Objects[ItemIndex]);

  ShowMessage(
   'Item-String: ' + s + #13#10 +
   'ID: ' + Datensatz.ID + #13#10 +
   'HEADLINE: ' + Datensatz.HEADLINE + #13#10 +
   'TEXT1: ' + Datensatz.TEXT1 + #13#10 +
   'TEXT2: ' + Datensatz.TEXT2
    );
end;
Evtl. mußt du vorher noch OwnsObjects auf True setzten. Bei Delphi 7 geht das nicht, bei deiner Version sollten die Eigenschaft vorhanden sein. Wenn OwnsObjects auf True ist, mußt du die Objekte beim Löschen der Items nicht vorher freigeben.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.669 Beiträge
 
Delphi 12 Athens
 
#3

AW: Herauslösen eines Strings im string

  Alt 28. Feb 2014, 15:23
Wenn die "Datensätze" aus einer Textdatei kommen, müssen sie doch trotzdem geparst werden. Von daher erschließt sich mir der Nutzen nicht so richtig.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: Herauslösen eines Strings im string

  Alt 28. Feb 2014, 15:56
@DeddyH

Wird nicht allgemein behauptet, dass man Daten und Darstellung trennen sollte?

@Ajintaro

Würdest du die Daten in der Form speichern:
Code:
"ID","[HEADLINE]","TEXT1","TEXT2"
könntest du die Zeile in ein TStrings, bzw. TStringList als CommaText einlesen. Das Ergebnis wäre z. B. eine TStrigList mit vier Zeilen, von denen jede eine Info enthalten würde. In dem Fall würde das System für dich die Zeile trennen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.669 Beiträge
 
Delphi 12 Athens
 
#5

AW: Herauslösen eines Strings im string

  Alt 28. Feb 2014, 15:59
@DeddyH

Wird nicht allgemein behauptet, dass man Daten und Darstellung trennen sollte?
Und was hat das mit Deinem Code zu tun? Der müsste auch erst parsen, oder sollen überall dieselben konstanten Strings benutzt werden? Und wenn schon eine Klasse, dann aber bitte mit Properties, wie es sich gehört.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: Herauslösen eines Strings im string

  Alt 28. Feb 2014, 16:04
Wo steht das, dass Properties sein müssen?

Sicher, man kann das schöner und besser machen, aber für diese Aufgabe reicht es.
  Mit Zitat antworten Zitat
DayDreamer87

Registriert seit: 25. Feb 2012
2 Beiträge
 
#7

AW: Herauslösen eines Strings im string

  Alt 28. Feb 2014, 17:54
Bin mir jetzt zwar nicht ganz sicher obs passt, liest sich aber so^^

Ein Bekannter hat mir vor einiger Zeit mal eine kleine Funktion geschrieben, die genau das tut was sie tut.

Delphi-Quellcode:
function getTextBetweenStrings(const source, startStr, endStr: String;
  var offset: integer; includeSubstrings: Boolean = False): String;
var
  startIndex, endIndex: integer;
begin
  startIndex := PosEx(startStr, source, offset);
  offset := startIndex + 1;

  if (startIndex > 0) then
  begin
    startIndex := startIndex + Length(startStr);
    endIndex := PosEx(endStr, source, startIndex) + Length(endStr);

    if not includeSubstrings then
      endIndex := endIndex - Length(endStr)
    else
      startIndex := startIndex - Length(startStr);

    Result := MidStr(source, startIndex, endIndex - startIndex);
  end
  else
    Result := '';
end;
GIbt mir persönlich immer genau das zurück, was ich gerade suche

Grüße

Day
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#8

AW: Herauslösen eines Strings im string

  Alt 28. Feb 2014, 16:04
Und wenn schon eine Klasse, dann aber bitte mit Properties, wie es sich gehört.
Reine DTO benötigen keine Properties. OO-Fetischisten verneinen dies, aber die würden vielleicht auch For-Schleifen, Break, Exit, und Continue verteufeln.

Nee, im Ernst: Passt scho' bei reinen DTO. Ich halte das auch -speziell bei Delphi- für Overkill, eine Klasse mit quasi Autoproperties anzulegen (die es in Delphi ja leider nicht gibt) und alles wozu diese Properties da sind, ist dann, ein privates Feld zu füllen oder zu liefern. Blödsinn. In C# ist das kein Problem, weil man einfach nur
Code:
class Foo
  string Bar{get;set;}
..
schreibt. In Delphi muss man mal wieder nen halben Roman schreiben.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.669 Beiträge
 
Delphi 12 Athens
 
#9

AW: Herauslösen eines Strings im string

  Alt 28. Feb 2014, 16:23
Und worin genau liegt der Zugewinn einer reinen Datenklasse zu einem statischen Array oder einem Record, außer dass man eine Klasse hat und damit "OOP programmiert"?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Ajintaro
Ajintaro

Registriert seit: 20. Okt 2004
Ort: Sankt Augustin
138 Beiträge
 
Delphi XE6 Starter
 
#10

AW: Herauslösen eines Strings im string

  Alt 28. Feb 2014, 15:39
Hallo ihr lieben,

Ich habe etwas weiter experimentiert und dabei eure Vorschläge berücksichtigt. Zunächst hat DeddyH den Fehler in meines codes erkannt, der 2. index wird um die Zeichen verschoben, welche ich vorher entferne

Die Funktionslösung von sx2008 hat mir auch sehr gut gefallen, das ist in der Tat besser als meine Delete-Serie. Allerdings bekomm ich dann ein Problem, wenn der Datensatz keine [HEADLINE] hat. Dann stürzt sich die Funktion auf das nächste Komma, nämlich auf den Satzzeichen und zerpflückt den Text:
Code:
Wasser ist, wie es ist
in
Code:
wie es ist
Es kommt dann zum selben Problem wie in meiner Lösung: der Index passt nicht mehr.

Den Ansatz von Popov muss ich noch testen. Da die Listbox von einer Datei mit 400 Zeilen gespeist wird, müsste ich zunächst Zeile für Zeile:
Code:
'12345,[WASSER],Wasser ist, wie es ist=Muss geschützt werden, oder?'
als Datensatz: TDatensatz; einlesen.
Jaimy
DAoC 2.0 -> Camelot Unchained !
  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 05:33 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