![]() |
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:
Ich habe es mit Insert probiert, als auch mit Format. Aber bei
Delphi-Quellcode:
wird der Text trotzdem länger (irgendwie auch klar) und bei
Insert
Delphi-Quellcode:
(z. B. mit %.3s als Argument) bekomm ich einen Argumentfehler.
Format
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 |
AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
Gibt es einige Möglichkeiten. Die erste:
Delphi-Quellcode:
Eine andere:
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;
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; |
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; |
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.
|
AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
Zitat:
|
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)]); |
AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
Zitat:
Wieso hab ich das "-Zahl" nicht in der Doku gefunden? :gruebel: |
AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
Weil du es überlesen hast?
Zitat:
![]() |
AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
Zitat:
Zitat:
Und ja - ich gestehe - ich habs echt überlesen! |
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:
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:
gegen
S_Linie
Delphi-Quellcode:
, bzw.
Copy(S_Linie, 1, 3)
Delphi-Quellcode:
austauschen.
LeftStr(S_Linie, 3)
Delphi-Quellcode:
PS: In deinem Post #1 kann ich nicht erkennen, was in Stelle 34 rein soll. :gruebel:
S := S_Linie + StringOfChar(' ', 4 - Length(S_Linie))
+ S_Ziel + StringOfChar(' ', 28{30?} - Length(S_Ziel)) + S_Laenge + StringOfChar(' ', 5 - Length(S_Laenge)); 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:
nennen. :angle:
S_Länge
Und wieso sind Linie und Länge eigentlich keine Integer? :angle2: |
AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
@himitsu 5. bis 33. Stelle sind 29 Zeichen und nicht 28 ;)
36. bis 40. Stelle sind ja auch 5 Zeichen ;) Somit sind es 39 Zeichen die er beschrieben hat, aber er hat sich mit der 34. Stelle vertan und unter den Tisch fallen lassen ;) und dann sind es 40 |
AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
Sag ich ja :mrgreen:
Zitat:
Die 29 hatte ich mir auch ausgerrechnet. Aber dennoch fehlt ein Zeichen (die 34), da er ja 40 Zeichen haben will. 3 + 1 + 29 + 1 + 5 = 39 |
AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
Zitat:
Zitat:
Zitat:
(Ok - da es hier genau 40 sind, hätte man auch 40 reinschreiben können) Zitat:
Habs dann erst bemerkt, als ich den String an ein LCD-Modul gesendet hatte (daher auch die 40 = max. Zeichen pro Zeile) (Man sollte so spät nicht mehr rechnen) Zitat:
Zitat:
Da ich es weiter dann auch als String benötige, wandle ich es nicht unnötigerweise erst in einen Integer. Auserdem ist Linie keine Zahl - sondern eine Linien-Angabe einer U-Bahn :-) |
AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
Passt jetzt zwar nicht zu der Ausgangs Problematik, aber mir sträuben sich gerade alle Nackenhaare bei:
Zitat:
Basierend auf der unit aus ![]()
Delphi-Quellcode:
und diesen Visitor hat man im 0, auch um weitere Klassen erweitert, um auch diese auf dem LCD darstellen zu können.
uses
..., uVisitor; type TSubway = class property Line : string; property Destination : string; end; TSubwayArrival = class property Subway : TSubway; property ArrivalAt : TDateTime; end; // Der Einfachheit halber wird hier nur in eine Variable geschrieben // Es könnte aber auch direkt die Ausgabe an das LCD-Modul erfolgen // Oder an eine Klasse, die das LCD-Modul selber betreut :o) TLCDVisitor = class( TVisitor ) private FLine : string; public property Line : string read FLine; published procedure VisitSubwayArrival( Instance : TSubwayArrival ); end; procedure TLCDVisitor.VisitSubwayArrival( Instance : TSubwayArrival ); begin FLine := { hier jetzt der Code um die Instanz auszugeben } end; Ja und der Aufruf sieht dann immer so aus (egal welche Instanz und welche Klasse auch immer):
Delphi-Quellcode:
MyLCDVisitor.Visit( SomeInstance );
|
AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
Zitat:
Ich lese den Inhalt eine Zelle aus, der als String vorliegt und in eine String-Variable geschrieben wird - was ist daran jetzt auf einmal so verwerflich? Seit wann darf man das nicht mehr? |
AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
Zitat:
|
AW: mehrere Strings in einen String vereinen (mit fixer Länge + festen Positionen)
Zitat:
Stimmt! Damit kann man das auch noch einfacher schreiben und StrUtils weglassen:
Delphi-Quellcode:
result := Format('%-3.3s %-29.29s %-5.5s', [a, b, c]);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 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