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 StringGrid Zellen wie Excel Kommastellen unterdrücken (https://www.delphipraxis.net/114039-stringgrid-zellen-wie-excel-kommastellen-unterdruecken.html)

Stecky2000 18. Mai 2008 22:03


StringGrid Zellen wie Excel Kommastellen unterdrücken
 
Hallo allerseits,


habe wieder mal ein Problem, finde aber keine Lösung, ggf. gibt es keine?

Ich habe ein StringGrid in das ich berechnete werte schreibe. Es handelt sich dabei um Arbeitszeiten, dezimal. Ein beispiel:

ich berechne die Differenz von 04:30 zu 13:20 und bekomme dezimal 8.33333333 Stunden raus.
In Excel auch. Nun schreibe ich das in ein StringGrid, damit ich aber im StringGrid nur 8.33 angezeigt bekommen, also nur 2 Nachkommastellen schreibe ich es mit folgendem Code rein:

Delphi-Quellcode:
StringGrid2.Cells[7, i] := format('%2.2f',[xsum]);
Das Problem ist nun, wenn ich nachfolgend Berechnungen mit den StringGrideinträgen durchführe, bekomme ich falsche Ergebnisse:

Beispiel: 8.33 + 8.33 + 8.33 + 8.83 etc.
ergibt ein kleineres Ergebnis als
8.3333333 + 8.3333333 + 8.3333333 + 8.8333333 etc.

So, in Excel wird in der zelle 8,33 angezeigt, wenn ich die Anzeige ändere sehe ich jedoch das tatsächlich 8,33333333 drin steht.

Im StringGrid scheint tatsächlich nur 8.33 drin zu stehen und die restlichen Nachkommastellen werden nicht nur nicht angezeigt, sie sind tatsächlich nicht da.

Gibt es da eine Lösung?

Chemiker 18. Mai 2008 22:24

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
Hallo Stecky2000,

zum Unterschied zu Excel formatiertst Du im StringGrid nicht die Werte auf 2 Stellen sondern schreibst tatsächlich nur 2 Nachkomastellen rein. Das gleiche Ergebnis bekommt man in Excel auch wenn man 8.33 reinschreibt. Entweder schreibt man die original Werte ins StringGrid und formatiert die Werte jeder Zelle auf 2 Nachkommastellen, oder man führt die Berechnungen direkt mit den Zahlenwerte durch und zeigt sie im StringGrid nur an.

Bis bald Chemiker

mkinzler 18. Mai 2008 22:25

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
Um das Verhalten von Excel nachzubilden, musst du die eigentlichen Werte getrennt speichern.

Stecky2000 18. Mai 2008 22:31

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
Ich hoffe ich verstehe Dich richtig.

1. Ich kann die Berechnungen nicht mit anderen Werten durchführen.
Das StringGrid hat 9 Spalten und 25 Zeilen. Die erste Spalte trägt die laufenden Nr., die erste Zeile die Bezeichnung Mo, Di, Mi bis So und eine Summenspalte. In jeder Zeile werden die Werte der Tage addiert und in die Summenspalte geschrieben. Die Werte aller Zeilen in der Summenspalte werden wiederum addiert und der Wert dann zu weiteren Berechnung verwendet.

2. Du schreibst "die Werte original ins StringGrid schreiben und auf 2 Nachkommastellen formatieren". Genau das will ich, aber wie?

mkinzler 18. Mai 2008 22:34

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
Steht doch oben

Stecky2000 18. Mai 2008 22:35

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
Wo oben? Meinst Du deine Aussage mit dem getrennt speichern?
Das würe ich so verstehen, dass ich ein weiteres StringGrid einfüge und die Eigenschaft Visible auf False setze und das zum Rechnen nehme.

mkinzler 18. Mai 2008 22:36

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
Nein das Format()

Stecky2000 18. Mai 2008 22:39

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
Sorry, ich bin ja kein Programmierer.

Ich blicke nicht durch.

Ich habe das Format zum in die Zellen schreiben benutzt, das kürzt doch aber die Stellen?!

mkinzler 18. Mai 2008 22:40

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
Ja deshalb der der Vorschlag mit dem getrennt speichern oder halt Ownerdraw

Stecky2000 18. Mai 2008 22:46

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
Danke, dann werde ich tatsächlich ein zweites unsichtbares Grid verwenden.
Ich hoffe es wird der Performance kein Abbruch tun ;-)

Chemiker 18. Mai 2008 22:55

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
Hallo Stecky2000,

ich würde versuchen, das mit der TStringGrid.Object – Eigenschaft zu lösen, damit ist es möglich hinter jeder Zelle ein Object dranzuhängen. In deinem Fall währe das der original Wert.

Bis bald Chemiker

mkinzler 18. Mai 2008 22:56

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
Ich dachte da eher an einen Array o.ä.

himitsu 18. Mai 2008 22:58

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
oder am einfachsten OwnerDraw ... in den Zellen steht dann der richtige Wert, aber angezeigt/gezeichnet wird nur der per Format gerundete.

grenzgaenger 18. Mai 2008 23:16

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
bau dir dich am besten 'n schönes objekt auf... in dem du die daten mit den algos speicherst. diese objekte hänst du in eine ObjectList. beim aufbau der objekte schreibst du zusätzlich die addresse in eine zeile/spalte. die berechnungen führst du dann easy über die objekte durch und scheibst nur die ausgabe ins stringgrid.

ist easy, zuverlässig und hinterlässt keine speicherlöcher :-)

Stecky2000 18. Mai 2008 23:35

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
Schwer zu verdauen , Eure Kost....

Ich werde mal sehen, was ich hin bekomme. Werde mich mal in Ownerdrw einlesen und schauen, ob ich damit fertig werde.

Array ist auch eine Alternative. Ich hatte damit bereits experimentiert.

Chemiker 19. Mai 2008 00:17

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
Hallo Stecky2000,

OwnerDraw ist der Überbegriff, bei StringGrid ist die Suche nach OnDrawCell erfolgreicher.


Bis bald Chemiker

Stecky2000 20. Mai 2008 19:12

Re: StringGrid Zellen wie Excel Kommastellen unterdrücken
 
So Jungs, sorry, hab ein wenig länger gebraucht um mich zu melden.

Ich hatte bereits heraus gefunden, das Ownerdraw nur der überbegriff war.
Hab das Problem damit gelöst, war gar nicht so schwer ;-)

Habs so gemacht:

Delphi-Quellcode:
procedure TForm1.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
     with (Sender as TStringGrid) do
          begin
               // Erste Reihe nicht einfärben
               if (ARow = 0) then
               Canvas.Brush.Color := clBtnFace
               else
                   begin
                        if (cells[ACol, ARow] <> '') and (cells[ACol, ARow] <> ' ') then
                            Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Format('2.2f', [StrToFloat (cells[acol, arow])]));
                   end;
          end;
end;
Danke Euch für die Hilfe. Ich werde bestimmt mit mehr Fragen kommen ;-)


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