Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist! (https://www.delphipraxis.net/170051-crdbgrid1drawcolumncell-if-true-then-begin-problem-wenn-das-grid-leer-ist.html)

Alterauge 28. Aug 2012 11:54

Datenbank: MySQL • Version: 5.5 • Zugriff über: MyConnection

CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist!
 
Hallo Freunde,

also habe hier unter CRDBGrid1DrawColumnCell siehe Quelltext,
eine if Anweisung!
Soweit auch alles OK!

Mein Problem ist, wenn das Grid leer ist, zum Beispiel durch löschen der Datensätze!
Merkert das Grid, also die if Anweisung!
Habe die Anweisung mal ausgeklammert {} dann läuft alles!
Was kann ich da machen?

Delphi-Quellcode:
procedure TForm1.CRDBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
   var
  i : Integer;
 Wert: string;
  begin
   Wert := CRDBGrid1.DataSource.DataSet.FieldByName('Zuordnung').Value;
   if Wert = '1 sofort' then begin
    CRDBGrid1.Canvas.Brush.Color := clred;
     CRDBGrid1.Canvas.Font.Color := clblack;
       end else
    if Wert = '0 Eingang' then begin
     CRDBGrid1.Canvas.Brush.Color := clyellow;
     CRDBGrid1.Canvas.Font.Color := clblack;
       end else
    if Wert = '3 abwartend' then begin
     CRDBGrid1.Canvas.Brush.Color := clAqua;
     CRDBGrid1.Canvas.Font.Color := clblack;
        end else
    if Wert = '9 Fehler' then begin
     CRDBGrid1.Canvas.Brush.Color := clblack;
     CRDBGrid1.Canvas.Font.Color := clred;
        end else
       if Wert = '98 gesendet' then begin
     CRDBGrid1.Canvas.Brush.Color := cllime;
     CRDBGrid1.Canvas.Font.Color := clblack;
   end else begin
 
    end;
   CRDBGRid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
begin
   CRDBGRid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
        if (gdSelected in State) then
     begin
             Form1.CRDBGrid1.Canvas.Brush.Color := clHighlight;
             Form1.CRDBGrid1.Canvas.Font.Color:=clblack;
        end;
     form1.crDBGrid1.Canvas.FillRect(Rect);
     form1.crDBGrid1.Canvas.TextOut(Rect.Left + 2, Rect.Top + 1, Column.Field.AsString);

begin
  with MyTable1 do
    for i := 5 to Pred(Fields.Count) do
      Fields[i].DisplayWidth := 255;
end;
end;
  end;

mkinzler 28. Aug 2012 11:56

AW: CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist!
 
Frag halt vorher ab, ob die Datenmange überhaupt Datensätze enthält.

Alterauge 28. Aug 2012 11:59

AW: CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist!
 
Hey,

habe ich mal versucht! Hatte aber anschließend Probleme mit dem Refresh!
Habe den Quelltext leider wieder gelöscht :-(

s.h.a.r.k 28. Aug 2012 12:00

AW: CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist!
 
Delphi-Quellcode:
procedure TForm1.CRDBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  i : Integer;
  Wert: string;
begin
   if (CRDBGrid1.DataSource.DataSet.RecordCount = 0) then
     Exit;

  { hier dein Code }
end;
Und formatier mal deinen Code ein wenig. Damit hilfst du nicht nur dir, sondern auch anderen, die den mal lesen müssen ;)

[add]
Was für Probleme hattest dann mit dem Refresh? Du fängst doch nur den Fall ab, wenn keine Elemente mehr enthalten sind. Was soll denn da passieren?

Alterauge 28. Aug 2012 12:12

AW: CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist!
 
Hey super geht!

Danke!

Habe leider keine Ahnung mehr, was ich mir da zusammen
programmiert habe!

Jumpy 28. Aug 2012 12:29

AW: CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist!
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1180292)
Und formatier mal deinen Code ein wenig. Damit hilfst du nicht nur dir, sondern auch anderen, die den mal lesen müssen ;)

Zitat:

Zitat von Alterauge (Beitrag 1180298)
Habe leider keine Ahnung mehr, was ich mir da zusammen
programmiert habe!

q.e.d. :-D

Evtl. hilft auch schon zu testen, ob der Feldwert nicht null ist:

Delphi-Quellcode:
if not CRDBGrid1.DataSource.DataSet.FieldByName('Zuordnung').IsNull then
  begin
  //[...]
  end

mkinzler 28. Aug 2012 12:30

AW: CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist!
 
Zitat:

Zitat von Alterauge (Beitrag 1180298)
Hey super geht!

Danke!

Habe leider keine Ahnung mehr, was ich mir da zusammen
programmiert habe!

Das ist wohl dein Hauptproblem. Dir fehlt einfach das nötige Grundlagenwissen.

himitsu 28. Aug 2012 12:47

AW: CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist!
 
Ich kann mich ja täuchen, aber wäre es nicht besser auf den Wert der grade zu zeichnenden Zelle zuzugreifen, also über den Parameter Column, anstatt auf einen x-beliebigen Wert des aktiven Datensatzes, welcher mit der Zelle nicht unbedingt was zu tun haben muß?

Die Zelle/Zeile kann ja für einen ganz anderen Datensatz stehen.

Sir Rufo 28. Aug 2012 12:57

AW: CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist!
 
Und bitte nicht so auf das Grid zugreifen, sondern so
Delphi-Quellcode:
procedure TForm1.CRDBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  i : Integer;
  Wert : string;
  Grid : TCRDBGrid;
begin
  if not ( Sender is TCRDBGrid ) then
    Exit;

  Grid := Sender as TCRDBGrid;

  if not ( Assigned( Grid.DataSource ) and Assigned( Grid.DataSource.DataSet ) and ( Grid.DataSource.DataSet.RecordCount > 0 ) ) then
     Exit;

  { hier dein Code ... aber Zugriff auf das Grid über die Variable Grid }
end;
Der Zugriff über
Delphi-Quellcode:
Form1.CRDBGrid1
ist auf jedenfall der Garant für den Knieschuss :)

s.h.a.r.k 28. Aug 2012 13:00

AW: CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist!
 
Zitat:

Zitat von Sir Rufo (Beitrag 1180313)
Der Zugriff über
Delphi-Quellcode:
Form1.CRDBGrid1
ist auf jedenfall der Garant für den Knieschuss :)

No Risk, no Fun! :stupid:

Alterauge 28. Aug 2012 13:04

AW: CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist!
 
Hey, bin auch noch am lernen!
Aber es wird immer besser!

Der Zugriff über Form1.CRDBGrid1 ist auf jedenfall der Garant für den Knieschuss ??????

Wieso? Es funktioniert doch alles!

mkinzler 28. Aug 2012 13:08

AW: CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist!
 
Zitat:

Hey, bin auch noch am lernen!
Aber es wird immer besser!
Wie oft wurde dir jetzt schon der Parameter Sender genannt und was für eine Bedeutung er hat? wie oft auf Tutorials verwiesen?

Du greifst aber auf eine Komponente mit bestimmten Namen zu die direkt auf einem Formular mit einem bestimmten Namen liegt.
Anderes Formular-> peng Umbenenen Komponente oder Formular: bumm Zwischenschieben eines Contrainers: Knall.

himitsu 28. Aug 2012 13:11

AW: CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist!
 
Zitat:

Zitat von Alterauge (Beitrag 1180316)
Wieso? Es funktoniert doch alles!

Zufällig funktioniert es.

Delphi-Quellcode:
Form1.xxx
: Du bist schon in der Form-Instanz, bzw. in deren Methoden, womit du über Self, bzw ein implizites Self direkt dran kommst.

Wer sagt dir, das in der globalen Variable wirklich die Instanz drin gespeichert ist, in welcher du grade drin bist?

Vor einer Weile gab es den Fehler, daß die Form doppelt ausversehn erstellt wurde, womit die zweite Instanz in der Variable drinstand, aber die erste Instanz wurde als MainForm angezeigt.
Über Form1.CRDBGrid1 griff man dann also auf ein ganz anderes Grid zu.

CRDBGrid1 kannst du gerne verwenden, aber über den Sender ist der Code (a) wiederverwendbar und (b) gibt es weniger Probleme, wenn du der Komponente irgendwann man einen "ordentlichen" Namen geben tätest.

Alterauge 28. Aug 2012 13:14

AW: CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist!
 
Ich habe das schon verstanden!

Aber da ich nur ein Form brauche und soweit alles läuft?
Warum sollte ich es ändern?

Ich möchte nur dazu lernen!

Ok ihr habt mich überzeugt! Werde es ändern!
Danke an ALLE !

himitsu 28. Aug 2012 13:34

AW: CRDBGrid1DrawColumnCell, if true then begin, problem wenn das Grid leer ist!
 
Das Beispiel mit den mehreren Form-Instanzen vorhin war ein "Fehler". Derjenige wollte ja eigentlich auch nur ein Form verwenden.

Oder greife mal auf das Form1 im OnCreate zu .... zu diesem Zeitpunkt ist diese Variable noch nicht gesetzt wurden.


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