Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Kollison OnDrawColumnCell und Anzeige in DBText (https://www.delphipraxis.net/17787-kollison-ondrawcolumncell-und-anzeige-dbtext.html)

cs_ii 9. Mär 2004 20:15


Kollison OnDrawColumnCell und Anzeige in DBText
 
so ich hoffe mal mir kann hier geholfen werden *hoff hoff* .
folgendes problem:

ich habe eine dbgrid mit ner menge daten drin. je nachdem welchen wert ein bestimmtes datenfeld hat wird die textfarbe in dieser zeile verändert. gleichzeitig ist es aber notwendig beim wechsel das datensatzes in der tabelle die daten in dbtext-feldern außerhalb der dbgrid anzeigen zu lassen... nur genau das funktioniert nicht, wenn ondrawcolumncell verwendet wird. beim wechsel wird einfach nichts angezeigt.

wie kann ich das umgehen oder anders lösen? :gruebel:

grayfox 10. Mär 2004 00:25

Re: Kollison OnDrawColumnCell und Anzeige in DBText
 
hallo cs_ii!

zunächst mal ein willkommen im forum! :hello:

Zitat:

gleichzeitig ist es aber notwendig beim wechsel das datensatzes in der tabelle die daten in dbtext-feldern außerhalb der dbgrid anzeigen zu lassen
hmm... sobald das dbgrid und die dbedit-felder an der selben datensource hängen, werden sie doch automatisch beim datensatzwechsel aktualisiert. ich kann mir nicht vorstellen, wieso ondrawcolumncell da dran was ändern sollte.

poste mal den sourcecode vom felderanmalen...

mfg, stefan

cs_ii 11. Mär 2004 17:39

Re: Kollison OnDrawColumnCell und Anzeige in DBText
 
hallihallo stefan!

tja ich hab mal einen bekannten programmierer gefragt, der meinte, so geht das nich, weil ondrawcolumncell ständig erneut aufgerufen wird und die datenbankkomponenten da nicht hinterher kommen. ich versteh es auch nicht so recht :wiejetzt:

hier ist der quelltext:

if Column.FieldName = 'Code' then
begin
if Table1.FieldByName('Codec').AsString = 'DivX' then Column.Font.Color := clred
else if Table1.FieldByName('Codec').AsString = 'SVCD' then Column.Font.Color := clnavy
else if Table1.FieldByName('Codec').AsString = 'VCD' then Column.Font.Color := clpurple;

vielleicht hat ja doch jemand eine lösung !?

mfg, claudia

grayfox 11. Mär 2004 19:08

Re: Kollison OnDrawColumnCell und Anzeige in DBText
 
hallo claudia!

versuchs mal so:

Delphi-Quellcode:
procedure DBGrid1.DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  aValue: string;
begin
  if (gdSelected in State) or (gdFocused in State) then exit;

  if Column.Index = 3 then begin {nummer der spalte im dbgrid}
    aValue:= Column.Field.asString; {suchbegriff auslesen}
    if aValue = 'SVCD' then begin
      DBGrid1.Canvas.Brush.Color := clBlue;
      DBGrid1.Canvas.Font.Color := clYellow
    end else begin
      DBGrid1.Canvas.Brush.Color := clPurple;
      DBGrid1.Canvas.Font.Color := clWhite
    end;
  DBGRid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
bei der obigen lösung darfst du aber die spalte nicht verschieben ;)

besser:

Delphi-Quellcode:
 if Column.Fieldname = 'Codec' then begin
dann bleibt die reihenfolge der spalten im dbgrid egal.

zu der anzeige im dbedit-feld kann ich mich nur wiederholen...
sobald das dbgrid und das dbedit-feld an der gleichen datasource hängen, dann aktualisiert es sich
selbständig.
schau mal lieber nochmal nach, was du in deinem dbedit-feld als datasource eingetragen hast :gruebel:

liebe grüsse & gutes gelingen
stefan

cs_ii 11. Mär 2004 21:26

Re: Kollison OnDrawColumnCell und Anzeige in DBText
 
ich werde deinen quelltext mal ausprobieren. aber das einfärben hat auch mit meinem geklappt...

zur anzeige in dbtext:
wenn ich den quellcode in dem ereignis ausklammer werden die daten angezeigt. also kann es nich an der verknpüfung über datasource mit der db liegen. mir is das alles sehr sehr schleierhaft! :x

grayfox 12. Mär 2004 08:48

Re: Kollison OnDrawColumnCell und Anzeige in DBText
 
hallo claudia!

Zitat:

wenn ich den quellcode in dem ereignis ausklammer
und wie sieht der quellcode in dem ereignis aus? :gruebel:
nachdem sich der fehler nicht zeigt, wenn du ihn ausklammerst, muss darin irgendwas schieflaufen.
kopierst ihn ins forum und schauen wir ihn uns gemeinsam an? ;)

mfg, stefan

cs_ii 12. Mär 2004 22:18

Re: Kollison OnDrawColumnCell und Anzeige in DBText
 
der text in dem ereignis ist der, der in meinem ersten beitrag steht.
aber hier is er nochmal :lol: :

if Column.FieldName = 'Code' then
begin
if Table1.FieldByName('Codec').AsString = 'DivX' then Column.Font.Color := clred
else if Table1.FieldByName('Codec').AsString = 'SVCD' then Column.Font.Color := clnavy
else if Table1.FieldByName('Codec').AsString = 'VCD' then Column.Font.Color := clpurple;


hab deinen ausprobiert, aber der macht nich genau das was ich möchte... ich versuch ihn morgen mal umzumodeln um zu sehen obs dann funktioniert... :coder:

bis dahin

grayfox 13. Mär 2004 13:40

Re: Kollison OnDrawColumnCell und Anzeige in DBText
 
hallo claudia!

so schnell liest man sich wieder ;)
Zitat:

hab deinen ausprobiert, aber der macht nich genau das was ich möchte
das verstehe ich nicht, denn deine anfrage war:
Zitat:

je nachdem welchen wert ein bestimmtes datenfeld hat wird die textfarbe in dieser zeile verändert.
und genau das macht der code, den ich in meinem ersten beitrag gepostet habe. hast ihn kopiert oder abgetippt? :gruebel:

Zitat:

aber hier is er nochmal
ich dachte, dass sich in deiner umfärbeprocedure noch mehr code befinden würde...
bei deiner variante könnte ich mir vorstellen, dass die färbliche markierung beim nächsten OnDrawColumnCell-ereignis wieder rückgängig gemacht wird, bzw das grid den text weiss auf weiss darstellt, da sie immer nur die aktuelle zelle betrachtet und nicht das ganze datengitter.

Zitat:

beim wechsel wird einfach nichts angezeigt.
meinst du damit im dbgrid oder in den dbedit-feldern?

man liest sich? :mrgreen:
stefan

cs_ii 14. Mär 2004 17:23

Re: Kollison OnDrawColumnCell und Anzeige in DBText
 
hallöchen stefan!

also nochmal das ganze:

in der dbgrid werden die farben definitv richtig gemacht so wie ich das programmiert habe. nur leider werden dann die daten beim wechsel das satzes in der dbgrid in den dbtext-feldern nicht richtig aktualisiert. ich könnte mir jetz nur vorstellen dass es daran liegt, dass ich bei Ondrawcolumncell auf die db über "table1.fieldbyname..." zugreife.

ich hatte deinen code kopiert und er hat mir alles die gleiche farbe gemacht... dann hab ich ihn ein wenig geändert, aber auch da ging es nicht. ich habe heute zeit und werde mir die sache nochmal ansehen... irgendwie muss das doch zu lösen sein *grummel*!!! :wall:

grayfox 14. Mär 2004 21:27

Re: Kollison OnDrawColumnCell und Anzeige in DBText
 
hallo claudia!

so, jetzt bin ich wieder am laufenden ;)
ich kann dich beruhigen, der feldzugriff mittels FieldByName in der procedure OnDrawColumnCell
ist sicherlich nicht schuld daran, dass die dbedit-felder nicht aktualisiert werden.
nachdem die aufklärung des phänomens im forum etwas mühsam ist, mach ich dir den vorschlag,
mir den quellcode, mittels pm, zu schicken. dann seh ich mir das mal aus der nähe an.
apropos... welche delphi-version verwendest du eigentlich?

lg, stefan

cs_ii 14. Mär 2004 21:52

Re: Kollison OnDrawColumnCell und Anzeige in DBText
 
ich kanns dir ja mal zuschicken :-D.
ich verwende delphi 7.
aber was is pm?

lg claudia

grayfox 14. Mär 2004 23:42

Re: Kollison OnDrawColumnCell und Anzeige in DBText
 
hallo nochmal! :zwinker:

also dein programm-problem hat mir keine ruhe gelassen, deshalb hab ich deine version nachgebaut. und siehe da, die dbeditfelder werden ebenfalls beim datensatzwechsel aktualisiert. nur ist mir aufgefallen, dass die anzeie flackert. das rührt daher, da du im OnDrawEvent des grids die zelleninhalte änderst und nicht die farbe vorgibst, in welcher sie gezeichnet werden sollen.
ich hängt dir meinen programmcode an - im OnShowEvent der form stehen die verknüpfungen zwischen der datasource und den dbeditfeldern im langtext - nur zur demonstration, da ich dort den fehler vermute.
Delphi-Quellcode:
unit Mainprog;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  DBCtrls, Grids, DBGrids, ExtCtrls, Db, DBTables, Menus, StdCtrls, Mask,
  Buttons;

type
  TMainDlg = class(TForm)
    MainMenu1: TMainMenu;
    Programm1: TMenuItem;
    About1: TMenuItem;
    Beenden1: TMenuItem;
    Tabelle1: TMenuItem;
    oeffnen: TMenuItem;
    schliessen1: TMenuItem;
    N1: TMenuItem;
    anlegen1: TMenuItem;
    aTable: TTable;
    DataSource1: TDataSource;
    Panel1: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Panel2: TPanel;
    DBGrid1: TDBGrid;
    Label2: TLabel;
    DBEdit2: TDBEdit;
    DBNavigator1: TDBNavigator;
    Label3: TLabel;
    DBEdit3: TDBEdit;
    Label4: TLabel;
    OpenBtn: TSpeedButton;
    CloseBtn: TSpeedButton;
    BitBtn1: TBitBtn;
    procedure Beenden1Click(Sender: TObject);
    procedure anlegen1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
    procedure OpenBtnClick(Sender: TObject);
    procedure oeffnenClick(Sender: TObject);
    procedure CloseBtnClick(Sender: TObject);
    procedure schliessen1Click(Sender: TObject);
    procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
  private
    { Private-Deklarationen }
    aDatenDir: String;
  public
    { Public-Deklarationen }
  end;

var
  MainDlg: TMainDlg;

implementation

{$R *.DFM}

procedure TMainDlg.Beenden1Click(Sender: TObject);
begin
  close;
end;

procedure TMainDlg.anlegen1Click(Sender: TObject);
var
  tmpTable: TTable;
  TextToShow: String;
begin
  tmpTable:= TTable.Create(self);
  try
    with tmpTable do begin
      DatabaseName:= aDatenDir + 'Daten';
      Tablename:= 'TestTable.DB'
    end;

    tmpTable.Close;
    if tmpTable.Exists then begin
      TextToShow:= Format('Die Tabelle %s ist bereits angelegt' + #13#10
        + 'Soll sie überschrieben werden?',[tmpTable.Tablename]);
      if MessageDlg(TextToShow,mtConfirmation,[mbOk,mbCancel],0)= mrCancel then
        Exit;
    end;

    with tmpTable do begin
      with FieldDefs do begin
        Clear;
        Add('ID',ftAutoInc,0,true);
        Add('Codec',ftString,10,true);
        Add('Bemerkung',ftString,30,false)
      end;
      with IndexDefs do begin
        Clear;
        Add('','ID',[ixPrimary, ixUnique])
      end;
      CreateTable;
    end;
    ShowMessage('die Tabelle wurde erfolgreich angelegt');
  finally
    tmpTable.Close;
    tmpTable.Free;
  end;
end;

procedure TMainDlg.FormCreate(Sender: TObject);
begin
  aDatenDir:= ExtractFilePath(ParamStr(0));
  Label4.Caption:= aDatenDir;
end;

procedure TMainDlg.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  aTable.Close
end;

