Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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 user profile iconNarses: Topic aus Datenbanken verschoben am Mi 26.08.2009 um 23:32
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mi 26.08.09 21:00 
user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Do 27.08.09 10:06 
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Do 27.08.09 11:18 
Ich meinte die Parameter, die in OnDrawCell übergeben werden.

_________________
PROGRAMMER: A device for converting coffee into software.
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Do 27.08.09 12:49 
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Ich meinte die Parameter, die in OnDrawCell übergeben werden.


Hallo Xentar,

Der Aufruf ist:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Do 27.08.09 14:44 
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Ich meinte die Parameter, die in OnDrawCell übergeben werden.

user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
Der Aufruf ist:
ausblenden 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.:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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.:
ausblenden 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
ausblenden 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. :D :idea: :D

Grüße von der Nordsee

Peter
Hobby-Programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 238
Erhaltene Danke: 4

Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
BeitragVerfasst: 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 :roll:
Benutz die Forensuche nach 'DrawCell' und Dir wird geholfen
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Fr 28.08.09 14:24 
Hallo Hobby-Programmierer,

user profile iconHobby-Programmierer hat folgendes geschrieben Zum zitierten Posting springen:
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 :roll:
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 238
Erhaltene Danke: 4

Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
BeitragVerfasst: 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 :dance2: !

Aber jetzt zurück zum Thread ...
ausblenden 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]); // Text der Zelle
    if (gdFixed in State) then begin // feste Zelle?
      Canvas.Brush.Color:= clBtnFace; // HintergrundFarbe

      end else if (gdSelected in State) then begin // markierte Zelle
      Canvas.Brush.Color:= clHighlight;  // HintergrundFarbe 
      Canvas.Font.Color:= clBlack;       // Schriftfarbe

     end else begin // normale Zelle    
      if tText = '2' then Canvas.Brush.Color:= clgreen  // hier ein Beispiel wie Du eine Zelle anhand
  //    ...                                                von Auswahlkriterien färben kannst
  //    ...
       else
        Canvas.Brush.Color:= clWindow;

    end// <> (gdFixed in State)
    Canvas.FillRect(Rect);  // Hintergrund zeichnen
    DrawText(Canvas.Handle, PChar(tText), Length(tText), Rect, tFormat); // Textausgabe
  end// with
end;


Als erfahrener Programmierer weisst Du ja das man die Prozedur noch mit dem Event des SG verbinden muss. Zum Testen
ausblenden Delphi-Quelltext
1:
2:
  SG1.Cells[2,2]:= '2';
  SG1.Cells[0,2]:= 'test';