Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Text in 5er Buchstabengruppen anordnen (https://www.delphipraxis.net/149757-text-5er-buchstabengruppen-anordnen.html)

eragon123 29. Mär 2010 15:31


Text in 5er Buchstabengruppen anordnen
 
Ich habe als Ausgang String die Buchstaben enthalten z.B: 'ALDGFHSDKHGIHEBIUHSBIH'. Daraus will ich jetzt 5er Gruppen machen. Wie bekomme ich das hin? Z.B. 'AFJGH AJGHI ALSKD'

Mein Ansatz
Delphi-Quellcode:
beschriftung := lblout.Caption;                                // In 5er Gruppen annordnen
  beschriftung2 := lblin.Caption;
  for i := 0 to Length(lblin.Caption) div 5 do
  begin
    Insert(' ',beschriftung,i*5);
    Insert(' ',beschriftung2,i*5);
  end;
  lblout.Caption := beschriftung;
  lblin.Caption := beschriftung2;
Beschriftung 1 und 2 sind strings.

Klaus01 29. Mär 2010 15:35

Re: Text in 5er Buchstabengruppen anordnen
 
Hallo,

schau Dir mal Delphi-Referenz durchsuchensystem.copy und Delphi-Referenz durchsuchensystem.delete an.

Grüße
Klaus

eragon123 29. Mär 2010 15:42

Re: Text in 5er Buchstabengruppen anordnen
 
Ok hab ich ... was soll mir das jetzt sagen? Würdest du die Sachen einzeln Rauskopieren und dann löschen oder wie ist das gemeint?

Klaus01 29. Mär 2010 15:46

Re: Text in 5er Buchstabengruppen anordnen
 
.. ich weiß ja nicht, ob Du den Ausgangsstring noch behalten willst?
Ich würde immer die ersten 5 Zeichen kopieren und diesen dann aus dem Ausgangsstring löschen.

Ohne zu löschen solltest Du die Start- und Endwerte im Copy nach jedem Copy Vorgang anpassen.

Grüße
Klaus

eragon123 29. Mär 2010 15:53

Re: Text in 5er Buchstabengruppen anordnen
 
Mhm ok neuer Versuch:

Delphi-Quellcode:
  beschriftung := '';                                // In 5er Gruppen annordnen
  beschriftung2 := '';
  for i := 0 to Length(lblin.Caption) div 5 do
  begin
    beschriftung := beschriftung + Copy(lblin.Caption,i*5,5) + ' ';
    beschriftung2 := beschriftung2 + Copy(lblout.Caption,i*5,5) + ' ';
  end;
  lblout.Caption := beschriftung;
  lblin.Caption := beschriftung2;
Macht immer noch Quatsch..

Kann es sein das der lenght Teil nicht den richtigen Wert liefert? Ich stehe gerade echt auf der Leitung :wall: .. bitte um Hilfe.

Klaus01 29. Mär 2010 15:59

Re: Text in 5er Buchstabengruppen anordnen
 
.. wie schaut denn der Quatsch aus?

im String[0] steht die Länge des Strings, nützliche Daten sind erst ab String[1]
da.

Grüße
Klaus

himitsu 29. Mär 2010 16:04

Re: Text in 5er Buchstabengruppen anordnen
 
Zitat:

Zitat von eragon123
Mein Ansatz
Delphi-Quellcode:
beschriftung := lblout.Caption;                                // In 5er Gruppen annordnen
beschriftung2 := lblin.Caption;
for i := 0 to Length(lblin.Caption) div 5 do
begin
  Insert(' ',beschriftung,i*5);
  Insert(' ',beschriftung2,i*5);
end;
lblout.Caption := beschriftung;
lblin.Caption := beschriftung2;

Erstens ein String hat einen 1-basierenden Index. :warn:
for i := 0 to und i*5 ergeben aber als ersten Wert eine 0, also müßte überall +1 hinzu.
Außerdem willst du doch nur gruppieren/unterteilen und dann benötigst du keine Leerzeichen an erster Stelle und unter Umständen auch nicht an letzter Stelle.

Wenn du von Vorne bis Hinten durchgehst und enfügst, dann wird der String um die eingefügten Zeichen Länger (also vor den Einfügestellen) und demnach müßte für jede Einfügung 1 ( i*Length(' ') ) hinzugerechnet werden.

Lösung: von hinten beginnen

Delphi-Quellcode:
for i := 1 do (Length(lblin.Caption) - 1) div 5  do
  //Insert(' ', beschriftung, i * (5 + Length(' ')) + 1);
  Insert(' ', beschriftung, i * 6 + 1);
oder
Delphi-Quellcode:
for i := (Length(lblin.Caption) - 1) div 5 downto 1 do
  Insert(' ', beschriftung, i * 5 + 1);

Zitat:

Zitat von eragon123
Beschriftung 1 und 2 sind strings.

Sind diese auch gleich lang?
Wenn nicht, dann benötogst du 2 Schleifen.

eragon123 29. Mär 2010 16:35

Re: Text in 5er Buchstabengruppen anordnen
 
Achso hab ich vergessen zu sagen ... ja die sind gleich lang.

Habs jetzt mal so übernommen
Delphi-Quellcode:
beschriftung := lblin.Caption;                                // In 5er Gruppen annordnen
  for i := (Length(beschriftung) - 1) div 5 downto 1 do
    Insert(' ', beschriftung, i * 5 + 1);

  lblin.Caption := beschriftung;
Funktioniert aber nicht komplett, obwohl ich deinen Ansatz verstehe (hoffe ich zumindestens :-D ). Was bei rauskommt im Label ist folgendes:

AAAAA

A
A A
AA A
AAA

So in dem Muster ca. Es scheint nur in der ersten Zeile zu funktionieren. Ich weiß nicht wo er da die Zeilenumbrüche her hat. Hab wordwrap auf true... kann das damit zusammenhängen?

p80286 29. Mär 2010 17:04

Re: Text in 5er Buchstabengruppen anordnen
 
Zitat:

Zitat von eragon123
So in dem Muster ca. Es scheint nur in der ersten Zeile zu funktionieren. Ich weiß nicht wo er da die Zeilenumbrüche her hat. Hab wordwrap auf true... kann das damit zusammenhängen?

Jo das kann,
Wann immer es geht: keine Daten aus Memo/RichEdit/edit/Label lesen, da für die Anzeige die Daten modifiziert werden.

Gruß
K-H

eragon123 29. Mär 2010 17:13

Re: Text in 5er Buchstabengruppen anordnen
 
Mhm aber wie soll ich dann den Text verändern?

shmia 29. Mär 2010 17:23

Re: Text in 5er Buchstabengruppen anordnen
 
Mal so ganz grundsätzlich:
Man sollte die Aufgabe "Text in 5er Buchstabengruppen anordnen" nicht direkt auf den Labels ausführen sondern eine saubere Funktion schreiben.
Delphi-Quellcode:
function Mach5erGruppen(const text:string):string;
var i:integer;
begin
  Result := text;
  for i := (Length(text) - 1) div 5 downto 1 do
    Insert(' ', result, i * 5 + 1);
end;
Ohne eine eigene Funktion sieht der Sourcecode wie ein Haufen Müll aus; man weiss eine Woche später nicht mehr was da eigentlich gemacht wird.

eragon123 30. Mär 2010 16:00

Re: Text in 5er Buchstabengruppen anordnen
 
Ok war noch ein ganz einfacher Logikfehler drin. Das ganze wird ja mehrmals auf den gleichen String losgelassen. Dabei zählt der dann bereits vorhandene Leerzeichen mit. So hier die funktionierende neue Fassung:
Delphi-Quellcode:
function buchstaben5ergruppen(const text: string): string;
  var i: Integer;
  begin
    Result :='';
    for i := 1 to Length(Text) do
    begin
      if text[i] <> ' ' then
        Result := Result + text[i];
    end;
    for i := (Length(text)-1) div 5 downto 1 do
    begin
      Insert(' ', result, i*5 +1);
      mmotest.Text := mmotest.Text + Result;
    end;
  end;

himitsu 30. Mär 2010 16:22

Re: Text in 5er Buchstabengruppen anordnen
 
Length(text) gibt noch die alte Länge, inkl. der Leerzeichen an, wärend die "neue" Länge nötig wäre.

Delphi-Quellcode:
function buchstaben5ergruppen(const text: string): string;
  var i: Integer;
  begin
    Result := StringReplace(Text, ' ', '', [rfReplaceAll]);
    for i := (Length(Result) - 1) div 5 downto 1 do
      Insert(' ', Result, i * 5 + 1);
  end;

DeddyH 31. Mär 2010 11:28

Re: Text in 5er Buchstabengruppen anordnen
 
Wie wäre es denn so? Ich hab allerdings nicht sonderlich getestet, es kann also noch Fehler enthalten:
Delphi-Quellcode:
function GroupString(const text: string; CountPerGroup: integer;
                     EliminateSpaces: Boolean = true): string;
var i, j: integer;
begin
  SetLength(Result, Length(text) + Length(text) div CountPerGroup);
  j := 0;
  for i := 1 to Length(text) do
    if not EliminateSpaces or (text[i] <> ' ') then
      begin
        inc(j);
        Result[j] := text[i];
        if Succ(j) mod Succ(CountPerGroup) = 0 then
          begin
            inc(j);
            Result[j] := ' ';
          end;
      end;
  SetLength(Result,j);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 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