| Autor |
Beitrag |
Shorty
      
Beiträge: 107
Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
|
Verfasst: So 11.02.07 17:52
Moin!
Ich bin grad mit nem Freund dabei, ein Sudoku zu programmieren. Die erzeugten Zahlen werden dann in ein StringGrid geschrieben.
Jetzt müsste aber jede dritte Trennlinie dick gezeichnet sein, damit man sehen kann, wo die Blöcke begrenzt sind.
Gibt das eine Möglichkeit, das mit dem StringGrid zu realisieren?
MfG Shorty
|
|
marvin521993
      
Beiträge: 172
|
Verfasst: So 11.02.07 18:01
du kannst ja mal ein bisschen mit der option gridlinewidth rumexperimentieren
Lg
Marvin
|
|
Shorty 
      
Beiträge: 107
Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
|
Verfasst: So 11.02.07 18:06
Ne, mit GrifLineWidth werden ja immer alle Linien dicker gezeichnet, es sollen ja aber nur die Linien um einen 3x3-Block dicker werden!
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: So 11.02.07 18:11
Du musst die Linien im OnDrawCell selber nachziehen.
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
Shorty 
      
Beiträge: 107
Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
|
Verfasst: So 11.02.07 19:19
Wie zieht man das da denn nach?
Die einzige Möglichkeit, die ich wüsste, um das zu verändern, wäre:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if ARow=3 then StringGrid1.GridLineWidth:= 2; end; |
So werden aber alle Linien dicker 
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: So 11.02.07 19:22
Du musst über Canvas einfach noch ne 2. Linie mit der Dicke 1 danebenmalen.
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
Shorty 
      
Beiträge: 107
Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
|
Verfasst: So 11.02.07 19:33
Ja auf die Idee bin ich auch schon gekommen, aber sobald dann die Kästchen markiert werden, verschwindet die Linie, wäre im Notfall noch zu akzeptieren, ist aber keine optimsle Lösung...
|
|
Blawen
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: So 11.02.07 19:38
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: So 11.02.07 22:14
Hallo,
Shorty hat folgendes geschrieben: | | Ja auf die Idee bin ich auch schon gekommen, aber sobald dann die Kästchen markiert werden, verschwindet die Linie, wäre im Notfall noch zu akzeptieren, ist aber keine optimsle Lösung... |
setz StringGrid.DefaultDrawing auf False und GridLineWidth auf 0, und dann alles selbst zeichnen. Dann hast Du das Problem mit dem verschwinden der Linien nicht mehr.
Wenn man dann die Spaltenbreiten richtig setzt kann man mit zwei sich überlagernden Flächen arbeiten, die mit FillRect gezeichnet werden.
Angenommen das jeweilige Quadrat soll 40 * 40 Pixel betragen, die stärkeren Linien 3 Pixel, die anderen 1 Pixel breit sein, dann ergeben sich folgende Werte für StringGrid.ColWidths[x]:
| 3 + 40 | 1 + 40 | 1 + 40 | 3 + 40 | 1 + 40 | 1 + 40 | 3 + 40 | 1 + 40 | 1 + 40 + 3 |für die Zeilenhöhen dann entsprechend umsetzen.
Umgesetzt in Code für OnDrawCell würde das dann beispielsweise für die Zelle [0,0] so aussehen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| if (ACol = 0) and (ARow = 0) then begin StringGrid1.Canvas.Brush.Color := clRed; StringGrid1.Canvas.FillRect(Rect); StringGrid1.Canvas.Brush.Color := clYellow; StringGrid1.Canvas.FillRect(Classes.Rect(Rect.Left+3,Rect.Top+3,Rect.Right,Rect.Bottom)); end |
Wenn man nun die Bedingungen geschickt zusammenfasst ist der Rest eigentlich ganz einfach:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| if ARow = 0 then if ACol in [0,3,6] then else if ACol in [1,2,4,5,7] then else |
Eine Lösung mit verschachtelten Case-Anweisungen oder auch mittels mod sind denkbar.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Shorty 
      
Beiträge: 107
Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
|
Verfasst: Mo 12.02.07 17:40
Jo dankeschön, das sieht schonmal ganz gut aus!
Hab das alles jetzt mit ner Case-Verzweigung gezeichnet, bloß leider werden in den Feldern, die ich so anspreche, die Zahlen überzeichnet, die da eigentlich stehen sollten...
Die einzige Möglichkeit, die mir eingefallen ist, das zu umgehen, wäre, die Zahlen in OnDrawCell nochmal reinzusetzen, dann geht das aber in eine Endlosschleifen, wenn die sich im Prinzip immer selbst aufruft
Gibt das da noch eine Lösung für?
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Mo 12.02.07 19:05
Hallo,
wenn man die Zahlen mit StringGrid.Cells[c,r] := '1';innerhalb OnDrawCell einfügt hat man eine Endlos-Schleife. In OnDrawCell grundsätzlich nur zeichnen!
Wo hast Du denn Deine Zahlen, wo bzw. wie setzt Du die Zahlen ins Grid?
Etwas Code könnte weiter helfen?
Liegen sie beispielsweise in einem Array vor, dann wird so nichts überzeichnet:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| if (ACol = 0) and (ARow = 0) then begin StringGrid1.Canvas.Brush.Color := clRed; StringGrid1.Canvas.FillRect(Rect); StringGrid1.Canvas.Brush.Color := clYellow; StringGrid1.Canvas.FillRect(Classes.Rect(Rect.Left+3,Rect.Top+3,Rect.Right,Rect.Bottom)); StringGrid1.Canvas.TextOut(Rect.Left+10,Rect.Top+10,myArr[aCol,ARow]); end |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Zuletzt bearbeitet von Lannes am Mo 12.02.07 21:51, insgesamt 1-mal bearbeitet
|
|
Shorty 
      
Beiträge: 107
Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
|
Verfasst: Mo 12.02.07 21:20
Jo gut, das habe ich gesucht, den Rest bekomm ich dann noch allein hin 
|
|
Shorty 
      
Beiträge: 107
Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
|
Verfasst: Sa 24.02.07 16:48
Kommt hier nochmal ein letzter Beitrag von mir rein, falls noch jemand dasselbe Problem hat, habe nämlich bei hier bei dsdt.info eine viel einfachere Lösung gefunden!
Frage mich nur, warum ich das nicht gleich gefunden habe 
|
|
|