Autor Beitrag
Shorty
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 107

Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 172



BeitragVerfasst: So 11.02.07 18:01 
du kannst ja mal ein bisschen mit der option gridlinewidth rumexperimentieren

Lg
Marvin
Shorty Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 107

Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 107

Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 107

Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 616
Erhaltene Danke: 33

Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
BeitragVerfasst: So 11.02.07 19:38 
user profile iconShorty hat folgendes geschrieben:
Wie zieht man das da denn nach?
Die einzige Möglichkeit, die ich wüsste, um das zu verändern, wäre:
ausblenden 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 :?
Müsstest Du für die Linien 1+2 nicht wieder die Dicke zurücksetzen?

_________________
Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro ;-)
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: So 11.02.07 22:14 
Hallo,
user profile iconShorty 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if (ACol = 0) and (ARow = 0) then
  begin
  //Hintergrund-Bereich
  StringGrid1.Canvas.Brush.Color := clRed;
  StringGrid1.Canvas.FillRect(Rect);
  //innenliegende Fläche
  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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 107

Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
BeitragVerfasst: 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 :roll:

Gibt das da noch eine Lösung für?
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if (ACol = 0) and (ARow = 0) then  
  begin  
  //Hintergrund-Bereich  
  StringGrid1.Canvas.Brush.Color := clRed;  
  StringGrid1.Canvas.FillRect(Rect);  
  //innenliegende Fläche  
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 107

Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
BeitragVerfasst: Mo 12.02.07 21:20 
Jo gut, das habe ich gesucht, den Rest bekomm ich dann noch allein hin :)
Shorty Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 107

Win XP, Ubuntu 8.04
Delphi 7 Prof., Delphi 2005 Pers.
BeitragVerfasst: 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! :wink:
Frage mich nur, warum ich das nicht gleich gefunden habe :gruebel: