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 TEdit über einem Dezimalpunkt zentrieren (https://www.delphipraxis.net/64051-tedit-ueber-einem-dezimalpunkt-zentrieren.html)

messie 26. Feb 2006 18:46


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

tripleeye 27. Feb 2006 14:59

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.

messie 27. Feb 2006 17:58

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

glkgereon 27. Feb 2006 18:09

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.

messie 27. Feb 2006 19:43

Re: TEdit über einem Dezimalpunkt zentrieren
 
Zitat:

Zitat von glkgereon
da müsstest du dann die zahl in den vor und nachkommateil zerlegen und am komma ausgerichtet auf's Canvas malen.

ja, genau!
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

gfjs 28. Feb 2006 03:13

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:
2.001,050
  100,375
   20,300
Sieht auch schöner aus, als wenn man rechts mit Leerzeichen auffüllt.

Delphi-Quellcode:
2.001,05
  100,375
   20,3
(Ist natürlich kein Delphi-Code - habe ich nur wegen der Darstellung verwendet)

mfg gfjs

messie 28. Feb 2006 06:17

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

BrunoT 28. Feb 2006 06:25

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 :

Zottel 28. Feb 2006 09:06

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:
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;
vielleicht hilfts

//Edit: formatierung geändert


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