AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

strings und zeilenumbruch

Ein Thema von venice2 · begonnen am 21. Feb 2021 · letzter Beitrag vom 22. Feb 2021
Antwort Antwort
Seite 1 von 2  1 2      
venice2
(Gast)

n/a Beiträge
 
#1

strings und zeilenumbruch

  Alt 21. Feb 2021, 23:20
Mein String.

Delphi-Quellcode:
          DialogStr := gM.Title +
          { ' ' + Duration + } #13#10 + gM.release_date + #13#10 +
            gM.genre_ids + #13#10#13#10#13#10#13#10#13#10#13#10 + gM.overview;
Gibt es eine andere Möglichkeit für die Umbrüche?

#13#10#13#10#13#10#13#10#13#10#13#10
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: strings und zeilenumbruch

  Alt 21. Feb 2021, 23:29
Es kommt drauf an.

#10
#13#10
#13 (macht z.B. intern das RichEdit, wobei TRichEdit "teilweise" es zu sLineBreak ändert/stringreplaced ... und sogar MacOS inzwischen standardmäßig von #13 zu #10 gewechselt ist)
sLineBreak

An ein TMemo oder eine TStringList kann man auch nur #10 übergeben, da es bei Übergabe automatisch zu #13#10 wird. (TStringList erlaubt alles im Eingang)
Auch MessageBox und Co. erlauben sowohl #10 als auch #13#10.

Man kann auch StringReplace von irgendeinem Zeichen nach #10/#13#10/sLineBreak machen, wenn man den String nicht "unterbrechen" will.

Aber manche APIs/Funktionen wollen ausschließlich #13#10 und behandeln #10 wie ein Zeichen, also nicht als Zeilenumbruch. (z.B. bekannt vom alten Windows-Notepad oder einigen Canvas-DrawText-Funktionen)

.............



Und wie wäre es mit Delphi-Referenz durchsuchenFormat?
$2B or not $2B

