![]() |
TEdit über einem Dezimalpunkt zentrieren
Hallo,
wir hatten schon häufiger das Thema wie man bei einem TEdit eine property alignment einführt. Ich würde nun gerne ein aus TEdit abgeleitetes Control für die Darstellung von Zahlen erstellen, bei dem immer der Dezimalpunkt unabhängig von der Zahl und ihrer Formatierung an derselben Stelle gezeichnet wird. Damit ließen sich Zahlen in Edits übereinander übersichtlich darstellen. Wo gibt es sowas (wenn nicht, wie dreht man sich das hin)? Grüße, Messie |
Re: TEdit über einem Dezimalpunkt zentrieren
Du könntest den Textfeldern eine feste Länge zuordnen (z.b. 10). Dann legst du fest an welcher Stelle der Dezimalpunkt sein soll (z.b. 8). jetzt bearbeites du die zahl (z.b. 7.9) beim OnExit. Die Zahl bekommt dann vorn 6 Leerzeichen und hinten eine 0 angefügt.
|
Re: TEdit über einem Dezimalpunkt zentrieren
Das funzt aber nur wenn die Schrift nichtproportional ist. Das kann ich nicht sicherstellen. Ich hatte gehofft, daß man ein canvas.draw oder ähnlich zugänglich machen könnte und daraus eine property für den Dezimalpunkt transparent machen könnte. Ich würde dann versuchen, die Position des Dezimaltrennzeichens herauszufinden und den Text mit dem daraus errechneten Offset zu platzieren.
Grüße, Messie |
Re: TEdit über einem Dezimalpunkt zentrieren
die einfachste möglichkeit ist tatsächlich eine Schriftart wie Courier New zu nehmen...dann kannst du alles über die Position des Kommas im String machen.
Anders geht es zwar, aber das schöne "übereinander stehen" ist dann in jedem Fall futsch. da müsstest du dann die zahl in den vor und nachkommateil zerlegen und am komma ausgerichtet auf's Canvas malen. |
Re: TEdit über einem Dezimalpunkt zentrieren
Zitat:
Ich suche nach dem Ansatz, wie ich einer aus TntEdit abgeleiteten Komponente das als property verpassen kann. Ich bin da für jede Hilfe dankbar, zumal ich das auch auf den Builder umsetzen muß. Grüße, Messie |
Re: TEdit über einem Dezimalpunkt zentrieren
Sollte m.E. auch mit "Arial" gehen - die Ziffern entsprechen jeweils zwei Leerzeichen. Einfacher wäre es aber, die Zahl der Nachkommastellen festzulegen und mit Nullen aufzufüllen. Wenn dann der Text rechtsbündig ausgerichtet wird, stehen die Zahlen schön geordnet untereinander.
Delphi-Quellcode:
Sieht auch schöner aus, als wenn man rechts mit Leerzeichen auffüllt.
2.001,050
100,375 20,300
Delphi-Quellcode:
(Ist natürlich kein Delphi-Code - habe ich nur wegen der Darstellung verwendet)
2.001,05
100,375 20,3 mfg gfjs |
Re: TEdit über einem Dezimalpunkt zentrieren
Liste der Anhänge anzeigen (Anzahl: 1)
Das mit den zwei Leerzeichen klappt solange, bis zwei oder mehr Einsen nebeneinanderstehen. Dann bräuchte man nach jeder Eins etwa ein viertel Leerzeichen... Ich hab' es im Anhang mal gezeigt, jeweils 6 Vor- und vier Nachkommastellen. Deshalb brauche ich wohl noch eine andere Lösung.
Grüße, Messie |
Re: TEdit über einem Dezimalpunkt zentrieren
Hi,
nehmt doch mein calcEdit, da lassen sich die Anzahl der Kommastellen und Darstellung mit Tausenderpunkt einstellen. Mfg BrunoT Meine Calcedit-Kompo : |
Re: TEdit über einem Dezimalpunkt zentrieren
Hi Messie!
Nimm die Breite des textes bis zum Mittelpunkt des Punktes. also (Textbreite bis punkt) + (halbe punktbreite) dann denk dir eine position aus, wo der punkt immer stehen soll, also z.b. an Y=100 ; dieses Y-Textbreite und dann aufs canvas schreiben. hmmm.. war warcheinlich nicht so super beschrieben. Vielleicht hilft der codeschnipsel weiter. hab das ganze an einer Listbox ausprobiert.
Delphi-Quellcode:
vielleicht hilfts
procedure TForm1.LBDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); var iPunktMittel:Integer; iBreiteBisPunktMittel:Integer; iPunktSollPosition:Integer; begin iPunktMittel:=LB.Canvas.TextWidth(copy(lb.Items[index],1,pos('.',lb.Items[index]))) -LB.Canvas.TextWidth(copy(lb.Items[index],1,pos('.',lb.Items[index])-1)); iBreiteBisPunktMittel:=LB.Canvas.TextWidth(copy(lb.Items[index],1,pos('.',lb.Items[index])-1))+trunc(iPunktMittel/2); iPunktSollPosition:=100; LB.Canvas.TextOut(iPunktSollPosition-iBreiteBisPunktMittel,Rect.Top,lb.Items[index]); end; //Edit: formatierung geändert |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:37 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 by Thomas Breitkreuz