| Autor |
Beitrag |
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: So 27.04.03 18:52
Am besten bringe ich ein Beispiel, das ist einfacher zu verstehen:
Ich habe in einer Tabelle ein Auswahlfeld. Aus 6 verschiedenen Werten kann man einen auswählen (Radiobutton). In der DB wird das ganze dann eben als 1,2,3 usw. gespeichert. Hierbei geht es um Zeiträume, z.B. 1 = täglich, 6 = jährlich. In einem DBgrid will ich jetzt nicht 1 stehen haben, sondern eben im Klartext : täglich. Ich befürchte fast, daß das DBgrid zu starr ist und ich ein normales Grid komplett neu aufbauen muß.
_________________ Gruß
Hansa
|
|
kiwicht
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: So 27.04.03 19:56
was ist mit der Geschichte, die es mir ermöglicht, DBGrid-Felder einzufärben.
Da wird doch auch im OnBeforePaint des Grids geschaut, ob der Wert positiv ist, oder negativ, und dementsprechend die Zelle rot oder schwarz gefärbt, müsste das nicht auf deinen Fall übertragbar sein?
(ich such das mal eben, müsst sich irgendwo auf meiner Platte verstecken der Code...)
mfg
//EDIT
habs gefunden, undzwar im SwissDelphiCenter
hier der Link:
www.swissdelphicente.../showcode.php?id=884
und hier der Code:
| SWISSDELPHICENTER.COM hat folgendes geschrieben: |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| // Function to color a DBGrid (declared as private) // Funktion zum Einfärben des DBGrids (als private deklariert)
procedure TForm1.ColorGrid(dbgIn: TDBGrid; qryIn: TQuery; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var iValue: LongInt; begin // color only the first field // nur erstes Feld einfärben if (DataCol = 0) then begin // Check the field value and assign a color // Feld-Wert prüfen und entsprechende Farbe wählen iValue := qryIn.FieldByName('HINWEIS_COLOR').AsInteger; case iValue of 1: dbgIn.Canvas.Brush.Color := clGreen; 2: dbgIn.Canvas.Brush.Color := clLime; 3: dbgIn.Canvas.Brush.Color := clYellow; 4: dbgIn.Canvas.Brush.Color := clRed; end; // Draw the field // Feld zeichnen dbgIn.DefaultDrawColumnCell(Rect, DataCol, Column, State); end; end;
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin ColorGrid(DBGrid1, Query1, Rect, DataCol, Column, State); end; |
|
Was ist, wenn man jetzt in der "case"-Anweisung anstatt der Färbung hinschreibt, das er den Text in der Zelle mit einem String überschreibt?
Zur Not könntest du eine Prozedur aufrufen, die ein verstecktes Label sichtbar macht und auf die Koordinaten der Zelle verschiebt (seehr unsauber, ich weiß)...
vielleicht hilft das ja..
Moderiert von UGrohne: Quote-Tags eingefügt
|
|
grayfox
      
Beiträge: 800
win98, winXP
D4 Standard; D6 Personal
|
Verfasst: So 27.04.03 20:18
hallo hansa!
leg eine tabelle an, in welcher die zahlen von 1 bis 6 als ID und als text
täglich, usw bis jährlich steht
diese tabelle verknüpfst über den ID mit dem feld, in welchem die einträge der radiobuttons stehen und den text lässt dir in einem lookup-feld im grid anzeigen.
mfg, stefan
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 28.04.03 00:46
den Kommentar von kiwicht muß ich auswerten. Das sieht in etwa plausibel aus. LookUp-Felder sind zuviel des Guten.
_________________ Gruß
Hansa
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 28.04.03 13:18
Hat sonst jemand den von kiwicht geposteten Code ausprobiert ? Bei mir tut sich nichts. Keine Änderung zu vorher.
_________________ Gruß
Hansa
|
|
kiwicht
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mo 28.04.03 14:22
stimmt, du hast recht..
ich hab´s mal n bisschen abgewandelt:
Quelltext 1: 2: 3:
| if qHistory.FieldByName('ag').AsString = '03' then grHistory.Columns[0].Color := clGreen else grHistory.Columns[0].Color := clBlue; |
Das steht jetzt bei mir unter OnDrawDataCell. Passend zu meiner Datenbank färbt er die Felder auch dem Datenfeld "AG" entsprechend ein, es funktioniert also erstmal.
Die Frage ist jetzt nur, wie du mit dieser Methode auch den Zelleninhalt änderst kannst...
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mo 28.04.03 18:02
Hi Hansa
als Alternative zur Behandlung im OnDraw könntest du einfach hergehen, ein zusätzliches berechnetes Feld einfügen, im OnCalcField-Ereignis mit dem entsprechenden Text füllen und dieses Feld im Datengitter anzeigen.
Problematisch wirds allerdings, wenn du das Feld ändern willst. Dann bleibt dir nur der Weg über ne Lookup-Table. Wenn du die nicht direkt in deine Datenbank aufnehmen willst, kannst du die ja auch einfach im Speicher anlegen.
Letzte Alternative: ein vernünftiges Datengitter einsestzen. Meine Empfehlung dazu: www.rad-studio.com. Für InMemoryTables hat sich kbmMemTable bestens bewährt.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 28.04.03 18:08
| LCS hat folgendes geschrieben: | | ...Problematisch wirds allerdings, wenn du das Feld ändern willst... |
Ne ne, das dient nur für Anzeigezwecke. Da soll keiner dran rumfummeln. Letztendlich wars sowieso keiner.  Den Rest schnall ich aber jetzt nicht.
_________________ Gruß
Hansa
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mo 28.04.03 18:25
Am einfachsten für diese Tabelle persistente Felder anlegen, dann über Neues Feld ein Stringfeld vom Typ Calculated einfügen und im OnCalc-Event der Tabelle mit einer simplen Case-Anweisung das Feld füllen.
Ich hab auch noch irgendwo ein Programm in dem das zur Laufzeit gemacht wird. Aber das müsste ich erst mal suchen  .
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 28.04.03 19:37
Mist, diese blöden persistenten Felder. Dann muß ich den ganzen Code wieder über den Haufen schmeißen. Egal, ist ja nur ein Grid und ein paar Prozeduren. Wie wirkt sich das perstinente denn aus? Das ist eher impertinent.  Und mir läuft die Zeit davon.
| LCS hat folgendes geschrieben: | Neues Feld ein Stringfeld vom Typ Calculated einfügen und im OnCalc-Event der Tabelle mit einer simplen Case-Anweisung das Feld füllen.
|
wie, wo was ? Vermute, ich mache das in Interbase und erzeuge einen View oder so was. In der DB steht 1 und das soll dann eben zu "täglich" werden. Tja und was die Views genau machen weiß ich nicht.
Aber langsam denke ich, daß wieder mal solche "Spezialitäten" durch die starren DB-Komponenten erschwert werden. Ich glaube, es geht einfacher mit einem normalen Grid. Habe das ungute Gefühl, daß man die DB-Komponenten vergessen kann.  In diesem Bereich hat Delphi offensichtlich ein Defizit.
_________________ Gruß
Hansa
|
|
|