Geändert von himitsu (21. Feb 2021 um 23:48 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#3

AW: strings und zeilenumbruch

  Alt 21. Feb 2021, 23:40
Wenn ich jetzt 12 Zeilenumbrüche erstellen will um zwischen einen String platz zu schaffen bin ich gezwungen die komplette Zeile zu übergeben.
Ist das so?

#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10 Wenn ja.. Schade das man das nicht kürzen kann.

bsp. LineBreak(12)
  Mit Zitat antworten Zitat
TKanne

Registriert seit: 6. Aug 2007
Ort: Berlin
24 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: strings und zeilenumbruch

  Alt 21. Feb 2021, 23:40
Moin,

mich nervt auch immer das #13#10 getippe, habe mir delhalb in meine Unit mit diversen Stringroutinen eine kleine Funktion geschrieben:

Delphi-Quellcode:
function NewLine(Anzahl: Integer): string;
begin
  Result := '';
  if Anzahl > 0 then
    Result := DupeString(#13#10, Anzahl);
end;
Aufruf dann z.B.:
ShowMessage('a' + NewLine(2) + 'b');
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#5

AW: strings und zeilenumbruch

  Alt 21. Feb 2021, 23:43
Moin,

mich nervt auch immer das #13#10 getippe, habe mir delhalb in meine Unit mit diversen Stringroutinen eine kleine Funktion geschrieben:

Delphi-Quellcode:
function NewLine(Anzahl: Integer): string;
begin
  Result := '';
  if Anzahl > 0 then
    Result := DupeString(#13#10, Anzahl);
end;
Aufruf dann z.B.:
ShowMessage('a' + NewLine(2) + 'b');
Ahh
Selbst ist der Mann. Vielen Danke!

Genau das meinte ich.
  Mit Zitat antworten Zitat
TKanne

Registriert seit: 6. Aug 2007
Ort: Berlin
24 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: strings und zeilenumbruch

  Alt 21. Feb 2021, 23:44
Oder man schreibt gleich
S := 'a' + DupeString(#13#10, 2) + 'b';
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#7

AW: strings und zeilenumbruch

  Alt 21. Feb 2021, 23:55
Zitat:
Oder man schreibt gleich
Ja wenn man es einmalig braucht.

Habe die umbenannt funktioniert gut. Danke nochmals.
Delphi-Quellcode:
function LineBreak(Count: Integer): string;
begin
  Result := '';
  if Count > 0 then
    Result := DupeString(#13#10, Count);
end;
Delphi-Quellcode:
          
DialogStr := gM.Title + LineBreak(1) + gM.release_date + LineBreak(1) +
  gM.genre_ids + LineBreak(8) + gM.overview;
Vorher hätte das so ausgesehen.
Delphi-Quellcode:
          
DialogStr := gM.Title + #13#10 + gM.release_date + #13#10 +
  gM.genre_ids + #13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10 + gM.overview;
Genug platz ohne diese #13#10 Umbruchstrings.
Kann jetzt adverage und vote dazwischen packen.

Geändert von venice2 (24. Feb 2021 um 03:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: strings und zeilenumbruch

  Alt 22. Feb 2021, 00:07
Delphi-Quellcode:
function LineBreak(Count: Integer=1): string; // oder gleich LB
begin
  Result := '';
  if Count > 0 then
    Result := DupeString(sLineBreak, Count);
end;
?
Delphi-Quellcode:
DialogStr := gM.Title + LineBreak + gM.release_date + LineBreak +
  gM.genre_ids + LineBreak(8) + gM.overview;
Noch kürzer und keine MagicNumbers im Code.



Aber warum dort überhaupt ein Freiraum von unhandlicher Größe?
Zwei Texte ... der Eine von unten und der Andere von oben.
$2B or not $2B

Geändert von himitsu (22. Feb 2021 um 00:13 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#9

AW: strings und zeilenumbruch

  Alt 22. Feb 2021, 01:10
Zitat:
Aber warum dort überhaupt ein Freiraum von unhandlicher Größe?
Zwei Texte ... der Eine von unten und der Andere von oben.
Warum sollte ich zwei Texte verwenden wenn es genau so gut mit einem geht.
Es spricht nichts dagegen.

Damit ich den Text nicht immer bei jeder Aktualisierung des Fensters neu zeichnen muß erstelle ich ein Bitmap auf dem der Text gerendert wird.
Und auf diesen Bitmap überlagere ich dann die Bilder für Ratings, Average und Vote.
Deshalb verwende ich einen Text!
Dieses Bitmap ist als Sprite ausgelegt wird in meiner DLL(SpriteContainer) Klasse verwaltet und kann diverse zusätzlich Funktionen erhalten. Zoomen, Drehen, Transparenz,
zur Laufzeit auf dem Fenster verschieben usw..

Beispiel:
Delphi-Quellcode:
  SpriteArray[0].FontText := 'Use Symmetrical';
  SpriteArray[1].FontText := 'Use Transparent';
  SpriteArray[2].FontText := 'Use Smoothing';

  for K := 0 to 2 do
  begin
    SpriteArray[K].FontUseSize := 20;
    SpriteArray[K].FontName := 'TAHOMA';
    SpriteArray[K].FontUseARGB := gSprSettings.GD_ARGB(255, 255, 255, 255);
    SpriteArray[K].FontUse3D := 1;
    SpriteArray[K].hBmp := gSprSettings.GD_CreateBitmapFromText
        (PWideChar(SpriteArray[K].FontText), nil, PWideChar(SpriteArray[K].FontName),
        SpriteArray[K].FontUseSize, SpriteArray[K].FontUseARGB, SpriteArray[K].FontUse3D);
    gSprSettings.GD_SetObjectAnchorMode(ID + K, ANCHOR_NONE);
    gSprSettings.GI_GetBitmapSize(SpriteArray[K].hBmp, IbmW, IbmH);
    SpriteArray[K].ID := ID + K;

    if (K = 2) then
    begin
        SpriteArray[K].xPos := x + 1;
        SpriteArray[K].yPos := y;
    end
    else
    begin
        SpriteArray[K].xPos := x;
        SpriteArray[K].yPos := y;
    end;

    y := y + 34;
    gSprSettings.GD_DrawTextBitmapToCtrl(hSprSettings, SpriteArray[K].xPos, SpriteArray[K].yPos,
      SpriteArray[K].hBmp, $FFFFFFFF, SpriteArray[K].ID, GS_VISIBLE);
    gSprSettings.GD_SetObjectLocked(SpriteArray[K].ID, true);

    SpriteArray[K].scale := SCALE_DEFAULT;
    gSprSettings.GD_SetObjectScale(SpriteArray[K].ID, SpriteArray[K].scale);
    gSprSettings.GD_SetObjectImageLabel(K, SpriteArray[K].FontText);
  end;
Zoom Beispiel:
Delphi-Quellcode:
  if bAnimate then
  begin
    for K := (Length(SpriteArray) - 1) downto 0 do
    begin
      if InflateID = SpriteArray[K].ID then
      begin
        if SpriteArray[K].scale < 0.85 then
          SpriteArray[K].scale := SpriteArray[K].scale + SCALE_STEP;
      end
      else
      begin
        if SpriteArray[K].scale > SCALE_DEFAULT then
          SpriteArray[K].scale := SpriteArray[K].scale - SCALE_STEP;
      end;

      gSprSettings.GD_SetObjectScale(SpriteArray[K].ID, SpriteArray[K].scale);
      Angle := gSprSettings.GD_GetObjectAngle(SpriteArray[K].ID);
      if Angle > 0 then
      begin
        Angle := Angle - 8;
        gSprSettings.GD_SetObjectAngle(SpriteArray[K].ID, Angle);
      end;
    end;

    gSprSettings.GI_UpdateWindow(WinHandle, false);
  end;
Aber das kannst du natürlich nicht alles wissen.
Email denkt das geht schon so.
...
Wenn du schon "Count: Integer=1" definierst dann benötigt man auch Result = '' und die abfrage if Count > 0 then nicht mehr.
Count kann ja dann nicht mehr 0 sein.
Delphi-Quellcode:
function LineBreak(Count: Integer = 1): string; // oder gleich LB
begin

    Result := DupeString(sLineBreak, Count);
end;
Aber danke für den Tip "sLineBreak" und mit dem Optionalen Parameter hätte ich auch drauf kommen müssen

Geändert von venice2 (22. Feb 2021 um 04:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: strings und zeilenumbruch

  Alt 22. Feb 2021, 03:19
Büdde.

Zitat:
Count kann ja dann nicht mehr 0 sein.
Doch, wenn du 0 reingibst.
Die 1 ist nur, wenn man "garnichts" reingibt
und 0 ist ja etwas.

Aber OK, SetLength und somit auch DupeString kommen mit kleiner-0 zurecht und bei 0 macht DupeString nichts, also ja, kann man das auch noch weglassen, da es intern abgefangen ist.
War dann sowas Doppeltgemoppeltes, wie ein if Assigned(x) then x.Free; .
Hatte nicht nachgesehn/ausprobiert, was bei negativen Zahlen passiert, drum ließ ich es noch drin. Bin etwas durch Funktion gebrandmarkt, wo Cardinal (unsigned int) als Längenparameter rein gehen und dann -1 plötzlich ganz groß wird ($FFFFFFFF).
  • Default-Parameter ersparen teilweise eine explizite Angabe
  • und sLineBreak statt #13#10 ist "lesbarer" Code und gleichzeitig in sich dokumentiert/kommentiert
    Zusätzlich sogar zukunftsicher, falls es sich mal ändern sollte, bzw. auch für andere Platformen.

    Ausnahmen sind Dinge, wo es ein fester "definierter" Wert sein muß, z.B. in Dateiformaten oder Datenübertragungsprotokollen.
Das sind oft die einfachsten Optimierungen am Quellcode, wo man sich schnell und ohne Funktionsänderung das Leben leichter machen kann.
$2B or not $2B

Geändert von himitsu (22. Feb 2021 um 03:32 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 08:39 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