Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   DBGrid darstellen von neg Zahlen als pos (https://www.delphipraxis.net/166528-dbgrid-darstellen-von-neg-zahlen-als-pos.html)

wschrabi 16. Feb 2012 16:47

Delphi-Version: 5

DBGrid darstellen von neg Zahlen als pos
 
Hi,
hat jemand eine Lösung für mein Problem?

Ich habe eine DB die ich am Screen mit DBGrid darstelle.
Jetzt sind in der DB auch neg Zahlen drin, die ich positiv im Grid darstellen möchte.
(Weiters wird wenn neg. die CellFarbe geändert, das hab ich mit dem Event DBGrid1DrawColumnCell geschafft.)
Hat jemand eine Idee wie ich in diesem Event auch den Cell-Inhalt ändern kann, ohne dass es auf die DB sich auswirkt?
DANKE

Delphi-Quellcode:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
var
  col: integer;
begin
  for col:= 1 to MyQuery2.FieldByName('NumLOGDATA').AsInteger do
    begin
    if Column.Fieldname = 'MPi'+IntToStr(col) then //alternativ über den Index des Spalte
      begin
      if MyQuery2.FieldByName('MPi'+IntToStr(col) ).AsFloat < 0 then
        begin
        DBGrid1.Canvas.brush.color:=clYellow;
        DBGrid1.Canvas.font.color:=clBlack;
        DBGrid1.DefaultDrawColumnCell(rect, 1, column,state);
        //DBGrid1.DataSource.DataSet.FieldByName('MPi'+IntToStr(col)).AsFloat:=-1*DBGrid1.DataSource.DataSet.FieldByName('MPi'+IntToStr(col)).AsFloat
        end
      else
        begin
        DBGrid1.Canvas.brush.color:=clWhite;
        DBGrid1.Canvas.font.color:=clBlack;
        DBGrid1.defaultdrawcolumnCell(rect, 1, column,state);
        end;
      end;
    end;
end;

shmia 16. Feb 2012 16:54

AW: DBGrid darstellen von neg Zahlen als pos
 
Du müsstest einen Eventhandler für OnGetText des TField schreiben.
Kleines Beispiel zur Anregung:
Delphi-Quellcode:
procedure TDatenModule1.BetragFieldOnGetText(Sender: TField; var Text: String; DisplayText: Boolean);
begin
   if DisplayText then
      if Sender.AsFloat < 0.0 then
         Delete(Text, 1, 1); // Minuszeichen löschen
end;

....
// Eventhandler einklinken
query1.FieldByName('Warenwert').OnGetText := self.BetragFieldOnGetText;

Jumpy 17. Feb 2012 10:40

AW: DBGrid darstellen von neg Zahlen als pos
 
Wenn die Ergebnismenge von einer Query geliefert wird, wäre es da nicht einfacher sich direkt den absolutbetrag der Werte von der DB/Query liefern zu lassen?

ConnorMcLeod 17. Feb 2012 10:42

AW: DBGrid darstellen von neg Zahlen als pos
 
Dann geht die Info verloren, dass der Wert im Original negativ war. Also brauch man ein zusätzliches Bool-Feld.

wschrabi 17. Feb 2012 17:08

AW: DBGrid darstellen von neg Zahlen als pos
 
Dank shmia, :thumb: ich musste jedoch den code etwas abändern. Aber Du hast mir mit der Idee genau geholfen:
Delphi-Quellcode:

procedure TForm1.MyQuery2AfterOpen(DataSet: TDataSet);
var
  col: integer;
begin
  //20120217
  for col:= 1 to 225 (* MyQuery2.FieldByName('NumLOGDATA').AsInteger *) do
    begin
    MyQuery2.FieldByName('MPi'+IntToStr(col)).OnGetText := self.BetragFieldOnGetText;
    end;


end;
und die Routine:

Delphi-Quellcode:
procedure TForm1.BetragFieldOnGetText(Sender: TField; var Text: String; DisplayText: Boolean);
var
  mp: string;
begin
   if DisplayText then
      if ((Sender.AsFloat < 0.0)and(FloatToStr(Sender.AsFloat)<>'')) then
          begin
          mp:=FloatToStr(Sender.AsFloat);
          Delete(mp, 1, 1); // Minuszeichen löschen
          Text:=mp;
          end
      else
        begin
        Text:=Sender.AsString;
        end;

end;

Furtbichler 18. Feb 2012 08:10

AW: DBGrid darstellen von neg Zahlen als pos
 
Eine andere Möglichkeit wäre, ein berechnetes Feld zu erzeugen, das den absoluten Werte enthält.
Dieser Wert wird angezeigt, aber die Farbkodierung wird anhand des originalen Wertes vorgenommen.

Wenn ich nämlich den (negativen) Wert an anderer Stelle doch einmal anzeigen will, stellt mir das 'OnGetText' ein Bein.

Uwe Raabe 18. Feb 2012 10:15

AW: DBGrid darstellen von neg Zahlen als pos
 
Du kannst ganz einfach bei dem entsprechenden Feld das DisplayFormat setzen. Für ein Feld mit zwei Nachkommastellen würde man z.B. "0.00;0.00" dort eintragen, dann würden negative Zahlen wie positive dargestellt.


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