Text aus einem Feld auf mehrere andere Felder verteilen

21. August 2019 09:15

Hallo zusammen,

ich habe einen Text in einem Feld was 100 Zeichen aufnehmen kann.
Diesen Inhalt von max. 100 Zeichen muß ich auf 4 andere Felder aufteilen, welche jeweils 50 Zeichen aufnehmen können.
Allerdings darf der 100 Zeichen lange Text nur an den Stellen getrennt werden, wo ein Leerzeichen ist, was beliebiger stelle vorkommen kann.
Leider stehe ich da gerade etwas auf dem Schlauch und habe nur vage Ansätze mit Arrays, komme da aber nicht weiter.
Habt ihr eine Idee wie man die Anforderung am elegantesten umsetzen könnte?
Ich hoffe ich konnte mein Problem verständlich darstellen.

Vielen Dank und Grüße

Re: Text aus einem Feld auf mehrere andere Felder verteilen

21. August 2019 09:25

Du suchst das Space (ggf. auch einen Bindestrich), das am nächsten an der Länge (aber kleiner) des ersten Textfelds ist, schreibst das ins erste, und fährst mit dem Rest und dem nächsten Textfeld fort. Ein Array ist etwas eleganter, aber spart auch nicht wirklich Arbeit, da du am Ende das Array in die Felder schreiben muss - also kann man das auch gleich machen.

Re: Text aus einem Feld auf mehrere andere Felder verteilen

21. August 2019 09:29

Hier meine Funktion dazu
Ich glaube aber das es "List of" in 2015 noch nicht gibt, das musst du dann also gegen nen Array austauschen

Code:
    procedure IntelligentTextSplit(OrgText: Text; MaxSplitLength: Integer;var SplittedText: List of [Text])
    var
        CurrSplitText: Text;
        PossibleSplitText: Text;
        i: Integer;
    begin
        clear(SplittedText);
        repeat
            OrgText := DelChr(OrgText, '<>', ' ');
            if StrLen(OrgText) <= MaxSplitLength then
                CurrSplitText := OrgText
            else begin
                PossibleSplitText := CopyStr(OrgText, 1, MaxSplitLength);
                if (CopyStr(OrgText, MaxSplitLength, 1) = ' ') or (PossibleSplitText = DelChr(PossibleSplitText, '=', ' ')) then
                    CurrSplitText := PossibleSplitText
                else
                    for i := MaxSplitLength downto 1 do
                        if PossibleSplitText[i] = ' ' then begin
                            CurrSplitText := CopyStr(OrgText, 1, i);
                            break;
                        end;
            end;
            OrgText := DelChr(OrgText, '<', CurrSplitText);
            SplittedText.Add(DelChr(CurrSplitText, '>', ' '));
        until (StrLen(OrgText) = 0);

        for i := SplittedText.Count() to 10 do // dirty fix for: access a key which does not exist raise an error
            SplittedText.Add('');
    end;

Re: Text aus einem Feld auf mehrere andere Felder verteilen

21. August 2019 10:08

Zerlegen und jeweils nach dem letzen Leerzeichen suchen sollte auch gehen, Funktion dafür hier.

Re: Text aus einem Feld auf mehrere andere Felder verteilen

21. August 2019 11:01

Hallo,

hab's jetzt nicht getestet, könnte aber so funktionieren. Die Funktion gibt in pStrArr die Formatierten Felder zurück, und als return die Anzahl der gefüllten Felder (0= keine Daten)

Code:
SplittStrFill(pStr : Text;VAR pStrArr : ARRAY [4] OF Text,pMaxStrlen : Integer)Arrind : Integer
VAR
   StrArr : ARRAY [20] OF Text;
   I: Integer;
   I2 : Integer;
if pStr='' then
  EXIT(0);
CLEAR(pStrArr);
ArrInd:=1;
FOR i :=1 TO STRLEN(pStr) DO BEGIN // String nach jedem Leerzeichen trennen und den Text in ein Array- Feld speichern
  IF pStr[i] = ' ' THEN
    ArrInd+=1
  ELSE
    StrArr[ArrInd] += COPYSTR(pStr,i,1);
END;
// Text wieder so zusammenfügen, das in jedem Zielfeld möglichst viel Text steht
CLEAR(pStrArr);
i2 := 1;
I := 1;
While  (I <= ArrInd) DO BEGIN
   if (strlen(pStrArr[I2])+strlen(StrArr[i]) <  pMaxStrlen) then begin // Text passt in das aktuelle Zielfeld rein
     pStrArr[i2] += (' '+StrArr[i]);
     delchr(pStrArr[i2],'<');  // Leerzeichen am Anfang wollen wir nicht
     i +=1;
   END ELSE
     if pStrArr[I2] <> '' then // Text passt nicht, könnte ab er in ein leeres passen
       i2 +=1;
     ELSE  BEGIN // Zielfeld ist leer, passt aber trotzdem nicht
       pStrArr[i2] := copystr(StrArr[i],1,pMaxStrlen);
       i2 +=1;'
       StrARrr[i] := copystr(StrArr[i],pMaxStrlen+1);
     END;
END;
if pStrrArr[i2] = '' THEN // das letzte Zielfeld ist leer
  i2 -=1;
ArrInd := i2;


Gruß Fiddi

Re: Text aus einem Feld auf mehrere andere Felder verteilen

22. August 2019 16:29

Vielen Dank für eure Hilfe/Anregungen