AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?

Ein Thema von NicoleWagner · begonnen am 25. Nov 2021 · letzter Beitrag vom 26. Nov 2021
Antwort Antwort
Seite 1 von 2  1 2      
NicoleWagner

Registriert seit: 6. Jul 2010
167 Beiträge
 
Delphi XE3 Professional
 
#1

Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?

  Alt 25. Nov 2021, 10:56
Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?

Dieses Event wird - so ich es richtig verstanden habe-, zellen-weise und von der Reihenfolge her Zeile für Zeile durchlaufen.

Ich möchte in meinem Grid bunte Hintergründe und Linien haben. Das soll sich jeweils auf Zeilen oder Zeilengruppen beziehen.
Dabei sollen die Zeilen je nach Inhalt bunt hinterlegt sein oder aber einzelne horizontale Rahmenlinien bunt gemalt.
Für den Hintergrund klappt das wunschgemäß, für die Linie hingegen nicht.
Der Hintergrund wird wunschgemäß quer durchgezogen, die Rahmen-Linie wird hingegen nur für die erste Zelle gezeichnet.

Hier sind Details:

DBGrid_TraDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);

Var ......
....

// so klappt es für den Hintergrund, eine neue Woche wird erkannt: aufgrund einer Zelleninformation
if woche_ <> woche_temp then begin
woche_temp:=woche_;
If farbe = clwhite then farbe := clBlue // $00E7F2FF // wechselt mit der Woche
else farbe := clWhite;

// die oben zugewiesene "farbe" wird außerhalb des Zellen-Blocks als Hintergrund gesetzt und färbt mir wie gewollt die ganze Zeile ein, soweit so gut:
Canvas.Brush.Color := farbe; // Hintergrundfarbe wird zugewiesen


Dieselbe Übung möchte ich jetzt gerne mit der Linie tun. Ich kann dort meine Zelleninformation abfragen und auch den Rahmen der Zelle einfärben:

if Monatswechsel then begin // das sollte die Linie durchziehen, zeichnet aber nur die erste Zelle
Canvas.Pen.Color := $00243C79; // $005180F5; // Linienfarbe für die Monatstrennung
Canvas.Pen.Width := 5; // Stärke der Linie, erzeugt einen Ballon am Zeilenbeginn
Canvas.MoveTo(Rect.Left,Rect.Top);
Canvas.LineTo(Rect.Right,Rect.Top); // zeichnet eine rote Linie an die Oberkante und damit unter das alte Monat
end; //_______________________ Ende zur Monaterkennung

Was mir fehlt, ist ein Befehl außerhalb der Zellenschleife, der analog "Canvas.Brush.Color := farbe;" nicht den Hintergrund, sondern den oberen Rand des Rechtecks ALLER Rechtecke dieser Zeile setzt.
Also ich kratze mich mit der linken Hand am rechten Ohr, weil ich etwas bräuchte wie:
"Canvas.Rect.TopAllerRechtecke...."
Natürlich kann es so etwas nicht geben, daher meine Frage:
Wie zeichne ich eine einzelne bunte, horizontale Linie über alle Zellen einer Zeile?

Danke allen, die sich die Mühe gemacht haben, die Frage überhaupt zu verstehen. Und noch mehr jenen, die mir die Lösung verraten.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#2

AW: Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?

  Alt 25. Nov 2021, 12:00
Suchst Du sowas in der Art?
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, kbmMemTable, Grids, DBGrids;

type
  TForm1 = class(TForm)
    dbg: TDBGrid;
    ds: TDataSource;
    tb: TkbmMemTable;
    procedure FormCreate(Sender: TObject);
    procedure dbgDrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
  private
    { Private-Deklarationen }
    fMonatOld : Integer;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
begin
  // Nur, damit wir zum Testen überhaupt mal ein paar Daten haben.
  for i := 1 to 100 do begin
    tb.Append;
    tb.Fields[1].AsInteger := StrToInt(FormatDateTime('mm',Now + i));
    tb.Fields[2].AsString := FormatDateTime('mmmm',Now + i);
    tb.Post;
  end;
  // Irgendwo, an geeigneter Stelle den ersten Monat merken!!!
  fMonatOld := StrToInt(FormatDateTime('mm',Now));
