![]() |
StringGrid - dickere Trennspalte
Ich habe ein Generator für 9x9 Sudokus programmiert.
Die Zahlen werden in eine 9x9 StringGrid geschrieben. Wie kann ich einzelne Trennlinien dicker machen? Also so, dass die Stringgrid in 3x3 Quadrate unterteilt wird die wiederrum aus 3x3 Zahlenfelder bestehen. Ich weiß, dass man mit GridLineWidth die Zeilenstärke ändern kann, aber das bringt mich nicht weiter. Dann wäre es auch noch gut wenn man die StringGrid abkopieren könnte, nachdem sie mit dem Sudoku gefüllt wurde. Gibt es dafür einen Wert den man auf True oder so setzten muss? Gut wäre wenn es mit strg+c gehen würde, besser wenn zusätzlich auch mit einem rechtsklick-Menü. Momentan kann man nicht mal mehr markieren, da ich goEditing auf True habe. Programm mit Quellcode: ![]() Ich hoffe ich hab mich verständlich ausgedrückt und mir kann jemand helfen
Delphi-Quellcode:
procedure Sudokucreate;
var i,j,k,IFehler:integer; number,col,col2,row,posi,rnd,c:integer; SmZ:string; //mögliche Reihen Bgeloest:boolean; begin randomize; Bgeloest := false; // Sudoku wurde noch nicht erstellt IFehler := 0; // bisher kein Fehler aufgetaucht while Bgeloest = false do // solang Sudoku fehlerfrei erstellt wurde begin for i := 0 to n-1 do // füllt alle Felder der StringGrid mit 'N' begin for j := 0 to n-1 do Form1.StringGrid1.Cells[i,j]:='N'; end; for number := 1 to n do // 1-9 wird begin // in eine zufällige Reihe der ersten Spalte geschrieben, for col := 0 to n-1 do // dann in die zweite Spalte usw. begin SmZ :=''; for k := 0 to n-1 do SmZ:=SmZ+ inttostr(k); // mögliche Zufallsreihe ist ohne Überprüfung immer die 1.-9. for row := 0 to n-1 do // es werden alle Zellen der aktuellen Spalte überprüft, begin // ob schon eine Zahl reingeschrieben wurde if Form1.StringGrid1.Cells[col,row]<>'N' then begin posi := pos(inttostr(row),SmZ); // wenn ja wird die Reihe aus den möglichen delete(SmZ,posi,1); // Reihen gelöscht end; {if-bedingung} end;{row-schleife} if col > 0 then // es wird überprüft ob in der Reihe die Zahl schon vorhanden ist begin // wenn ja, wird die Reihe aus den mögliche Reihen gelöscht for col2 := 0 to col-1 do begin for row := 0 to n-1 do begin if Form1.StringGrid1.Cells[col2,row] = inttostr(number) then begin posi := pos(inttostr(row),SmZ); delete(SmZ,posi,1); end {if Zelleninhalt=number} end;{row-schleife} end;{col2-schleife} end;{if col>0} case col of 0..2: c := 0; 3..5: c := 3; 6..8: c := 6; end; for col2 := c to c+2 do // es wird überprüft ob im Quadrat die Zahl schon vorhanden ist begin // wenn ja, wird die Reihe aus den mögliche Reihen gelöscht for row := 0 to n-1 do begin if Form1.StringGrid1.Cells[col2,row] = inttostr(number) then begin case row of 0..2: begin for i := 0 to 2 do begin posi := pos(inttostr(i),SmZ); delete(SmZ,posi,1); end; end; 3..5: begin for i := 3 to 5 do begin posi := pos(inttostr(i),SmZ); delete(SmZ,posi,1); end; end; 6..8: begin for i := 6 to 8 do begin posi := pos(inttostr(i),SmZ); delete(SmZ,posi,1); end; end; end; end;{if gleiche nummer in stringgridzelle} end; {row-schleife} end; {col2-schleife} If Length(SmZ) > 0 then // wenn in einer Spalte keine Reihe mehr möglich ist, begin // tritt ein Fehler auf und es wird nochmal versucht ein Sudoku zu erstellen rnd := random(Length(SmZ))+1; // Wenn kein Fehler auftritt wird die Zahl in die aktuelle Spalte in row := strtoint(SmZ[rnd]); // die zufällige Reihe geschrieben Form1.StringGrid1.Cells[col,row] := inttostr(number) end else begin IFehler := IFehler+1; end; end; {col-schleife} end; {number-schleife} If IFehler = 0 then Bgeloest := true else IFehler := 0; end; {Bgeloest} end; |
Re: StringGrid - dickere Trennspalte
Hänge den Quellcode doch direkt hier im Forum an deinen Beitrag an
|
Re: StringGrid - dickere Trennspalte
Hier mal eine Prozedure, wie du das ganze StringGrid in die Zwischenablage kopieren kannst.
Es werden Tabulator und CR/LF als Tennzeichen verwendet. Das ist bei der Zwischenablage so üblich und du kannst dein Sudoku z.B. direkt in Excel oder WinWord einfügen. Ich habe den Sourcecode nicht getestet; also wenn ein Problem auftritt, dann versuche das bitte zuerst selber zu beheben. Wenn du nicht weiterkommst kannst du aber gerne fragen.
Delphi-Quellcode:
uses Clipbrd;
procedure TForm1.GridToClipBoard; var s : string; x, y : integer; begin s := ''; for y := 0 to StringGrid1.Rows-1 do begin for x := 0 to StringGrid1.Cols-1 do begin Result := result + StringGrid1.Cells[x,y]; if x <> 0 then Result := Result + #9; // Tabulator anhängen end; Result := Result + #13#10; // CR/LF anhängen end; ClipBoard.AsText := s; // in Zwischenablage schreiben end; |
Re: StringGrid - dickere Trennspalte
danke das mit der kopier-methode funktioniert nach ein paar kleinen anpassungen :dp:
jetzt brauch ich nur noch hilfe bei den trennlinien :D |
Re: StringGrid - dickere Trennspalte
Selber zeichnen
|
Re: StringGrid - dickere Trennspalte
ok danke habs hinbekommen =D
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); begin if (ARow = 2) or (ARow = 5) then with StringGrid1.Canvas do begin Pen.Color := clBlack; Pen.Width := 2; Pen.Style := psSolid; MoveTo(Rect.left-1, Rect.Bottom); Lineto(Rect.right-1, Rect.Bottom); end; if (ACol = 2) or (ACol = 5) then with StringGrid1.Canvas do begin Pen.Color := clBlack; Pen.Width := 2; Pen.Style := psSolid; MoveTo(Rect.right-1, Rect.Bottom); Lineto(Rect.right-1, Rect.Top); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz