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 TLabel + taRightJustify = katastrophe? (https://www.delphipraxis.net/102157-tlabel-tarightjustify-%3D-katastrophe.html)

xZise 24. Okt 2007 11:18


TLabel + taRightJustify = katastrophe?
 
Hi DP,
Ich habe folgenden simplen Code:
Delphi-Quellcode:
lCaptionDesc := TLabel.Create(self);
with lCaptionDesc do
begin
  Left := 300;
  Top := 3;
  Alignment := taRightJustify;
  Parent := tsFilter;
  Caption := 'Ein bischen Text... Bla bla blub';
end;
Soweit, würdet ihr sagen, dass macht Probleme? Nein, keine Fehler/Warunungen, aber die Anzeige spielt verrückt. Und zwar ist er nicht beim 300. Pixel zu ende, sondern irgendwo bei 350 - 360.
Und egal welchen Text, Left + Width ergibt immer das gleiche.
Erst, wenn Alignment normal ist, funktioniert Left wieder.
Warum das denn bitte schön :)

MfG
xZise

[edit]Bevor jemand meint, dass Left nach dem eingeben des Textes dann auf Left = 300 steht: Nein, dem ist nicht so![/edit]

mkinzler 24. Okt 2007 11:21

Re: TLabel + taRightJustify = katastrophe?
 
Auf was steht .AutoSize?

Luckie 24. Okt 2007 11:23

Re: TLabel + taRightJustify = katastrophe?
 
Warum sollte es bei 300 Pixeln zu ende sein? Da fängt es doch an.

DeddyH 24. Okt 2007 11:24

Re: TLabel + taRightJustify = katastrophe?
 
Delphi-Quellcode:
with lCaptionDesc do
begin
  Left := 0;
  AutoSize := false;
  Width := 300;
  Top := 3;
  Alignment := taRightJustify;
  Parent := tsFilter;
  Caption := 'Ein bischen Text... Bla bla blub';
end;
[edit] :? [/edit]

xZise 24. Okt 2007 11:26

Re: TLabel + taRightJustify = katastrophe?
 
Zitat:

Zitat von Luckie
Warum sollte es bei 300 Pixeln zu ende sein? Da fängt es doch an.

Warum? Weil .Alignment auf taRightJustify steht. Und d.h. Rechtsbündig ;)

Zitat:

Zitat von mkinzler
Auf was steht .AutoSize?

True (Weil das wird automatisch vergrößert :) Ohne .Width Angabe)

Und .Left wird nirgends geändert :)

MfG
xZise

PS: Ich habe das mal isoliert mit ein paar Sachen, gleiches Problem ^^

[edit]WO BLEIBT MEINE REDBOX ^^
Zitat:

Zitat von DeddyH
Delphi-Quellcode:
with lCaptionDesc do
begin
  Left := 0;
  AutoSize := false;
  Width := 300;
  Top := 3;
  Alignment := taRightJustify;
  Parent := tsFilter;
  Caption := 'Ein bischen Text... Bla bla blub';
end;
[edit] :? [/edit]

o.O
Aber warum so umständlich?
[/edit]

DeddyH 24. Okt 2007 11:26

Re: TLabel + taRightJustify = katastrophe?
 
Setz mal Color auf z.B. clRed, dann wirst Du es sehen ;)

xZise 24. Okt 2007 11:29

Re: TLabel + taRightJustify = katastrophe?
 
Hmm, richtiges Ergebnis, aber unlogisches Ergebnis.
Weil, wenn man das von oben im Komponentendesginer macht, funktioniert alles wunderbar ?!

DeddyH 24. Okt 2007 11:33

Re: TLabel + taRightJustify = katastrophe?
 
Ich finde das Ergebnis nicht unlogisch. Durch die Property AutoSize wird die Größe (und damit auch die Breite) an den Text angepasst. Und wenn Du Left auf 300 stellst, ist die linke Begrenzung eben 300. D.h. ergo, dass es nichts bringt, Alignment einzustellen, wenn AutoSize auf true steht.

Luckie 24. Okt 2007 11:34

Re: TLabel + taRightJustify = katastrophe?
 
Zitat:

Zitat von xZise
Zitat:

Zitat von Luckie
Warum sollte es bei 300 Pixeln zu ende sein? Da fängt es doch an.

Warum? Weil .Alignment auf taRightJustify steht. Und d.h. Rechtsbündig ;)

Das spielt doch keine Rolle. Du sagst mit der Angabe left := 300;, dass es bei Pixel 300 vom linken Rand anfangen soll. Das hat doch mit der Ausrichtung des Textes innerhalb des Labels nichts zu tun.

xZise 24. Okt 2007 11:50

Re: TLabel + taRightJustify = katastrophe?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Luckie
Zitat:

Zitat von xZise
Zitat:

Zitat von Luckie
Warum sollte es bei 300 Pixeln zu ende sein? Da fängt es doch an.

Warum? Weil .Alignment auf taRightJustify steht. Und d.h. Rechtsbündig ;)

Das spielt doch keine Rolle. Du sagst mit der Angabe left := 300;, dass es bei Pixel 300 vom linken Rand anfangen soll. Das hat doch mit der Ausrichtung des Textes innerhalb des Labels nichts zu tun.

Zitat:

Zitat von DeddyH
Ich finde das Ergebnis nicht unlogisch. Durch die Property AutoSize wird die Größe (und damit auch die Breite) an den Text angepasst. Und wenn Du Left auf 300 stellst, ist die linke Begrenzung eben 300. D.h. ergo, dass es nichts bringt, Alignment einzustellen, wenn AutoSize auf true steht.

Okay :) Dann öffnet bei eure Delphi IDE und setzt ein Label auf die Form, mit Alignment taRightJustify.
Und dann tippt Text ein, und oh wunder. Left hat sich verändert (je nachdem, ob er Text hinzugefügt oder entfernt habt).
:mrgreen:

Und ich finde es unlogisch, dass er sich nach rechts schiebt, wenn er eigentlich nach links größer wird.

MfG
xZise

PS: Testet es einfach mal selber aus, bevor ihr wieder meint es sei unlogisch :zwinker:

[edit]Ich habe sogar noch etwas entdeckt.
Wenn ihr den obigen Code nehmt (von mir), und während der Laufzeit, z.B. durch Buttonklick, Text hinzufügt, dann bewegt er sich auch nach links, und nicht nach rechts.
Abgesehen davon, dass das LINKE Ende nicht 300 beträgt, sondern, je nach länge mehr/weniger sein kann.

Ach ihr müsst noch nicht mal selber coden ^^ ich hänge mal die Exe an.
Das Panel ist Links auf 300. Pixel ;) Der Text müsste als dort enden.
Mit dem Button fügt ihr ein Zeichen hinzu.
Das Label unten ist während der Desgintime erstellt worden ;)[/edit]

[edit] Mist Anhang ^^[/edit]

DeddyH 24. Okt 2007 11:52

Re: TLabel + taRightJustify = katastrophe?
 
Das ist ein intelligentes Feature der IDE und kann zur Laufzeit ja nicht verfügbar sein.

xZise 24. Okt 2007 11:56

Re: TLabel + taRightJustify = katastrophe?
 
Zitat:

Zitat von DeddyH
Das ist ein intelligentes Feature der IDE und kann zur Laufzeit ja nicht verfügbar sein.

Nein ;) Gucks dir an ^^

[edit]Hier mein ganzer Code (bis auf die Deklaration von l und den Standardkram von Delphi):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  l.Caption := l.Caption + 'A';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  l := tLabel.Create(self);
  l.Left := 300;
//  l.Width := 300;
//  l.AutoSize := false;
  l.Alignment := taRightJustify;
  l.Parent := Self;
  l.Top := 3;
  l.Caption := 'Hallo Welt';

  Showmessage(IntToStr(l.Left));
end;

mkinzler 24. Okt 2007 12:03

Re: TLabel + taRightJustify = katastrophe?
 
Bei Ausrichtung rechts wird bei AutoSize auf der linken vergrößert/verkleinert

DeddyH 24. Okt 2007 12:05

Re: TLabel + taRightJustify = katastrophe?
 
Irgendwas passt da aber nicht. Zumindest bei mir steht das Label zu weit rechts. Kontrolle mit einer Line bei 300.
Delphi-Quellcode:
var l: TLabel;

procedure TForm1.Button1Click(Sender: TObject);
begin
  l.Caption := l.Caption + 'A';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  l := tLabel.Create(self);
  l.Alignment := taRightJustify;
  l.Left := 300;
  l.Parent := Self;
  l.Top := 3;
  l.Caption := 'Hallo Welt';
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Pen.Color := clRed;
  Canvas.MoveTo(300,0);
  Canvas.LineTo(300,Height);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  l.Free;
end;

xZise 24. Okt 2007 12:05

Re: TLabel + taRightJustify = katastrophe?
 
Zitat:

Zitat von mkinzler
Bei Ausrichtung rechts wird bei AutoSize auf der linken vergrößert/verkleinert

BINGO ^^
So will ichs ja: Problem ist nur, dass er es im Create nicht so richtig will xD

[edit]
WANTED
------
REDBOX
------

^^

Also DeddyH:
Gucks dir beim Panel an. Panel1.Left ist 300.
Und l.Left ist 317 (so im Dreh), also höher, weil l.Left + l.Width viel zu hoch ist, und eigentlich 300 ergeben sollte.[/edit]

mkinzler 24. Okt 2007 12:07

Re: TLabel + taRightJustify = katastrophe?
 
Dann mach es besser in .Loaded()

xZise 24. Okt 2007 12:13

Re: TLabel + taRightJustify = katastrophe?
 
Zitat:

Zitat von mkinzler
Dann mach es besser in .Loaded()

Was meinst du damit?

mkinzler 24. Okt 2007 12:23

Re: TLabel + taRightJustify = katastrophe?
 
Weil man im onCreate keine Eigenschaften von Objekten setzen sollte, welche auch in der Dfm stehen, da diese dann mit denen überschrieben werden. Diese setzt man in der .Loaded-Methode, welche nach dem Laden der persistenten Eigenschaften aufgerufen wird.

Hawkeye219 24. Okt 2007 12:34

Re: TLabel + taRightJustify = katastrophe?
 
Hallo Markus,

erinnerst du dich an diesen Thread?

Gruß Hawkeye

mkinzler 24. Okt 2007 12:36

Re: TLabel + taRightJustify = katastrophe?
 
manches setzt sich halt irgendwie im Gedächnis fest. :oops:

jottkaerr 24. Okt 2007 12:38

Re: TLabel + taRightJustify = katastrophe?
 
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  l := tLabel.Create(self);
  l.Left := 300;
  l.Alignment := taRightJustify;
  l.Parent := Self;
  l.Top := 3;

  Showmessage('Left: ' + IntToStr(l.Left) + ' Width: ' + IntToStr(l.Width));
  l.Caption := 'Hallo Welt';
  Showmessage('Left: ' + IntToStr(l.Left) + ' Width: ' + IntToStr(l.Width));
end;
die erste Ausgabe ergibt "Left: 300 Width: 65". "65" ist also die Default-Breite eines (leeren) Labels. Wenn Du jetzt l.Caption den neuen Text zuweist, erhältst Du "Left: 316 Width: 49". Der Text ist als kürzer als die bisherige Breite, und daher wird (bei rechtsbündiger Ausrichtung) der Anfang des Labels nach rechts verschoben.

jkr

xZise 24. Okt 2007 12:42

Re: TLabel + taRightJustify = katastrophe?
 
Zitat:

Zitat von mkinzler
Weil man im onCreate keine Eigenschaften von Objekten setzen sollte, welche auch in der Dfm stehen, da diese dann mit denen überschrieben werden.

Naja ;) Aber der unterschied zwischen der DFM und dynamischen ist, dass niemals beides gleichzeitig ist :)

Zitat:

Zitat von jottkaerr
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  l := tLabel.Create(self);
  l.Left := 300;
  l.Alignment := taRightJustify;
  l.Parent := Self;
  l.Top := 3;

  Showmessage('Left: ' + IntToStr(l.Left) + ' Width: ' + IntToStr(l.Width));
  l.Caption := 'Hallo Welt';
  Showmessage('Left: ' + IntToStr(l.Left) + ' Width: ' + IntToStr(l.Width));
end;
die erste Ausgabe ergibt "Left: 300 Width: 65". "65" ist also die Default-Breite eines (leeren) Labels. Wenn Du jetzt l.Caption den neuen Text zuweist, erhältst Du "Left: 316 Width: 49". Der Text ist als kürzer als die bisherige Breite, und daher wird (bei rechtsbündiger Ausrichtung) der Anfang des Labels nach rechts verschoben.

jkr

Hmmm :pale:
Ich hatte es schon mal mit .Width := 0 versucht, aber da hatte es auch nicht hingehauen, aber jetzt funzts :) Danke!

MfG
xZise


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