end;

procedure TForm1.dbgDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  Monat : Integer;
  Monatswechsel : Boolean;
begin
  // Den Monat des aktuellen Datensatzes holen.
  Monat := dbg.DataSource.DataSet.FieldByName('Monat').AsInteger;
  // Den mit dem gemerkten Monat vergleichen.
  Monatswechsel := fMonatOld <> Monat;
  // Hat ein Monatswechsel stattgefunden?
  if Monatswechsel then begin
    // Wenn ja, Linie zeichnen.
    dbg.Canvas.Pen.Color := $00243C79; // $005180F5; // Linienfarbe für die Monatstrennung
    dbg.Canvas.Pen.Width := 5; // Stärke der Linie, erzeugt einen Ballon am Zeilenbeginn
    dbg.Canvas.MoveTo(Rect.Left,Rect.Top);
    dbg.Canvas.LineTo(Rect.Right,Rect.Top); //
    // Wichtig: Erst bei der letzten Spalten den nun neuen "alten" Monat merken.
    // Ansonsten erhält man die Linie nur in der ersten Spalte!!!
    if DataCol >= dbg.Columns.Count - 1 then fMonatOld := Monat;
  end;
  // Die ursprüngliche Zeichenroutine des DBGrids aufrufen.
  dbg.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

end.
Miniaturansicht angehängter Grafiken
form1.jpg  
  Mit Zitat antworten Zitat
NicoleWagner

Registriert seit: 6. Jul 2010
167 Beiträge
 
Delphi XE3 Professional
 
#3

AW: Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?

  Alt 25. Nov 2021, 13:00
das ist GENAU was ich will.
Danke!

==============
PS, nach der Implementierung

ich habe ein Problem.
Vorweg mein half-Workaround lautet: "if (DataCol > 12) then Monatswechsel:=false;" Das zeichnet mal lange Striche, wenigstens bis 12.

Was nicht geht, ist:
Columns.Count

Dieser Wert sollte 28 sein, ist jedoch fuzzy.
Einmal wird im Debugger angezeigt, er wäre "nicht verfügbar", dann wiederum gibt er ein falsches Ergebnis.

Auch "(DataCol > 20)" ist nicht "true", wenn ich es denke, es sollte es.

Kann das daran liegen, dass ich in meinem DBGrid die Spalten im Spalteneditor von der Reihenfolge her verändert habe?
Wenn ja, wie gehe ich damit um?

Die Query ist eine Mischung aus db-Abfragen und "calculated"-Feldern.

Gerade beim "calculated" wird mir das auf den Kopf fallen, wenn ich auf eine falsche Spalte zugreife.

Ich habe Delphi XE3, das leider bei Zugriffen auf Listen zuweilen hässliche Bugs hat, die in der IDE begründet liegen.
Doch vielleicht hat jemand für mich Hinweise, wie ich damit umgehe.

Danke!

Geändert von NicoleWagner (25. Nov 2021 um 15:37 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#4

AW: Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?

  Alt 25. Nov 2021, 16:41
Zitat:
Vorweg mein half-Workaround lautet: "if (DataCol > 12) then Monatswechsel:=false;" Das zeichnet mal lange Striche, wenigstens bis 12.
Die 12 besagt doch, dass nach 12 Spalten ein Monatswechsel nicht mehr gegeben ist. Ist das denn so gewünscht? Soll der Monatswechsel nicht beim Wechsel des Monats zwischen zwei Zeilen erfolgen?

In DrawColumnCell stehen Dir nur die Werte aus der aktuellen Zeile der Datenmenge zur Verfügung, von daher ist es nicht möglich, nur mit Werten aus dieser Zeile innerhalb der Prozedure zu entscheiden, ob eine Monatswechsel vorliegt oder nicht. Dazu benötigst Du eine globale Variabel / Attribut im Formular, in denen Du die Info zum Monat der vorherigen Zeile vorhältst.

Die Reihenfolge der Spalten in der Datenmenge und ggfls. Unterschiede in der Reihenfolge im DBGrid, sollten da eigentlich eher keine Auswirkungen haben.

Über Column.Field.Calculated kannst Du abfragen, ob es sich bei der gerade zu zeichnenden Zelle um eine "kalkulierte" Zelle oder eben eine "normale" handelt.

Im Zweifel: Poste bitte Deine vollständige Prozedur DBGrid_TraDrawColumnCell, ansonsten wird das in eine für alle Beteiligten furchtbare Raterei ausarten. Die Abhängigkeiten sind zu vielfältig, um sie mit wenigen Worten beschreiben zu können.
  Mit Zitat antworten Zitat
NicoleWagner

Registriert seit: 6. Jul 2010
167 Beiträge
 
Delphi XE3 Professional
 
#5

AW: Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?

  Alt 25. Nov 2021, 19:04
Zitat:
Die 12 besagt doch, dass nach 12 Spalten ein Monatswechsel nicht mehr gegeben ist. Ist das denn so gewünscht?
Das ist ganz und gar nicht erwünscht!
Ich möchte die Linie durchgezogen haben, doch es klappt nicht.
Sie soll bis 28 gehen, nicht nur bis 12.
12 ist besser als 1, doch gut ist es nicht.

Schreibe ich etwa "..(DataCol > 20)" oder "Columns.Count -1" wie Du, was ich ja EIGENTLICH tun möchte, - wird die Bedingung niemals "true", obwohl sie es sollte. Das führt dazu, dass die Linie durchs gesamte Grid läuft und IMMER gezeichnet wird, weil eben der Abbruch fehlt.

Jetzt wird man sagen: "nanu?"
So sprach auch ich "nanu" und fragte die Paramenter ab. Dabei kam ich drauf, dass Columns.Count ebenso wie meine hässliche (weil wenig robuste) Alternative "(DataCol > 27)" nicht so funktioniert, wie ich es erwarten würde.
Delphi zählt die Spalten falsch hoch. Irgendwo gegen 12 wird die Zählung falsch.


Zitat:
In DrawColumnCell stehen Dir nur die Werte aus der aktuellen Zeile der Datenmenge zur Verfügung, von daher ist es nicht möglich, nur mit Werten aus dieser Zeile innerhalb der Prozedure zu entscheiden, ob eine Monatswechsel vorliegt oder nicht. Dazu benötigst Du eine globale Variabel / Attribut im Formular, in denen Du die Info zum Monat der vorherigen Zeile vorhältst.
Das habe ich schon so verstanden und zähneknirschend ein paaar globale Variablen eingefügt.
Ich fürchte, ich zeichne in Draw nicht nur, sondern habe das Ding auch als Calc-Ereignis missbraucht.
Denn auch im Calc-Ereignis würde ich den Monatswechsel (in meinem Fall auch einen Wochenwechsel dazu) brauchen.
Das ist das Problem mit dem Quellcode.

Zitat:
Im Zweifel: Poste bitte Deine vollständige Prozedur DBGrid_TraDrawColumnCell, ansonsten wird das in eine für alle Beteiligten furchtbare Raterei ausarten. Die Abhängigkeiten sind zu vielfältig, um sie mit wenigen Worten beschreiben zu können.
Ich fürchte, das willst Du nicht wirklich. Das ist eine mit zig units vernetzte Sache, die units sind jeweils auf bestimmte Datenbanktabellen spezialisiert. Mein implementation-Teil wird immer länger.
Das Problem vermute ich nämlich nicht im DrawColumnCell, sondern in der Spaltenedition von Query und DBGrid. Ich habe da schon einige ärgerliche Überraschungen erlebt, was übernommen wird und was nicht.
Theoretisch könnte ich die DBGrid-Spalten aus der Query neu übernehmen, praktisch war die jetzige Reihenfolge richtig viel Arbeit und ich will es vermeiden. Ob es helfen würde, weiß ich ohnehin nicht.


Zitat:
Die Reihenfolge der Spalten in der Datenmenge und ggfls. Unterschiede in der Reihenfolge im DBGrid, sollten da eigentlich eher keine Auswirkungen haben.
Über Column.Field.Calculated kannst Du abfragen, ob es sich bei der gerade zu zeichnenden Zelle um eine "kalkulierte" Zelle oder eben eine "normale" handelt.
Das schon, nur wie komme ich dem Ding auf die Schliche, wie es zählt?

Hänge ich das in mein DrawEvent ein
ShowMessage(IntTostr(DataCol)+ ' ');
so wird stets von Null bis 13 hochgezählt. Danach beginnt es wieder bei Null.
Es sind jedoch 28 Spalten, die gezeichnet werden.

Was tun?

PS:
hier half mir noch ein guter Geist:
https://www.delphipraxis.net/newrepl...ime=1637863673

Ich wollte die Breite der Felder automatisch ihrem Inhalt anpassen.
Aus dem damit gezeichneten StringGrid glaube ich zu erkennen, dass nicht "calculated"-Felder ignoriert werden.
Sie haben die Breite Null.

Geändert von NicoleWagner (25. Nov 2021 um 19:16 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#6

AW: Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?

  Alt 25. Nov 2021, 19:13
Bitte nur den Code aus DBGrid_TraDrawColumnCell. Der Rest interessiert (erstmal) nicht, damit ich verstehen kann, was Du genau in der Prozedur machst. Ggfls. als Kommentar reinschreiben: "DataCol ist immer irgendwas von 0 bis 12, erwarte dort aber 0 bis 28."
Dergleichen für alle für Dich offensichtlichen oder nicht nachvollziehbaren Unstimmigkeiten zwischen dem Gewünschten / Beabsichtigtem und dem von Delphi produzierten.

Wenn ich damit dann nicht weiterkomme, können wir sehen, ob noch mehr Code zum Nachlesen erforderlich sein sollte.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#7

AW: Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?

  Alt 25. Nov 2021, 19:40
Hast Du zufällig Spalten, bei denen Visible auf false gesetzt ist?
Eventuell fallen die bei der Zählung ja raus, weshalb dann die erwartete Spaltenzahl und die tatsächlich gegebene Spaltenzahl nicht so ganz zusammenpassen.

Vergleiche doch bitte mal in DBGrid_TraDrawColumnCell die Inhalte von DataCol und Column.Field.FieldNo. Passt das "irgendwie" zusammen? Bei DataCol würde ich die Spaltennummer von links bei 0 beginnend gezählt erwarten, bei Column.Field.FieldNo die Position der Spalte in der Query.

Wenn ich Deine bisherigen Erläuterungen richtig interpretiere, werden wohl 14 Spalten (0..13) angezeigt. Wenn im ShowMessage dann wieder bei 0 begonnen wird, heißt das, dass die Routine bereits die nächsten Zeile darstellt. Eventuell änderst Du Dein ShowMessage(IntTostr(DataCol) + ' '); mal in ShowMessage(IntTostr(DataCol) + Column.Field.AsString); , vielleicht kannst Du damit etwas genauer nachvollziehen, was da gerade passiert.

Geändert von Delphi.Narium (25. Nov 2021 um 19:42 Uhr) Grund: Schreibfehler ...
  Mit Zitat antworten Zitat
NicoleWagner

Registriert seit: 6. Jul 2010
167 Beiträge
 
Delphi XE3 Professional
 
#8

AW: Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?

  Alt 25. Nov 2021, 19:41
Danke für Deine Mühe und Geduld!!!


//************************************************** ****************************
implementation
uses .........

Var monat_temp, woche_temp: integer; // benötigt für das Farbschema
farbe: TColor= $00E7F2FF; // fürs Einfärben des Grids
Monatswechsel: Boolean = false;

Wochengewinn: integer = 0;
Monatsgewinn: integer = 0;
myKontostand: integer = 0; // fürs Draw Ereignis

=======================================

// malt die Monateszeilen der Trades je nach Monat bunt und rechnet sie auch, als "Calc"-Ereignis missbraucht
procedure TFrame_Konto.DBGrid_TradesDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);

Var s_cell: string;
d: double;
i: integer;
dat_: TDateTime;
monat_, woche_: integer;
Kapital, Gewinn: integer;


begin
// wird jede Zelle aufgerufen, dabei liegen dieParameter so:
/// Query.RecNo 1 1 1 1 => DataSource_TradesListen.DataSet.RecNo
/// 2 2 2 2
/// column.index 0 1 2 3
/// 0 1 2 3
/// 0 1 2 3
/// columns 0 1 2 3
/// 0 1 2 3
/// 0 1 2 3
/// hier passiert nur das ZEICHNEN, der Inhalt hängt davon nicht ab
/// ACHTUNG Namen der Felder sind case sensitive!
///
///

with (Sender as TDBGrid) do begin


if Column.Field <> nil then s_cell:=Column.Field.AsString; // hier wird einmal alles generell in ein eintragbares String gespeichert
// ganz unten wird dieser String über den neuen Hintergrund geschrieben

// für andere Werte überschreibe ich das String, um es anders zu formatieren.

//________________ diese Block färbt alternierende Zeilen, wenn NICHT nach Datum sortiert wird
if RadioGroup_Sortiere.ItemIndex <> 5 then begin
i:=DataSource_TradesListen.DataSet.RecNo;
if Odd(i) then Canvas.Brush.Color :=$00E7F2FF;
Canvas.FillRect(Rect); // steht das vor dem Block "Schriftfarbe", wird nur hinter-dem-Anfüllen-aufgerufen sichtbar
Canvas.TextOut(Rect.Left + 2, Rect.Top + 1,s_cell); // Text wird neu geschrieben
exit; // Sortierung der Query UNGLEICH Datum, daher macht das Einfärben oder Rechnen keinen Sinn
end;


//__________alles weitere bis hinunter, WENN nach Datum sortiert wird
// die Spalte Datum wird ausgelesen und für diese Zeile verarbeitet
dat_:=DataSource_TradesListen.DataSet.FindField('E ntry_Date').AsDateTime;
monat_ := MonthOf(dat_);
woche_:= WeekOf(dat_);

myKontostand:=DB_Konto.ReadSQL_Kontostand_ausTBGel d(dat_); //findet in tbgeld den Kontostand zu einem bestimmten Datum vom in RadioGroup gewähltem Konto

// _________________jedes neue Monat wird erkannt
if monat_ <> monat_temp then begin
monat_temp:=monat_;
Monatswechsel:=true;
Monatsgewinn:=0;
end;

if Monatswechsel and (DataSource_TradesListen.DataSet.RecNo > 1) then begin // das zeichnet den oberen Rand einer einzelnen Zelle, außer ganz oben
Canvas.Pen.Color := $00243C79; // $005180F5; // Linienfarbe für die Monatstrennung
Canvas.Pen.Width := 5; // Stärke der Linie, erzeugt einen Ballon am Zeilenbeginn
Canvas.MoveTo(Rect.Left,Rect.Top);
Canvas.LineTo(Rect.Right,Rect.Top); // zeichnet eine rote Linie an die Oberkante und damit unter das alte Monat
end;

i:=Columns.Count; // Columns.Count nimmt er, doch "interner Fehler", er scheint falsch zu zählen.
if (DataCol > 12) // das funktioniert jetzt, doch nur für > 12?! ich lasse das einmal so, weil es nicht lohnt. d.h. die Striche sind lang, doch nicht bis zum Ende
then Monatswechsel:=false;
//_______________________ Ende zur Monaterkennung: Es wird das Monat als Zelle erkannt und die Info bis zum Zeilenfortschritt auf Zelle 12 beibehalten, danach alte Farbe/Dicke


// _________________jede neue Woche wird erkannt

if woche_ <> woche_temp then begin
woche_temp:=woche_;
If farbe = clwhite then farbe := $00E7F2FF // wechselt mit der als neu erkannten Woche
else farbe := clWhite;
Wochengewinn:=0; // Der Wochengeweinn wird zurückgeetzt
end;
Canvas.Brush.Color := farbe; // Hintergrundfarbe wird zugewiesen, bewirkt, dass die Hingrundfarbe orange bleibt, bis zum nächsten Wochenwechsel
//_____________ Ende der Wochenbearbeitung


// überschreibt string für die PL wieder, um die PL besser zu formatieren
if (Column.FieldName='PL') then begin // klappt auch: if (dataCol=1).....
d:=DataSource_TradesListen.DataSet.FindField('PL') .AsFloat;
s_cell:=FloatToStrF(d,ffNumber,5,2);
end;

// adddiert die Tradeergenisse zum Periodenfangskapital, rechnet Performance
if (Column.FieldName='ERGEBNIS') then begin // das ist case sensitive !!!
i:=DataSource_TradesListen.DataSet.FindField('ERGE BNIS').AsInteger;
if i < 0 then Canvas.Font.Color := clRed
else Canvas.Font.Color := clGreen;
myKontostand:= myKontostand + i;
Monatsgewinn:=Monatsgewinn + i;
Wochengewinn:=Wochengewinn + i;
end;

if (Column.FieldName='KAPITAL') then
s_cell:=FloatToStrF(myKontostand,ffNumber,5,2);

if (Column.FieldName='Wochengewinn') then begin
s_cell:=FloatToStrF(Wochengewinn,ffNumber,5,2);
if Wochengewinn < 0 then Canvas.Font.Color := clRed
else Canvas.Font.Color := clGreen;
end;

if (Column.FieldName='WoG_Prozent') then begin
if myKontostand = 0 then d:=0
else d:=(Wochengewinn / myKontostand) * 100;
s_cell:=FloatToStrF(d,ffNumber,5,2) + ' %';
if d < 0 then Canvas.Font.Color := clRed
else Canvas.Font.Color := clGreen;
end;

if (Column.FieldName='Monatsgewinn') then begin
s_cell:=FloatToStrF(Monatsgewinn,ffNumber,5,2);
if Monatsgewinn < 0 then Canvas.Font.Color := clRed
else Canvas.Font.Color := clGreen;
end;

if (Column.FieldName='MoG_Prozent') then begin
if myKontostand = 0 then d:=0
else d:=(Monatsgewinn / myKontostand) * 100;
s_cell:=FloatToStrF(d,ffNumber,5,2) + ' %';
if d < 0 then Canvas.Font.Color := clRed
else Canvas.Font.Color := clGreen;
end;
//__________________ Ende Performancerechnungen


// die übermalte Schrift wird wieder eingetragen
Canvas.FillRect(Rect); // steht das vor dem Block "Schriftfarbe", wird nur hinter-dem-Anfüllen-aufgerufen sichtbar
Canvas.TextOut(Rect.Left + 2, Rect.Top + 1,s_cell); // Text wird neu geschrieben


// ShowMessage(IntTostr(Datacol)+ ' ');


end; // zu (Sender as TDBGrid)

end;
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#9

AW: Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?

  Alt 25. Nov 2021, 20:00
Probiere bitte mal folgendes:

Statt
Delphi-Quellcode:
i := Columns.Count; // Columns.Count nimmt er, doch "interner Fehler", er scheint falsch zu zählen.
if (DataCol > 12) // das funktioniert jetzt, doch nur für > 12?! ich lasse das einmal so, weil es nicht lohnt. d.h. die Striche sind lang, doch nicht bis zum Ende
then Monatswechsel := false;
bitte
Delphi-Quellcode:
i := DBGrid1.DataSource.DataSet.FieldCount; // Anzahl der Spalten im DataSet.
if (DataCol >= i) then Monatswechsel := false;
Klappt es damit?
  Mit Zitat antworten Zitat
NicoleWagner

Registriert seit: 6. Jul 2010
167 Beiträge
 
Delphi XE3 Professional
 
#10

AW: Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?

  Alt 26. Nov 2021, 11:48
danke für die Idee!
Nein, es geht nicht, doch was nicht geht, muss man eben tragen.

und zwar habe ich diese Zwischenergebnisse

i:=DataSource_TradesListen.DataSet.Fields.Count - 1; // 28
i:=DataSource.DataSet.FieldCount; // Anzahl der Spalten im DataSet // 28?!
i:=Column.Field.FieldNo - 1; // 7

Doch der Hund ist vermutlich tiefer begraben:

if (DataCol >= i) then Monatswechsel := false;

Denn dieses "DataCol" hat bei mir nur die Werte von 0 bis 13. Daher muss die Abfrage > 28 stets false sein
Allerdings wie frage ich die Feldnummer statt DataCol ab?
Mit den Verdächtigen oben klappte es nicht.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:42 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