AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi StringGrid - dickere Trennspalte
Thema durchsuchen
Ansicht
Themen-Optionen

StringGrid - dickere Trennspalte

Ein Thema von CaptainAwsome · begonnen am 12. Jul 2008 · letzter Beitrag vom 12. Jul 2008
Antwort Antwort
CaptainAwsome

Registriert seit: 12. Jul 2008
8 Beiträge
 
#1

StringGrid - dickere Trennspalte

  Alt 12. Jul 2008, 10:03
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]<>'Nthen
          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;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: StringGrid - dickere Trennspalte

  Alt 12. Jul 2008, 10:11
Hänge den Quellcode doch direkt hier im Forum an deinen Beitrag an
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

Re: StringGrid - dickere Trennspalte

  Alt 12. Jul 2008, 10:27
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;
  Mit Zitat antworten Zitat
CaptainAwsome

Registriert seit: 12. Jul 2008
8 Beiträge
 
#4

Re: StringGrid - dickere Trennspalte

  Alt 12. Jul 2008, 11:44
danke das mit der kopier-methode funktioniert nach ein paar kleinen anpassungen

jetzt brauch ich nur noch hilfe bei den trennlinien
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: StringGrid - dickere Trennspalte

  Alt 12. Jul 2008, 11:49
Selber zeichnen
Markus Kinzler
  Mit Zitat antworten Zitat
CaptainAwsome

Registriert seit: 12. Jul 2008
8 Beiträge
 
#6

Re: StringGrid - dickere Trennspalte

  Alt 12. Jul 2008, 13:15
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz