Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi StringGrid - dickere Trennspalte (https://www.delphipraxis.net/117139-stringgrid-dickere-trennspalte.html)

CaptainAwsome 12. Jul 2008 10:03


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:
http://rapidshare.com/files/12909071...uGenerator.rar

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;

mkinzler 12. Jul 2008 10:11

Re: StringGrid - dickere Trennspalte
 
Hänge den Quellcode doch direkt hier im Forum an deinen Beitrag an

sx2008 12. Jul 2008 10:27

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;

CaptainAwsome 12. Jul 2008 11:44

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

mkinzler 12. Jul 2008 11:49

Re: StringGrid - dickere Trennspalte
 
Selber zeichnen

CaptainAwsome 12. Jul 2008 13:15

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