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 im sql-query werte in rot darstellen (https://www.delphipraxis.net/70289-im-sql-query-werte-rot-darstellen.html)

tom_po 28. Mai 2006 09:55


im sql-query werte in rot darstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich hole aus meiner dbisam-tabelle "stockfabric" unter anderem Vorratszahlen und möchte alle Werte bis 100 (des field "stock") in rot in meiner applikation (dbisamgrid1 mit dbisamquery1) darstellen, wie binde ich dies ein?

Hier mein Code:

Delphi-Quellcode:
procedure TForm3.ToolButton3Click(Sender: TObject);
begin
DBISAMQuery1.SQL.Clear;
DBISAMQuery1.SQL.Add('select code as "Código",desc as "Descrição",maq as "Maquina destinada",stock as "Quant.Stock",date as "Último movimento" from stockfabric,fabric where nr = 1 and stockfabric.code=fabric.code order by code');
DBISAMQuery1.ExecSQL;
DBISAMQuery1.Edit;
dbnavigator1.Visible := false;
form3.Caption := 'Stock Agulhas';
end;
anbei noch ein bild der dbisam-tabelle

mkinzler 28. Mai 2006 10:17

Re: im sql-query werte in rot darstellen
 
Implementiere .OnDrawColumnCell

tom_po 28. Mai 2006 10:43

Re: im sql-query werte in rot darstellen
 
habe es so jetzt ergänzt, funktioniert aber noch nicht:
Delphi-Quellcode:
procedure TForm3.DBISAMDBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
  if ('stock' <= floattostr(100)) then
    begin
      canvas.Font.Style := canvas.Font.Style + [fsBold];
      canvas.Font.Color := clred;
    end;
end;
field "stock" ist vom data-type float

tom_po 28. Mai 2006 13:34

Re: im sql-query werte in rot darstellen
 
ich habe den Code jetzt so geändert, geht aber noch nicht...

Delphi-Quellcode:
procedure TForm3.DBISAMDBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
   DBISAMQuery1.SQL.Clear;
   DBISAMQuery1.SQL.Add('select * from stockfabric');
   DBISAMQuery1.ExecSQL;
  if dbisamquery1.FieldByName('stock').Asfloat <= 100 then
    begin
      dbisamdbgrid1.canvas.Font.Style := canvas.Font.Style + [fsBold];
      dbisamdbgrid1.canvas.Font.Color := clred;
    end;
    dbisamdbgrid1.Canvas.FillRect(Rect);
    dbisamdbgrid1.DrawTextBiDiModeFlags(dbisamdbgrid1.Canvas.Handle);
end;

mkinzler 28. Mai 2006 13:55

Re: im sql-query werte in rot darstellen
 
Noch ein Denkanstaß

Delphi-Quellcode:
var
   can: TCanvas;
begin
   can := (sender as TDBGrid).Canvas;
   if column.Field.FieldName = 'stock' then
   begin
    ...
   end;
end;

tom_po 30. Mai 2006 08:33

Re: im sql-query werte in rot darstellen
 
mein code sieht momentan so aus, geht aber noch nicht, angezeigte Zahlen im String "laufen durch".

Delphi-Quellcode:
procedure TForm3.DBISAMDBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
 begin
   DBISAMQuery1.SQL.text := 'select * from stockfabric';
   DBISAMQuery1.Open;
  if dbisamquery1.FieldByName('stock').Asfloat = 100 then
    begin
      dbisamdbgrid1.Font.Style := canvas.Font.Style + [fsBold];
      dbisamdbgrid1.Font.Color := clred;
    end else dbisamDBGrid1.Font.Color := clBlack;
    dbisamdbgrid1.Canvas.FillRect(Rect);
    dbisamdbgrid1.DrawTextBiDiModeFlags(dbisamdbgrid1.Canvas.Handle);
 end;
mkinzler, wo soll ich deinen Denkanstoss einbauen?

mquadrat 30. Mai 2006 08:40

Re: im sql-query werte in rot darstellen
 
Das Event OnDrawColumnCell wird während des Zeichnen des Grids gefeuert. Da also nochmal eine Query zu machen, macht a) keinen Sinn und b) die Anwendung unendlich langsam.

Delphi-Quellcode:
  if ('stock' <= floattostr(100)) then
Das hier kann gar nicht funtionieren da 'stock' immer ungleich '100' ist...

Den Denkanstoß musst du in das OnDrawColumnCell einbauen. Das Prinzip ist recht simpel. OnDrawColumnCell wird beim Zeichnen jeder Zelle aufgerufen. Du musst also erstmal prüfen ob die Spalte der Zelle, die gerade gezeichnet wird, deine 'Stock' Spalte ist. Wenn ja und der Wert des Feldes <= 100 dann setzt du die Farben des Canvas entsprechend deinen Wünschen also rot. Wenn nicht dann setzt du die Farbe wieder auf schwarz.

tom_po 30. Mai 2006 08:53

Re: im sql-query werte in rot darstellen
 
die daten werden nun wieder korrekt im dbisamgrid angezeigt, die zahlen kleiner 100 sind jedoch nicht in rot...

Delphi-Quellcode:
procedure TForm3.DBISAMDBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
var
   can: TCanvas;
begin
   can := (sender as TDBisamDBGrid).Canvas;
   if column.Field.FieldName = 'stock' then
 begin
   DBISAMQuery1.SQL.text := 'select * from stockfabric';
   DBISAMQuery1.Open;
   if dbisamquery1.FieldByName('stock').Asfloat < 100 then
    begin
      dbisamdbgrid1.Font.Style := canvas.Font.Style + [fsBold];
      dbisamdbgrid1.Font.Color := clred;
    end else dbisamDBGrid1.Font.Color := clBlack;
    dbisamdbgrid1.Canvas.FillRect(Rect);
    dbisamdbgrid1.DrawTextBiDiModeFlags(dbisamdbgrid1.Canvas.Handle);
 end;
end;

franktron 30. Mai 2006 09:00

Re: im sql-query werte in rot darstellen
 
Bevor hier das ganz zum 10000 mal wieder erzählt wird guck mal in der DP Suche Hier im Forum suchenDrawColumnCell

mquadrat 30. Mai 2006 09:02

Re: im sql-query werte in rot darstellen
 
Ok, dann erklär ich erstmal wieso die nicht rot sind ;)

Der erste Datensatz den deine Query zurückgibt hat ein Stock > 100. So einfach ist das. Du fragst jedesmal neu die Datenbank an und schaust immer nur den ersten Datensatz an. Mit anderen Worten: Du prüfst jedesmal den gleichen Wert gegen 100.

Und wie schon im letzten Beitrag geschrieben: Im OnDrawColumnCell KEINE Query. Das macht das Programm nur extrem langsam.

Die Lösung findest du mit dem Link im letzten Beitrag ;)


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