AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Helmi · begonnen am 17. Nov 2012 · letzter Beitrag vom 18. Nov 2012
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#1

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

  Alt 17. Nov 2012, 22:06
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 Insert wird der Text trotzdem länger (irgendwie auch klar) und bei 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
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<

Geändert von Helmi (17. Nov 2012 um 22:09 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#2

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

  Alt 17. Nov 2012, 22:19
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;

Geändert von Popov (17. Nov 2012 um 22:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#3

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

  Alt 17. Nov 2012, 22:23
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;
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

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

  Alt 17. Nov 2012, 22:26
Also solange es drunter bleibt ist das zweite Beispiel richtig. Wenn es länger werden kann, dann zuerst prüfen.
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#5

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

  Alt 17. Nov 2012, 22:28
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
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 17. Nov 2012, 22:30
Geht auch einfacher:

Delphi-Quellcode:
uses
  System.SysUtils, System.StrUtils;
...
  result := Format('%-3s %-28s %-5s', [LeftStr(a, 3), LeftStr(b, 28), LeftStr(c, 5)]);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#7

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

  Alt 17. Nov 2012, 22:39
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?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

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

  Alt 17. Nov 2012, 23:46
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#9

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

  Alt 17. Nov 2012, 23:49
Weil du es überlesen hast?
Im Büro hätt ich jetzt gesagt:
Zitat:
Weil ich einfach alt werd!


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

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 18. Nov 2012, 02:17
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.
  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 S_Linie gegen Copy(S_Linie, 1, 3) , bzw. 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.

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 S_Länge nennen.

Und wieso sind Linie und Länge eigentlich keine Integer?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (18. Nov 2012 um 02:33 Uhr)
  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 22:29 Uhr.
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