procedure TMainDlg.FormShow(Sender: TObject);
begin
  DBEdit2.DataSource:= DataSource1;
  DBEdit2.DataField:= 'Codec';
  DBEdit3.DataSource:= DataSource1;
  DBEdit3.DataField:= 'Bemerkung'
end;

procedure TMainDlg.OpenBtnClick(Sender: TObject);
begin
  if not aTable.Active then
    aTable.Open
end;

procedure TMainDlg.oeffnenClick(Sender: TObject);
begin
  if not aTable.Active then
    aTable.Open
end;

procedure TMainDlg.CloseBtnClick(Sender: TObject);
begin
  aTable.Close
end;

procedure TMainDlg.schliessen1Click(Sender: TObject);
begin
  aTable.Close
end;

procedure TMainDlg.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  aValue: string;
begin
  if (gdSelected in State) or (gdFocused in State) then exit;

  if Column.Index = 1 then begin {nummer der spalte im dbgrid}
    aValue:= Column.Field.asString; {suchbegriff auslesen}
    if aValue = 'DivX' then begin
      DBGrid1.Canvas.Font.Color := clYellow;
      DBGrid1.Canvas.Brush.Color := clRed
    end else if aValue = 'SVCD' then begin
      DBGrid1.Canvas.Font.Color := clYellow;
      DBGrid1.Canvas.Brush.Color := clNavy
    end else if aValue = 'VCD' then begin
      DBGrid1.Canvas.Font.Color := clWhite;
      DBGrid1.Canvas.Brush.Color := clPurple
    end else begin
      DBGrid1.Canvas.Font.Color := clBlack;
      DBGrid1.Canvas.Brush.Color := clwhite
    end;
  end;

  DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

end.
pm = private message
einfach auf meinen nick klicken, 'private nachricht' auswählen und dein projekt gezippt als attachment anhängen. (die exe & dcu bitte nicht mitschicken)
ich hab zwar nur delphi 4, aber solange du keine exotischen befehle und/oder komponenten verwendest, sollte ich mit deiner version arbeiten können ;)

lg, stefan

cs_ii 15. Mär 2004 11:14

Re: Kollison OnDrawColumnCell und Anzeige in DBText
 
:hello:

SUUUUUUUUUUUUUUUUUPER! es funktioniert... ich danke dir... spitze!
ich zweifel zwar jetzt an meinem verstand, weil sooo schwer is das ja gar nicht :gruebel: aber ich bin froh, dass es endlich klappt.
nochmal ganz vielen dank!!!

grayfox 15. Mär 2004 21:12

Re: Kollison OnDrawColumnCell und Anzeige in DBText
 
hallo claudia!

freut mich echt, dass es dir doch noch gelungen ist, dein dbgrid so hinzukriegen, wie du es haben wolltest ;)
jetzt brauchst nur noch zu sagen, dass meine vermutung mit der datasource bei den dbedit-feldern richtig war, dann freut es mich umso mehr :mrgreen:
und falls doch nicht, wo lag dann das problem versteckt?

lg, stefan

cs_ii 16. Mär 2004 17:18

Re: Kollison OnDrawColumnCell und Anzeige in DBText
 
hallo!

also der datasource in den dbtext-feldern war richtig... daran lag es nicht... ich hab mir deinen quellcode genommen, ihn ein wenig geändert und dann ging es ganz so wie es gewünscht war...

also nochmal eine ganz großes DANKE :thuimb:

Delphi_Fanatic 9. Sep 2004 14:48

Re: Kollison OnDrawColumnCell und Anzeige in DBText
 
(An dieser Stelle mal ein grosses Lob an die Betreiber dieses Forums und an dejenigen, die sich hier aktiv mit hilfreichen Antworten beteiligen.

Gerade wollte ich in einem DBGrid dafür sorgen, dass in bestimmten Zellen in Abhängigkeit von bestimmten Werten diese Zellen mit unterschiedlichen
Farben unterlegt werden.

Da hab' ich "OnDrawColumnCell" bei google eingegeben, bin gleich auf diesen Thread hier vom März diesen Jahres gestossen und hab' hinterher nicht mal mehr eine halbe Minute gebraucht, um mein Problem zu lösen. Also schneller kann einem wirklich nicht mehr geholfen werden ... :-D 8) :thumb: Ein tolles 'Nachschlage-Werk' ist das hier ... :zwinker: )


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