Autor Beitrag
Lynx
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 05.04.05 02:24 
Hallo erstmal zusammen.

Kann sein das ich vor lauter Bäumen den Wald nicht sehe. Wäre toll wenn mir jemand auf die Sprünge helfen könnte.

Grundsätzlich geht es um Folgendes:
Ich möchte in einem normalen StringGrid in eine Zelle klicken und diese Zelle (un x Zellen direkt darunter) sollen die Farbe ändern.

Ich hab mir mal ne einfache Funktion gebastelt mit der ich grad rumteste.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.StringGrid1DrawColor(Sender: TObject; ACol,
 ARow: Integer);
 var
 rect : TRect;
begin
  rect := StringGrid1.CellRect(ACol,ARow);  //hier färb ich die angeklickte Zelle rot bzw. versuche es
  StringGRid1.Canvas.Brush.Color := clRed;
  StringGRid1.Canvas.FillRect(Rect);

  rect := StringGrid1.CellRect(ACol,ARow+1); //und hier ist die darunter die sich auch wie gewünscht färbt
  StringGRid1.Canvas.Brush.Color := clRed;
  StringGRid1.Canvas.FillRect(Rect);
.....


Mein Problem bei der ganzen Sache ist jetzt, das die darunter liegende Zelle(n) zwar rot gefärbt wird wie gewünscht aber die Zelle die ich angeklickt habe, bleibt (in meinem Fall) grau (RowSelect ist aus). :(
Muss ich irgendwo in den Optionen des Grid noch was umstellen oder warum wehrt er sich die selektierte Zelle ebenfalls einzufärben?
In der Funktion "OnSelectCell" des Grids ruf ich auch nur meine Funktion auf und sonst mach ich nix.

Wenn mir jemand einen guten Tipp geben könnte wäre ich äußerst dankbar!

Gruß Lynx

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.
espen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 90
Erhaltene Danke: 1


D6 Prof./D7 Prof. MSSQL, MySQL
BeitragVerfasst: Di 05.04.05 09:45 
Kuckuck...

Ich glaube, da fehlt ein:
StringGRid1.DefaultDrawing := False;

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.StringGrid1DrawColor(Sender: TObject; ACol, ARow: Integer);
var
  rect  : TRect;
begin
  rect := StringGRid1.CellRect(aCol, aRow);
  StringGRid1.Canvas.Brush.Color := clRed;
  StringGRid1.Canvas.FillRect(Rect);

  rect := StringGrid1.CellRect(ACol,ARow+1); //und hier ist die darunter die sich auch wie gewünscht färbt
  StringGRid1.Canvas.Brush.Color := clRed;
  StringGRid1.Canvas.FillRect(Rect);

  StringGRid1.DefaultDrawing := False;
end;


Gruss
Lynx Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 05.04.05 09:57 
Hi espen!

Ich sage: Danke, danke, danke! :P
Nicht nur das das die Lösung ist, sondern das ich sie direkt nach dem Aufstehen bekomme, find ich super! :flehan: :P

War wohl doch so spät das der Wald unsichtbar geworden ist. :wink:

Gruß Lynx
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Di 05.04.05 16:05 
und das soll wirklich funktionieren?

Die Zellen werden beim ondrawcell-ereignis gezeichnet, sonst nirgends. Im Obigen code verstehe ich darwcolor nicht, da es so etwas iom grid nicht gibt und was soll der Sender-Parameter? Wenn du diese drawcolor-methode irgendwo aufrufst: dann scoll mal dein grid oder leg ein anderes Fenster davor: und alles ist weg. durch das defaultdrawing bist du selbst fürs komplette Zeichnen verantwortlich, wenn du kein ondrawcell hast, wird auch nichts gezeichnet.


Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Lynx Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 05.04.05 19:10 
Hi Keldorn

Du hast natürlich recht. Es gibt kein "DrawColor" im Grid. Ich hab das "DrawCells" nur abgewandelt und die Parameter die ich nicht brauchte rausgelassen (mich hat zum Testen nur Spalte und Zeile interessiert, war so ne "mitten in der Nacht probier ich das und das noch aus Aktion ;)" )

Mir ging es zu der frühen Morgenstunde eigentlich nur darum von einer Zelle die ich anklicke, abwärts x Zellen farbig zu markieren. Allerdings ist/war der Hintergedanke, dies auch über mehrere Cols zu ermöglichen (z.B. Col 1 sollen ab Raw 4 markiert werden und beim Klick in Col 6 ab Raw 8. Da wo man eben als nächstes hinklickt.)

Mein Problem dabei war gestern Nacht nur grundsätztlich das er die "angeklickte" Zelle nicht markiert hat sondern nur die folgenden.

Außerdem ist natürlich auch richtig, das wenn ich nen anderes Fenster drüber lege oder das Formular minimiere etc. nix mehr da ist (bzw. teilweise).

Mich hat also eigentlich nur interessiert wir ich das selektierte Feld auch mal rot "bemalt" bekomme.

Aber da ich schon mal wieder hier bin gleich noch ne Frage hinterher ;)

