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 mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen) (https://www.delphipraxis.net/171663-mehrere-strings-einen-string-vereinen-mit-fixer-laenge-festen-positionen.html)

Helmi 17. Nov 2012 22:06

mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
 
Hallo,

ich steh gerade auf dem Schlauch.

Ich habe folgende Bedingungen an einen AnsiString:
  1. genau 40 Zeichen lang.
  2. Ab 1. bis 3. Stelle soll der Inhalt eines anderen Strings (S_Linie) eingefügt werden.
  3. 4. Stelle = Leerzeichen
  4. 5. bis 33. Stelle = Inhalt eines zweiten Strings (S_Ziel)
  5. 35. Stelle = Leerzeichen
  6. 36. bis 40. Stelle = Inhalt eines dritten Strings (S_Laenge)

Ich habe es mit Insert probiert, als auch mit Format.
Aber bei
Delphi-Quellcode:
Insert
wird der Text trotzdem länger (irgendwie auch klar) und bei
Delphi-Quellcode:
Format
(z. B. mit %.3s als Argument) bekomm ich einen Argumentfehler.

Wie kann ich den String zusammenbauen mit den Randbedingungen?
Ausser jeden String in einer Schleife durchzugehen und Zeichen für Zeichen im End-String zu positionieren

Popov 17. Nov 2012 22:19

AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
 
Gibt es einige Möglichkeiten. Die erste:

Delphi-Quellcode:
var
  a, b, c, x: String;
begin
  x := '1234567890123456789012345678901234567890'; //40Zeichen
  a := 'abc'; //3 Zeichen
  b := 'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖ'; //28
  c := 'äöüß#';

  Delete(x, 1, 3);
  Insert(a, x, 1);

  x[4] := ' ';

  Delete(x, 5, 28);
  Insert(b, x, 5);

  x[35] := ' ';

  Delete(x, 36, 5);
  Insert(c, x, 36);

  ShowMessage(x);
  ShowMessage(IntToStr(Length(x)));
end;
Eine andere:
Delphi-Quellcode:
var
  i: Integer;
  a, b, c, x: String;
begin
  x := '1234567890123456789012345678901234567890'; //40Zeichen
  a := 'abc'; //3 Zeichen
  b := 'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖ'; //28
  c := 'äöüß#';

  //hier aber vorsicht! zuerst prüfen ob x lang genug ist und nicht überschritten wird

  for i := 1 to Length(a) do
    x[1 - 1 + i] := a[i];

  x[4] := ' ';

  for i := 1 to Length(b) do
    x[5 - 1 + i] := b[i];


  x[35] := ' ';

  for i := 1 to Length(c) do
    x[36 - 1 + i] := c[i];

  ShowMessage(x);
  ShowMessage(IntToStr(Length(x)));
end;

Helmi 17. Nov 2012 22:23

AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
 
ich vergaß zu erwähnen, dass die einzufügenden Strings nicht unbedingt genau die Länge haben, die für sie definiert sind.
Also der erste String z. B. kann 3 Zeichen, muss aber nicht.

Momentan mach ich es so:
Delphi-Quellcode:
  //auf 40 Zeichen setzen (=max. Länge der Zeile des LCD-Moduls)
  SetLength(S_Text, 40);

  S_Text := StringOfChar(#32, length(S_Text));

  for i := 1 to length(S_Linie) do
    begin
      If i > 3 then
        break;

      S_Text[i] := S_Linie[i];
    end;

  for i := 1 to length(S_Ziel) do
    begin
      If i > 39 then
        break;

      S_Text[i + 4] := S_Ziel[i];
    end;

Popov 17. Nov 2012 22:26

AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
 
Also solange es drunter bleibt ist das zweite Beispiel richtig. Wenn es länger werden kann, dann zuerst prüfen.

Helmi 17. Nov 2012 22:28

AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
 
Zitat:

Zitat von Popov (Beitrag 1191759)
Also solange es drunter bleibt ist das zweite Beispiel richtig. Wenn es länger werden kann, dann zuerst prüfen.

So mach ich es jetzt (siehe meinem 2. Post) - nur vielleicht da ja was einfacheres

Uwe Raabe 17. Nov 2012 22:30

AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
 
Geht auch einfacher:

Delphi-Quellcode:
uses
  System.SysUtils, System.StrUtils;
...
  result := Format('%-3s %-28s %-5s', [LeftStr(a, 3), LeftStr(b, 28), LeftStr(c, 5)]);

Helmi 17. Nov 2012 22:39

AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1191761)
Geht auch einfacher:

Delphi-Quellcode:
uses
  System.SysUtils, System.StrUtils;
...
  result := Format('%-3s %-28s %-5s', [LeftStr(a, 3), LeftStr(b, 28), LeftStr(c, 5)]);

So einfach wollt ich es :-)
Wieso hab ich das "-Zahl" nicht in der Doku gefunden? :gruebel:

Sir Rufo 17. Nov 2012 23:46

AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
 
Weil du es überlesen hast?
Zitat:

Formatbezeichner werden in der folgenden Form angegeben:
"%" [Index ":"] ["-"] [Breite] ["." Genauigkeit] Typ
Jeder Formatbezeichner beginnt mit dem Zeichen %. Auf das Prozentzeichen folgen die folgenden Elemente (in der aufgeführten Reihenfolge):
Ein optionaler Argumentindex-Bezeichner mit dem Offset Null (erstes Element hat den Index 0): [Index ":"].
Eine optionale Angabe für die linksbündige Ausrichtung: ["-"].
Eine optionale Breitenangabe: [Breite].
Eine optionale Genauigkeitsangabe: ["." Genauigkeit].
Das Zeichen für den Konvertierungstyp: Typ.
http://docwiki.embarcadero.com/Libra...ysUtils.Format

Helmi 17. Nov 2012 23:49

AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
 
Zitat:

Zitat von Sir Rufo (Beitrag 1191770)
Weil du es überlesen hast?

Im Büro hätt ich jetzt gesagt:
Zitat:

Weil ich einfach alt werd!
:-D

Und ja - ich gestehe - ich habs echt überlesen!

himitsu 18. Nov 2012 02:17

AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
 
Delphi-Quellcode:
result := Format('%-3.3s %-28.28s %-5.5s', [S_Linie, S_Ziel, S_Laenge]);


Für Strings (%s) :
- = Linkbündig
*. = Minimallänge (aufgefüllt mit Leerzeichen)
.* = Maximallänge (mehr wird abgeschnitten)

Aber was soll eigentlich ein Argumentfehler sein?



Zitat:

Delphi-Quellcode:
  SetLength(S_Text, 40);
  S_Text := StringOfChar(#32, length(S_Text));

Das ist ein klein bissl sinnlos/doppeltgemoppelt. :zwinker:
Delphi-Quellcode:
  S_Text := StringOfChar(#32, 40);




Aber nur noch was zum Prinzipiellen:

Falls S_Linie und Co. auch länger sein können, als du es haben sillst, dann jeweils
Delphi-Quellcode:
S_Linie
gegen
Delphi-Quellcode:
Copy(S_Linie, 1, 3)
, bzw.
Delphi-Quellcode:
LeftStr(S_Linie, 3)
austauschen.

Delphi-Quellcode:
S := S_Linie + StringOfChar(' ', 4 - Length(S_Linie))
   + S_Ziel + StringOfChar(' ', 28{30?} - Length(S_Ziel))
   + S_Laenge + StringOfChar(' ', 5 - Length(S_Laenge));
PS: In deinem Post #1 kann ich nicht erkennen, was in Stelle 34 rein soll. :gruebel:

3 + 1 + 28 + 1 + 5 = 38
In #1 hatte ich 29 ausgerechnet, aber auch das reicht noch nicht.



Ach ja, du kannst deine Variable "Länge" jetzt auch
Delphi-Quellcode:
S_Länge
nennen. :angle:

Und wieso sind Linie und Länge eigentlich keine Integer? :angle2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz