Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   strings und zeilenumbruch (https://www.delphipraxis.net/207064-strings-und-zeilenumbruch.html)

venice2 21. Feb 2021 22:20

strings und zeilenumbruch
 
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?

Delphi-Quellcode:
#13#10#13#10#13#10#13#10#13#10#13#10

himitsu 21. Feb 2021 22:29

AW: strings und zeilenumbruch
 
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?

venice2 21. Feb 2021 22:40

AW: strings und zeilenumbruch
 
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?

Delphi-Quellcode:
#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)

TKanne 21. Feb 2021 22:40

AW: strings und zeilenumbruch
 
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.:
Delphi-Quellcode:
ShowMessage('a' + NewLine(2) + 'b');

venice2 21. Feb 2021 22:43

AW: strings und zeilenumbruch
 
Zitat:

Zitat von TKanne (Beitrag 1483466)
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.:
Delphi-Quellcode:
ShowMessage('a' + NewLine(2) + 'b');

Ahh ;)
Selbst ist der Mann. Vielen Danke!

Genau das meinte ich.

TKanne 21. Feb 2021 22:44

AW: strings und zeilenumbruch
 
Oder man schreibt gleich
Delphi-Quellcode:
S := 'a' + DupeString(#13#10, 2) + 'b';
8-)

venice2 21. Feb 2021 22:55

AW: strings und zeilenumbruch
 
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.

himitsu 21. Feb 2021 23:07

AW: strings und zeilenumbruch
 
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. :stupid:

venice2 22. Feb 2021 00:10

AW: strings und zeilenumbruch
 
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 :lol: 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 :)

himitsu 22. Feb 2021 02:19

AW: strings und zeilenumbruch
 
Büdde. :)

Zitat:

Count kann ja dann nicht mehr 0 sein.
Doch, wenn du 0 reingibst. :angle2:
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
Delphi-Quellcode:
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.


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