Ich nutze ein Grid mit 7 Cols und 96 Rows, die eine Zeittafel (15 Minuten Einheiten über 24 Stunden ) für 7 verschiedene Zimmer abbildet.
Nun möchte ich Zeitfenster von 1 Stunde bis 1,5 Stunden in dieser Tafel eintragen (das wären dann die frabig markierten Felder) indem ich die Zeit auswähle und auf eine Anfangszeit klicke. Dies muss natürlich auch für die restlichen 6 Zimmer zur gleichen Zeit oder zeitversetzt möglich sein (so weit hab ich das auch).

Meine Frage wäre nun, da ich die belegten Felder ja irgenwo zwischenspeichern muss (Daten, wie 1 oder 1,5 Stunden, Name (der wird auch angezeigt)...) damit sie beim automatischen Neuzeichnen der Zellen wieder sichtbar werden, was würdet ihr vorschlagen?
Ich nutze momentan ein identisches 2tes Grid (i.f. "Datengrid") und speichere dort in jeder Zelle die Daten Sobald man im ersten Grid einen Eintrag durch klicken vornimmt und verweise beim Neuzeichnen des "optischen" Grids auf das Datengrid. Sind Daten in der aktuellen Zelle vorhanden, dann auswerten und je nachdem im optischen Grid (Benutzeroberfläche) darstellen.

Scheint mir ne ziemlich "schräge" Lösung zu sein aber ich brauchte mal auf die Schnelle was das funktioniert. :roll:

Wenn jemand ne bessere Idee hat, zur Datenhaltung des Grids das als Benutzeroberfläche dient, würd ich mich freuen. :)

Sry, wenn meine Schreiberei grad nen bissle verwirrend ist aber ich versteh mich heut schon den ganzen Tag selbst nicht. Vielleicht sollt ich mal schlafen :roll:

Gruß Lynx
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Di 05.04.05 20:27 
user profile iconLynx hat folgendes geschrieben:

Mein Problem dabei war gestern Nacht nur grundsätztlich das er die "angeklickte" Zelle nicht markiert hat sondern nur die folgenden.

liegt wahrscheinlich an am falschen Ereignis onselectcell. Das ist dafür da, die Selection zu erlauben oder nicht. nicht unbedingt dazu, herauszubekommen, ob der user Zelle xy ausgewählt hat. Außerdem wird es vor der Auswahl der neuen Zelle ausgelöst, die paramter acol und row enthalten die neue Zelle, stringgrid.col un d.row die alte. Wenn du deinen Farbcode in onselectcell stehen hast passiert nur das:
- onselect wird aufgerufen, dort rufst du drawcolor auf und zeichnest die neue Zelle rot.
- nach onselectcell wird die neue Zelle erst wirklich ausgewählt und die Zelle muß neu gezeichnet werden -> damit verschwindet dein rot wieder.
Die Zelle ist schon rot, zumindestens für einen klitzekleinen Bruchteil, mußt bloß schnell mit guggen sein :mrgreen:
Wenn defaultdrawing true ist, bist du selbst fürs Zeichnen verantwortlich. Da du aber nichts zeichnest, bleibt das grid so wie es ist und es sieht scheinbar nach der Lösung aus, ist es aber nicht.


user profile iconLynx hat folgendes geschrieben:

Mich hat also eigentlich nur interessiert wir ich das selektierte Feld auch mal rot "bemalt" bekomme.

wie du zellen im grid selbst mit ondrawcell zeichnest, findest du zu hauf im Forum, einfach suchen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
proc ondrawcell...
  with sender as Tstringgrid do begin    
    ...
    if gdselected in state then canvas.brush.color:=clred;
    canvas.fillrect(rect);
    ...


user profile iconLynx hat folgendes geschrieben:


Scheint mir ne ziemlich "schräge" Lösung zu sein aber ich brauchte mal auf die Schnelle was das funktioniert. :roll:

Wenn jemand ne bessere Idee hat, zur Datenhaltung des Grids das als Benutzeroberfläche dient, würd ich mich freuen. :)

irgendwo mußt du deine Daten halten, aber ein 2. Grid ist nicht so ideal. Wenn du noch nicht so vertraut bsit, wäre ein zweidimensionales Array was für dich.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)