Autor |
Beitrag |
Peter18
      
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Mi 26.08.09 19:37
Ein freundliches hallo an alle,
ich habe eine Excel-Tabelle erstellt, mit der man seine Termine verwalten kann. Die Tage (Zellen) werden eingefärbt, an denen Termine anstehen. Das würde ich gern in Delphi 4 abbilden und in eine Anwendung einbeziehen. Leider habe ich noch keinen Weg gefunden den Hintergrund einzelner Zellen umzufärben, DrawCell ändert die Hintergrundfarbe für das ganze Grid.
Ich hoffe jemand kann mir da weiterhelfen.
Grüße von der Nordsee
Peter Moderiert von Narses: Topic aus Datenbanken verschoben am Mi 26.08.2009 um 23:32
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 26.08.09 21:00
Peter18 hat folgendes geschrieben : | DrawCell ändert die Hintergrundfarbe für das ganze Grid. |
Schau dir die Parameter nochmal an, die du da bekommst..
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Peter18 
      
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Do 27.08.09 10:06
Xentar hat folgendes geschrieben : | Peter18 hat folgendes geschrieben : | DrawCell ändert die Hintergrundfarbe für das ganze Grid. |
Schau dir die Parameter nochmal an, die du da bekommst.. |
Hallo Xentar,
von welchen Parametern sprichst Du?? Ich habe alle Eigenschaften durchgesehen und die Onlinehilfe befragt, ohne Erfolg:
Cells
Cols
Objects
Rows
Abgeleitet von TCustomGrid
BorderStyle
Col
ColCount
ColWidths
DefaultColWidth
DefaultDrawing
DefaultRowHeight
EditorMode
FixedColor
FixedCols
FixedRows
GridHeight
GridLineWidth
GridWidth
LeftCol
Options
Row
RowCount
RowHeights
ScrollBars
Selection
TabStops
TopRow
VisibleColCount
VisibleRowCount
Abgeleitet von TCustomControl
Canvas
Abgeleitet von TWinControl
Brush
ClientOrigin
ClientRect
ControlCount
Controls
Ctl3D
Handle
HelpContext
ParentCtl3D
ParentWindow
Showing
TabOrder
TabStop
Abgeleitet von TControl
Align
BoundsRect
ClientHeight
ClientWidth
Color
ControlState
ControlStyle
Cursor
DragCursor
DragMode
Enabled
Font
Height
Hint
Left
Name
Parent
ParentColor
ParentFont
ParentShowHint
PopupMenu
ShowHint
Top
Visible
Width
WindowProc
Abgeleitet von TComponent
ComObject
ComponentCount
ComponentIndex
Components
ComponentState
ComponentStyle
DesignInfo
Owner
Tag
VCLComObject
Vielleicht muss man ja etwas weiter in die Tiefe gehen um das Problem zu lösen.
Grüße von der Nordsee
Peter
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Do 27.08.09 11:18
Ich meinte die Parameter, die in OnDrawCell übergeben werden.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Peter18 
      
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Do 27.08.09 12:49
Xentar hat folgendes geschrieben : | Ich meinte die Parameter, die in OnDrawCell übergeben werden. |
Hallo Xentar,
Der Aufruf ist:
Delphi-Quelltext 1:
| DrawCell(Col, Row, Rect, State); |
wobei Col und Row Zeilen- und Spaltenindex der Zelle enthalten und Rect den Rückgabewert von CellRect: 135,48,179,63,(135,48 ),(179,63). State ist nicht gesetzt. Color des Objektes ist auf die gewünschte Farbe gestellt.
Leider liefert die Onlinehilfe nur wenig Infos über diese Parameter, geschweige denn ein Beispiel. Wie die Parameter die Darstellung steuern konnte ich daher nicht erfahren.
Grüße von der Nordsee
Peter
|
|
SvenAbeln
      
Beiträge: 334
Erhaltene Danke: 3
|
Verfasst: Do 27.08.09 14:44
Xentar hat folgendes geschrieben : | Ich meinte die Parameter, die in OnDrawCell übergeben werden. |
Peter18 hat folgendes geschrieben : | Der Aufruf ist:
Delphi-Quelltext 1:
| DrawCell(Col, Row, Rect, State); | |
Das Ereignis OnDrawCell wird für jede einzelne Zelle aufgerufen, die neu gezeichnet werden muss. Dort kannst du dann die Zellen genau so zeichnen, wie du es gerade in deiner Anwendung brauchst.
z.B.:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var AGrid: TStringGrid; begin AGrid:= Sender as TStringGrid; if odd(ACol) then AGrid.Canvas.Brush.Color := clGreen else AGrid.Canvas.Brush.Color := clRed;
AGrid.Canvas.Rectangle(Rect); AGrid.Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, AGrid.Cells[ACol, ARow]); end; |
|
|
Peter18 
      
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Do 27.08.09 16:09
Zitat: | Das Ereignis OnDrawCell wird für jede einzelne Zelle aufgerufen, die neu gezeichnet werden muss. Dort kannst du dann die Zellen genau so zeichnen, wie du es gerade in deiner Anwendung brauchst.
z.B.:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var AGrid: TStringGrid; begin AGrid:= Sender as TStringGrid; if odd(ACol) then AGrid.Canvas.Brush.Color := clGreen else AGrid.Canvas.Brush.Color := clRed;
AGrid.Canvas.Rectangle(Rect); AGrid.Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, AGrid.Cells[ACol, ARow]); end; |
|
Danke, das hat geholfen. Zwar musste ich Rectangle mit
Delphi-Quelltext 1:
| Canvas.Rectangle(Rect.Top, Rect.Left, Rect.Bottom, Rect.Right); |
aufrufen und wahrscheinlich auch den Zellenrand noch malen, aber das sollte hinzukriegen sein.
Grüße von der Nordsee
Peter
|
|
Hobby-Programmierer
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: Do 27.08.09 23:46
Mit den 'DrawCell' Routinen die hier im Forum bereits gepostet wurden könnte man echt ein ganzes Buch füllen. Mindestens 1 mal im Monat diese Frage
Benutz die Forensuche nach 'DrawCell' und Dir wird geholfen
|
|
Peter18 
      
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Fr 28.08.09 14:24
Hallo Hobby-Programmierer,
Hobby-Programmierer hat folgendes geschrieben : | Mit den 'DrawCell' Routinen die hier im Forum bereits gepostet wurden könnte man echt ein ganzes Buch füllen. Mindestens 1 mal im Monat diese Frage
Benutz die Forensuche nach 'DrawCell' und Dir wird geholfen |
ist ja ein ganz heißer Tipp!!!
Selbstverständlich habe ich nach entsprechenden Artikeln gesucht! Nur manchmal verwendet man die falschen Stichworte oder erkennt einen passenden Artikel nur, wenn man die Lösung kennt! Manchmal ist man aber auch nur auf der falschen Spur und wird durch passende Tipps auf die richtige gebracht, so wie hier durch Xentar. Ich schreibe seit vielen Jahren Programme und hatte dabei auch Situationen, in denen ich Kollegen mein Problem schilderte und dadurch selbst auf die Lösung kam. Solche Situationen dürfte jeder der Software entwickelt irgend wann erleben.
Dein "Tipp" wäre in Ordnung, wäre unter fast gleichem Betreff kürzlich etwas gelaufen, dann hätte man von Faulheit ausgehen können. Aber wer liest schon ein ganzes Buch durch, um am Ende die Lösung zu finden (außer einem Krimi), wenn vielleicht jemand einen gezielten Tipp, vielleicht auch auf einen entsprechenden Artikel, geben kann??? Das spart Zeit und Nerven, vor allem wenn man sich schon einige Zeit im Kreis dreht.
Sollte es in diesem Forum nicht darum gehen, denen die ein Problem haben zu helfen?
Und selbst schnelle Hilfe zu erhalten, wenn man ein Problem hat?
In diesem Sinne freundliche Grüße von der Nordsee
Peter
|
|
Hobby-Programmierer
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: Fr 28.08.09 19:24
 Wenn ich mich net irre, hattest Du im ersten Text bereits 'DrawCell' selbst erwähnt. Du hättest aber auch einfach nur nach StringGrid suchen brauchen und wärst spätestens jetzt fündig geworden. Aber hast schon recht, ist einfacher zu fragen als selbst zu suchen - vor allem wenn man sich noch nebenbei im Kreis dreht  !
Aber jetzt zurück zum Thread ...
Delphi-Quelltext 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:
| procedure TForm1.SG1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); const tFormat = DT_SINGLELINE or DT_CENTER or DT_VCENTER; var tText: String; begin with (Sender as TStringGrid) do begin tText:= Trim(Cells[ACol, ARow]); if (gdFixed in State) then begin Canvas.Brush.Color:= clBtnFace; end else if (gdSelected in State) then begin Canvas.Brush.Color:= clHighlight; Canvas.Font.Color:= clBlack; end else begin if tText = '2' then Canvas.Brush.Color:= clgreen else Canvas.Brush.Color:= clWindow;
end; Canvas.FillRect(Rect); DrawText(Canvas.Handle, PChar(tText), Length(tText), Rect, tFormat); end; end; |
Als erfahrener Programmierer weisst Du ja das man die Prozedur noch mit dem Event des SG verbinden muss. Zum Testen Delphi-Quelltext 1: 2:
| SG1.Cells[2,2]:= '2'; SG1.Cells[0,2]:= 'test'; |
|
|
|