Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Labels vertikal dynamisch einordnen? (https://www.delphipraxis.net/178809-labels-vertikal-dynamisch-einordnen.html)

AlexII 28. Jan 2014 20:17

Labels vertikal dynamisch einordnen?
 
Hallo,

ich habe folgendes Problem. Ich möchte 14 Labels vertikal, links am Rand nacheinander einordnen, hier ein Beispiel:

Zitat:

Titel: Mark Mascher

Text: Hier kommt ein langer,
langer Text... usw.

Preis: 14,00€

Nun habe ich mit Label.Top-Werter gerechnet, aber sobalt sich was in meinem Vorhaben ändert, z.B. kommt noch ein Label irgendwo dazwischen hinzu, dann muss ich Stundenlang meine Label.Top-Werte manuell neu berechnen.

Kann man irgendwie die Labels dynamisch bzw. automatisch nacheinander einordnen. Dabei ist es mir sehr wichtig, dass die Labels nicht in EIN String gepackt werden, den ich möchte mit den Label getrennt bestimmte Ereignisse erledigen.

Danke!

stahli 28. Jan 2014 23:08

AW: Labels vertikal dynamisch einordnen?
 
Du könntest eine Funktion nutzen, der Du die Label übergibst und die Y automatisch incrementiert.
Etwa so:
Delphi-Quellcode:
function ShowLabel(aLabel: TLabel; var Y: Integer);
begin
  aLabel.Top := Y;
  ...
  Inc(Y, 16);
end;


...
  Y := 0;
  ShowLabel(LabelA, Y);
  ShowLabel(LabelB, Y);
...
Dann lassen sich leicht Anweisungen dazwischen fügen.

himitsu 28. Jan 2014 23:19

AW: Labels vertikal dynamisch einordnen?
 
Align (alTop) kennst du schon?

Ansonsten gäbe es in neueren Delphis, oder als Fremdkomponente, auch Komponenten/Container, welche sowas machen.
> Delphi-Referenz durchsuchenTGridPanel, Delphi-Referenz durchsuchenTFlowPanel usw.

Oder du mußt einfach bei allen Kompoenten das OnResize abfangen und die Positionen neu berechnen. (machen die Container auch nicht anders)

Oder man trennt die GUI von der Logik.
> Da kann man im Hintergrund die Strings gern einzeln verwalten, aber in der Darstellung ist alles eine große Komponente (Edit, RichEdit, WebBrowser, ....).

Popov 28. Jan 2014 23:24

AW: Labels vertikal dynamisch einordnen?
 
Eventuell das hier. Ist alles mit einem Label lösbar:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  s1, s2, s3, s4, s5, s6: String; //usw. bis s14
  i: Integer;
  FormStr: String;
begin
  Label1.WordWrap := True;
  Label1.Width := 500;

  s1 := 'Titel: Mark Mascher';
  s2 := '';
  s3 := 'Text: Hier kommt ein langer,';
  s4 := 'langer Text... usw.';
  s5 := '';
  s6 := 'Preis: 14,00€';

  FormStr := '';
  for i := 1 to 6 do FormStr := FormStr + '%s ' + ^j; //To-Wert anpassen an Anzahl Strings

  Label1.Caption := Format(FormStr, [s1, s2, s3, s4, s5, s6]);
end;

himitsu 28. Jan 2014 23:29

AW: Labels vertikal dynamisch einordnen?
 
Delphi-Quellcode:
'%s ' + ^j


Und das soll jemand verstehen?
J = 10. Buchstabe = #10, also
Delphi-Quellcode:
'%s' + #10
oder
Delphi-Quellcode:
'%s'#10
(+ ist hier nicht nöig)

Wobei es im Windows ja eigentlich #13#10 heißt :zwinker:, oder einfach Delphi-Referenz durchsuchensLineBreak. :angle2:

PS: Delphi-Referenz durchsuchenDupeString (Delphi-Referenz durchsuchenStringOfChar)
Delphi-Quellcode:
Label1.Caption := Format(DupeString('%s' + sLineBreak, 6), [s1, s2, s3, s4, s5, s6]);

// oder halt

Label1.Caption := s1 + sLineBreak + s2 + sLineBreak + s3 + sLineBreak + s4 + sLineBreak + s5 + sLineBreak + s6;

Popov 28. Jan 2014 23:42

AW: Labels vertikal dynamisch einordnen?
 
^j ist alter Ascii-Code Steuercode LF (Line Feed / Zeilenvorschub). Es ist nicht nur einfach #10. Wikipedia schreibt dazu (bitte beachten was es unter Windows bedeutet):

Zitat:

Bewegt den Druckkopf/Cursor in die nächste Zeile. Wenn zwischen Sender und Empfänger abgesprochen, bedeutet es „New Line“, wobei die erste Druckposition der nächsten Zeile angefahren wird. Wird unter Unix und Mac OS X als „Zeilenendezeichen“ benutzt. Unter MS-DOS oder Microsoft Windows wird mit der Kombination „Carriage Return“ + „Line Feed“ eine Zeile beendet.
Ich nutze ^j seit dem ich denken kann, sehe aber ein, dass ich wohl einer der wenigen bin. Auch denke ich, dass das unter Windows seine Bedeutung behalten wird. Trotzdem ist unter Delphi #13#10 üblicher.

himitsu 28. Jan 2014 23:56

AW: Labels vertikal dynamisch einordnen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nicht nur unter Delphi.

Windows und Delphi (TStringList, ReadLn usw.) verstehen zwar fast immer alle möglichen Kombinationen (Windwos #13#10, Unix #10 und Mac #13),
aber eigentlich ist im Windows weitgehenst CRLF üblich.

Die MEMO's normalisieren das auch auf #13#10.
(Nur die aktuelle RichEdit-Version nutzt komischer Weise die #13, welches im Delphi aber teilweise versucht wurde abzufangen, was allerdings nicht gut und vorallem durchgängig gelingt).


OK, es wäre schön, wenn es soein Kürzel gäbe, was aber eine "passende" Zeichenfolge liefert, so wie das sLineBreak, was im Code manchmal echt umständlich/häßlich ist.


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