Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
796to800
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
796to800
796to800
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Zeilen ohne Zwischenraum

Zeilen ohne Zwischenraum
03.09.2006 18:00:38
schoentalegg
Hallo Leute
wie kann man in Excel Zeichen untereinander schreiben, ohne dass Excel einen Zwischenraum macht? Beispiel: wenn ich einen senkrechten Strich mit dem ASCII-Zeichen 00124 | machen will, dann gibt es immer einen Zwischenraum egal ob die Zeichen in verschiedene Zellen untereinander schreibe oder in derselben Zelle mit ALT+Enter eine Zeilenschaltung einfüge.
Es ist mir klar, dass man senkrechte Linien nicht mit dem Zeichen | macht. Ich gebe das als Beispiel, da meine Anwendung, die unter anderem Schachdiagramme erstellen wird, mit speziellen Fonts arbeitet (ein Buchstabe = ein Schachfeld mit Figur). Da ist sehr wichtig, dass die einzelnen Felder (sprich Zeichen) dicht aneinander sind. Wenn ich die Diagramme in eine einzelne Zelle mit Zeilenschaltung schreibe, habe ich die erwähnten Zwischenlinien, wenn ich für jedes Feld eigene Zellen verwende, dann kommen noch Zwischenräume in der waagrechten dazu!
 LMNO
15XHGFEDCBAY   
161-mK-tR-+R+!   
172+PzPL+-zPP"   
183P+N+-zP-sN#   
194+-+-zPp+Q$   
205-vLlzPp+-zp%   
216snp+p+nwq-&   
227p+pvl-+p+'   
238tr-+-trk+-(   
24xhgfedcbay   


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
In Word wäre das kein Problem, da enstehen komplette DIagramm, ohne dass der zeichenabstand eigens verändert werden muss. Ich kann aber meine Anwendung nicht in Word schreiben, da ich auf den fast endlosen Tabellenraster von Excel angewiesen bin. Ich kann diese auch nicht aus Word importieren, da sie nicht statisch sein sollen.
Herzlichen Dank für Eure Hilfe.
schoentalegg

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Vorsichtshalber: Noch offen...
03.09.2006 18:11:02
{Boris}
Hi,
was passiert denn, wenn Du eine Proportionalschrift - wie z.B. Courier - verwendest?
Grüße Boris
AW: Vorsichtshalber: Noch offen...
03.09.2006 18:20:12
schoentalegg
Hallo Boris
die Schachfonts sind alles solche Schriftarten (Festbreitenschriftarten genannt). Das ist leider nicht die Lösung.
Trotzdem herzlichen Dank.
Gruss
Schoentalegg
AW: Vorsichtshalber: Noch offen...
03.09.2006 18:20:16
schoentalegg
Hallo Boris
die Schachfonts sind alles solche Schriftarten (Festbreitenschriftarten genannt). Das ist leider nicht die Lösung.
Trotzdem herzlichen Dank.
Gruss
Schoentalegg
AW: Zeilen ohne Zwischenraum
04.09.2006 09:16:13
ingUR
Hallo, schoentalegg,
hier scheint es sich um eine Frage zu handeln,
die nur über den Schriftsatz zu lösen ist,
ähnlich wie die Grafikzeichendarstellung in Fonts: ═╬═
Die Felder scheinen nicht die gleiche Höhe und Weite zu haben, wie die Trennstriche, zind also dafür ausgelegt auch Zwischenstriche zu erfassen:
*************
******....*****
*****.......****
******....*****
*****.......****
***.............**
*************
*************
Hier ist also dass Feld in jedem Fall um zwei Pixel in der Höhe kleiner, als der senkrechte Trennstrich. Trennstriche sind im Zeichensatz eigene Zeichen, die entweder eine Zeilenhöhe in Strichstärke einehmen oder aber die gesamte Zeilenhöhe in der Zeichenbreite einer Strichstärke ausfüllen.
In Deinem Fall hätten die Felderteilstriche um den Rand eines Feldes, jeweils in halbe Strichbreite das Zeichen umrahmen müssen, ansonsten muß wohl auf die Rasterstriche verzichtet werden.
Es könnte die Möglichkeit untersucht werden, ob aus den Elementen nicht Grafiken erstellt werden können, die dann plaziert im Raster ohne Lücken über die Eigenschaft Top und Left angeorndet werden können.
Hier eine zellenorientiertes Brett, also ein Schachbrett, dass die Zellen als Spielfeld nutzt, bei dem die 32 Figuren die Grafikobjekte sind:
Sollen das Feld Bestandteil einer Figur sein, so sin demnach 66 Grafikelemente (2x16 Figuren auf je zwei verschieden Farben und je zwei verschiedenfarbende Leerfelder).
Gruß,
Uwe
Anzeige
AW: Zeilen ohne Zwischenraum
04.09.2006 22:26:30
schoentalegg
Hallo Uwe
herzlichen Dank für Deine ausführliche Antwort. Dem ersten Teil kann ich nicht immer ganz folgen, aber ich denke (falls ich es richtig verstanden habe), dass die Chessfonts durchaus die Zeichenhöhe eines ganzen Striches haben, da Sie in Word ja ohne Verändern des Zeichenabstandes oder der Absatzhöhe ein geschlossenes Bild ergeben. Nur Excel scheint nicht für eine derartige Verwendung von Zeichen gebaut zu sein. In der Breite rücken die Zeichen ja tatsächlich ganz zusammen, wenn ich diese in eine Zelle schreibe nur der manuelle Zeilenumbruch innerhalb der Zeile macht dann einen Abstand, sowie auch das Schreiben in verschiedene Zellen. Diese Abstände zu veringern wäre toll!
Zum zweiten Teil: An ein Diagramm aus lauter Grafikelementen habe ich auch schon gedacht, fand es aber mühsam diese zu erstellen (wie schaffst Du es ohne Zwischenräume?) und habe Respekt davor, dass die Datei dann sehr gross und langsam wird, wenn ich Dutzende (bei grossen Variantenbäumen gegen 100) von Diagrammen einfüge. Da wäre ein Fontsdiagramm einfach ein paar normale Zeichen. Aber dein Diagramm sieht echt super aus, vielleicht muss ich trotzdem diesen Weg wählen.
Wie hast Du die Teilgrafiken erstellt? Es bräuchte übrigens nur deren 26 (pro Farbe 6 verschiedene Figuren, mit je zwei Felderhintergrundfarben plus 2 leere Felder).
Kannst Du mir einen Tipp geben, wie du Dein Diagramm erstellt hast?
Herzlichen Dank
Viele Grüsse
schoentalegg
Anzeige
AW: Zeilen ohne Zwischenraum
05.09.2006 11:27:51
ingUR
Fazit für "Überfliefer":
Es bleibt also Deine Ausgangsfrage offen, ob die Zellenfläche so formatiert werden kann, dass in ihr die Schriftzeichen ohne zusätzlichen Freiraum zwischen Zellenrand und Zeichenfläche dargestellt werden können.
Hallo, schoentalegg,
welchen Schriftsatz nutzt Du? Und, damit wir nicht von verschiedenen Dingen schreiben: Wie willst Du den Schriftsatz in EXCEL einsetzen?
Also wenn ich in Word die Schriftart DiagrammRRBlindwhite einsetze, ist bei großer Schrifthöhe sehr wohl zu erkennen, dass der Vertikalstrich höher ist, als die schraffierte Feldhöhe.
In meinem Beispiele also der linke Spalte (schwarze Sternenspalte stellvertretend für Pixel) und daneben das Spielfeld mit Figursymbol, dass oben unten jeweils um eine Pixelreihe verkleinert ist (grüne Sterne und Punkte). Allein die horizontale Trennnlinie (rot) existiert nicht als Zeichen.
Das Bild, das ich in WORD erhalte, zeigt deutlich diese Grundmekmale der Schriftzeichen:
Füge ich nun dieses Bild in EXCEL ein, so wird jedes Zeichen in eine eigene Zelle gesetzt und erhält so zusätzlich noch die von Excel interen gesetzten Abstände der Zeichen zum Zellenrand. Wie letztere gessteuert werden kann und ob überhaubt, das weis ich nicht zu sagen.
Auch das Zusammenführen in eine Zelle, wobei die Umschlaltung in eine neue Zeile innerhalb der Zelle mit [Alt][Return] durchgeführt wird, zeigt auch nicht das gewünschte Ergebnis.
Es bleibt also Deine Ausgangsfrage offen, ob die Zellenfläche so formatiert werden kann, dass in ihr die Schriftzeichen ohne zusätzlichen Freiraum zwischen Zellenrand und Zeichenfläche dargestellt werden können.


Zum zweiten Teil:
Meine Darstellung habe ich mit Graikelementen (gif-Format) erzeigt, indem ich die Bilder ex VBA-Makro zentrisch in eine Zelle plaziert habe:
Function PlaziereFigur(fNr As Integer, zkoord As String) As Boolean Dim fcolor As String, zFigur As typFigur, FigName As Byte ' fcolor:= Spielsteinfarbe w oder s ' figure:= Spielfigur: K, D, L, S, T, B ' zkoord:= Zielkoordinaten: z.B, "d4" :: zkoord = "" := Keine Positionsveränderung Dim r As Integer, c As Integer Dim zLeft, zTop, zWidth, zHeight If Len(zkoord) = 0 Then zkoord = Figur(fNr).pos r = Val(Right(zkoord, 1)) c = Asc(Left(UCase(zkoord), 1)) - Asc("A") + 1 If (r < 1 Or r > 8) Or (c < 1 Or c > 8) Then MsgBox ("Ungültige Notation: " & zkoord & " !") PlaceFigure = False Exit Function End If zFigur = Figur(fNr) With Cells(10 - r, c + 1) zLeft = .Left zTop = .Top zWidth = .Width zHeight = .Height End With zFigur.pic.Left = zLeft + (zWidth - zFigur.pic.Width) / 2 zFigur.pic.Top = zTop + (zHeight - zFigur.pic.Height) / 2 zFigur.pos = zkoord Brett(c, r) = fNr End Function
Diese Funktion ist geeeigenet, wenn es darum geht, die Figuren in Grundstellung oder eine definierte Situation auf einem im schachbrettmuster vorgefertigtem Zellenbereich aufzustellen. Die Spielfiguren können danach frei auf dem Feld verschoben werden.
Das Ganze ist Teil einer "Spielerei", also enthält noch keinen Kompfort, wie Regelnbeachtung und sollte nur als "Makroeinführung" zur formatierung von Zellen und das Plazieren von Grafikelemente dienen, jedoch durchaus in der Absicht angelegt, das System noch auszubauen.
Nun kommt es wohl wesentlich darauf an, welche Arbeit Du erlkedugen willst. Um einen Spielstand in einem Fließtext vorzustellen (Schachliteratur) oder diesen fürs Protokoll festzuhalten, wird wohl der Weg über WORD und die Nutzung des Fonts der sinnvolle sein, wobei die VBA-Programmierung für WORD durchaus wohl auch die Möglichkeit erpffnet, das Bild aus Virgaben aufzubauen.
Soll den eine Schachbild-anwendung in EXCEL erstellt werden, dann käme der Weg über die Grafiken in Farage, wobei ggf. eine Autoform-Satz zu erstellen empfehlenswert ist (wird es vielleicht auch bereits geben; Clips). Hiewr ist nach aufgabe zu unterscheiden, ob man das Bild mit Schachfeld benötigt (analog Schriftart-Satz) oder aber die Einzelfigur, die auf ein anderes Objekt gestellt wird (mein Fall, in demm ich die Grafik in eine Zelle lege).
Möglich wäre auch ein eigenes Dialogfenster, in dem das Spielfeld mit den Figuren angeordnet werden.
Bei der Auswahl der Figuren ist zudem zu bedenken, ob man mit Vergrößereungen oder Verkleinerungen arbeiten möchte, ob also GIF-Bilddatei ausrecícht oder eine vektorientieres Grafikelement als Grundlage dienen soll.
Vielleicht kannst Du die Zielrichtung der Anwendung Deines Projekts ein wenig nächer beschreiben, vielleicht lohnt es sich, meine Grundbaustein auszubauen.
Gruß,
Uwe
Anzeige
AW: Zeilen ohne Zwischenraum
05.09.2006 20:38:32
schoentalegg
Hallo Uwe
Vielen Herzlichen Dank für Deine detaillierten Ausführungen. Du hast wirklich viel Zeit für mein Problem investiert. Echt sehr freundlich von Dir!!
Die Anfangsfrage ist tatsächlich noch offen. Evt weiss jemand einen Trick, das mit den Fonts wäre für mich tatsächlich das einfachste zum programmieren.
Zu meinem Vorhaben:
Wenn ich mit einem Schachprogramm (Fritz genannt) an einer Eröffnung herumprobiere, so schreibe ich zu vielen Zügen mehrere Varianten und in den Varianten wieder Untervarianten, die alle gespeichert werden. So erhalte ich bald ein weit verzweigtes Variantennetz. Die Partienotation wird aber dadurch schnell unlesbar. Ich möchte nun diese Varieanten in einem Variantenbaum sauber strukturiert lesbar darstellen und an für mich wichtigen Punkten ein Diagramm beifügen. Die Diagramme sollen in gut lesbarer Grösse auf separaten Blätter (Sprich sep. Excelteballe mit allen Diagrammen und Seitenumbrüchen) dargestellt werden. Im Variantenbaum sollen an der Stelle, wo es Diagramme gibt Mini-Minuaturen derselben aufgdruckt werden. Nummern weisen dann auch das grosse Original. Zudem sollen kurze Kommentare möglich sein, da reine Varianten zu lernen im Schach völlig sinnlos ist. Pro wichtige Variante mache dann einen eigenen solchen Baum in den ich entsprechend mit einem längeren Startkommentar versehen kann. Ich habe mal ein Beispiel anhand einer sehr häufigen Eröffnung gebastelt:
die Notation der Partie aus dem Schachprogramm importiert:
{96MB, Fritz8.ctg, WS6978 Spanische Partie} 1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 (
3... Nd4 {Diagramm # Bird} 4. Nxd4 exd4 5. O-O (5. d3) 5... Bc5 6. d3 c6 7. Bc4
d5 8. exd5 cxd5 9. Bb5+ Bd7 10. Bxd7+ Qxd7 11. Nd2 Ne7) 4. Ba4 (4. Bxc6 {
Abtauschvariante} dxc6 (4... bxc6 {ist schwächer} 5. d4 exd4 6. Qxd4 {
Diagramm #}) 5. O-O {Diagramm #} (5. Nxe5 {verliert das Rochaderecht} Qd4 6.
Nf3 Qxe4+ 7. Qe2 Qxe2+ 8. Kxe2) (5. d3 Bg4 6. h3 Bxf3 7. Qxf3) 5... Bd6 (5...
Bg4 $5 6. h3 h5 7. hxg4 $2 (7. d3 Qf6 8. Nbd2 Bd6) 7... hxg4 8. g3 (8. Nh2 $4 {
verliert sofort} Qh4 {Diagramm # droht Matt in 1} 9. Re1 Bc5 10. d4 Bxd4 11.
Be3 Qxh2+ 12. Kf1 Bxb2) 8... gxf3 9. Qxf3) (5... Qd6 6. Na3 Be6 7. Qe2 f6) 6.
d4 Bg4 7. dxe5 Bxf3 8. Qxf3 Bxe5) 4... Nf6 5. O-O Bc5 (5... b5 {zu früh!} 6.
Bb3 Na5 7. Nxe5 Nxb3 8. axb3 d6 (8... Qe7 9. d4 d6 $2 10. Nc6 Qxe4 $4 11. Re1)
9. Nf3 Be7 10. Re1 {Diagramm # Minus 1 Bauer für schwarz}) 6. c3 b5 7. Bb3 d6
8. d4 Bb6 {Diagramm #} *
dann die Exceltabelle:
 ABCDEFGHIJKLMNOPQRS
2596MB, Fritz8.ctg, WS6978  Spanische Partie                  
261.e4e52.Nf3Nc63.Bb5a64.Ba4Nf65.O-OBc56.c3b57.Bb3d68.d4Bb6   
27               D#    
28               D#    
291.e4e52.Nf3Nc63.Bb5a64.Ba4Nf65.O-Ob56.Bb3Na57.Nxe5Nxb38.axb3d69.Nf3Be710.Re1
30         zu früh!        D# inus Diagramm # Minus 1 Bauer für schwarz
31                  D#z
321.e4e52.Nf3Nc63.Bb5a64.Ba4Nf65.O-Ob56.Bb3Na57.Nxe5Nxb38.axb3Qe79.d4d6?10.Nc6
33                   
34                   
351.e4e52.Nf3Nc63.Bb5a64.Bxc6dxc65.O-OBd66.d4Bg47.dxe5Bxf38.Qxf3Bxe5   
36       Abtauschvariante D#           
37        D#3          
381.e4e52.Nf3Nc63.Bb5a64.Bxc6dxc65.O-OQd66.Na3Be67.Qe2f6     
39                   
40                   
411.e4e52.Nf3Nc63.Bb5a64.Bxc6dxc65.O-OBg46.h3h57.hxg4?hxg48.g3gxf39.Qxf3  
42                   
43                   
441.e4e52.Nf3Nc63.Bb5a64.Bxc6dxc65.O-OBg46.h3h57.hxg4hxg48.Nh2?Qh49.Re1Bc510.d4
45               verliert sofortD# roht Diagramm # droht Matt in 1   
46               D#1   
471.e4e52.Nf3Nc63.Bb5a64.Bxc6dxc65.O-OBg46.h3h57.d3Qf68.Nbd2Bd6   
48                   


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
überall wo D# steht würde jetzt ein kleine Minidiagramm stehen, dessen grosser Bruder in einer seperaten Datei steht. Ich könnte die Diagramm aus Fritz importieren, aber nur als Bitmap, was sehr das Excel sehr gross macht und beim verkleinern, werden sie ganz verschwommen. Daher die Idee mit den Fonts. Ich importiere aus Fritz (per API-Befehle) die Diagrammdaten und erstelle dann selber das Diagramm, das auch klein noch knapp lesbar ist.
Zu dem Schachfonts:
Ich verwende die Fonts des Programmes Fritz (z.B. DiagramTTFritz oder DiagramTTUSCF). Diese haben die wunderbare Eigenschaft, dass die Schattierung der schwarzen Felder ein eigener Buchstabe ist, der hinter der Figur liegt und der daher auch separat eingefärbt werden kann.
Du hast tatsächlich recht mit Deinen Analysen zu den Fonts. Es gibt kleine Abstände, die aber nicht im Verhältnis sthehen zu dem, was dann Excel daraus macht.
Zu deinem Programm:
VBA - gut habe ich gewählt, da es zwischen VBA nein und VBA-gut nichts mehr gibt. Aber sooo gut bin ich auch nicht. Dein Programm sieht gut aus, aber ich kann es nicht ausprobieren. Es fehlen ja die Grafiken und die Details zum selbst definerten Variablentypes. Aber ich muss sagen, meine Programme zur Erstellung der Buchstabendiagramme aus den importierten Daten sehen recht klobig aus. Wie kann ich Dein Programm ausprobieren? Hast du die Figuren-Bilder aus den Fonts gebastelt? Und wo hast Du diese als Pfad irgendwo abgelegt und das Programm ruft sie dann auf?
Es wäre schon genial so schlank und einfach, die Figur und das Feld an eine Funktion zu übergeben, et voilà! Dann brauchte ich nur noch ein Schleife zu bauen, die die Diagrammnotation durcharbeitet und die entsprechenden Angaben an deine Funktion weiterleitet.
Was muss ich vorkehren, damit ich dein Programm ausprobieren und dann in mein Tool einbauen kann?
Nochmals herzlichen Dank für Deine Hilfe.
Viele Grüsse
Lothar
Anzeige
AW: Schachdiagramme darstellen
06.09.2006 09:16:19
ingUR
Danke, Lothar,
für Deine Erläuterung Deines Vorhabens.
Ich ahnte es schon, dass es eher in Richtung Protokoll/Literatur geht, sodass der Weg über die Zellen eines Excel-Tabellenblatts mir weniger geeignet scheint, da hier jeweils das Brett als Teil der Tabelle erstellt wird, Du hingegen das Brett mit seiner Figurenstellung als Bild benötigst.
Als Alternative zum Schriftfont bietet sich nun m.E., da Du erwähnst, dass Du das Schachprogramm Fritz im Einsatz hast, das Arbeiten mit den "Figuren-Feldern", also jede Figur führt ihr gerade besetztes Feld mit sich.
Du hattest natürlich Recht, dass hier nur 26 unterschiedliche Elemente existieren und genau diese sind im Verzeichnis C:\Programme\ChessBase\ChessProgram8\gif (Fritz8) bei einer Standardinstallation als Gif-Bild abrufbar, jedoch zur Darstellung der denkbaren Anordnung sind eben doch eine höhere Anzahl von Objekte auf dem Schirm erforderlich, wobei einzig der Läufer "sparsam" sich einsetzen läßt, da ja jeder Läufer für sich allein nur eine Feldfarbe beherrscht.
Es ist also nun die Farbe des Feldes, auf der sich die schwarze oder weiße Figur befindet mit zu berücksichtigen, so dass die Funktion zur Aufstellung der Figuren verändert werden muß.

Fig. w  s  Feld      Kürzel
Fritz-Gif: "Figurfarbe(Figurkürzel)Feldfarbe" & ".gif"
D    1  1  w+s   4     q        wqw, wqb, bqw, bqb
K    1  1  w+s   4     k        wqk, wkb, bkw, bkb
Lw   1  1  w     2     b        wbw, wbb
Ls   1  1  s     2     b                  bqw, bqb
S    2  2  w+s   8     n        wnw, wnb, bnw, bnb (x2)
T    2  2  w+s   8     r        wrw, wrb, brw, brb (x2)
B    8  8  w+s  32     p        wpw, wpb, bpw, bpb (x8)
------------------              w         b (zwei Leerfelder) = 2x2x6+2=26
60
Mit diesen Gif-Bildern läßt sich die Grundstellung der Figurenanorndung relativ leicht zum Gesamtbild im Gif-Format zusammenfügen, das in Maßen vergrößer und verkleinert werden kann:
Das Rechte Bild ist die Standardgröße aus den Einzelfiguren/-Felder (W x H = 24 x 24). die Vergleinerung sind durch Randverschiebung auf den Griff-Eckpunkten des Standardbildes aus diesem entstanden. Eine Vergrößerung ist ebenfalls in gut brauchbarer Qualität möglich.
Das Programm arbeit in diesem Teil vorerst so, dass es im ersten Schritt den Rand, die Randbeschriftung und die Feldgrößen in dem Zellnbereich "A1:J10" anlegt und formatiert. Achließend werden die Spilefelder plaziert (w.gif und b.gif). Danach werden für jede Farbe (mit weiß beginnend) die Firguren in Grundstellung aufgebaut: (w(f)w, w(f).b,.... b(f).w, b(f).b mit f für dei Figurenkürzel gem. Fritz-Gif-Datei.
Dieses Gebilde besteht aus ist Einzelbautsteine, wie man leicht erfährt, wenn man ein Objekt anwäklt und verschiebt. Gebunden wird das Ganze als "Photographie" des Bereiches "A1:J10", die vorerst auf dem Tabellenblatt Tabelle2 abgelegt wird.
Mit diesem "Binden" ist der Bildschirmausschnitt Notationsrand und Figuren/Felder zu einem Grafikobjekt geworden, welches in der Objekliste Schapes des betreffenden Blattes verwaltet wird. Das Grafikojekt kann nun als ein solches auch bearbeitet werden (Vergrößern, Verkleinern, Speichern, Laden ....).
Der Bearbeitungsstand des Vorentwurfes besteht aus den nacxhfolgenden Prozeduren, die in den Standardmodul-Ordner einzufügen sind:
Option Explicit
'C:\Programme\ChessBase\ChessProgram8\gif
Const b = -1: Const w = 1
Const bbb = -2: Const wbb = 2
Const bbw = -3: Const wbw = 3
Const bkb = -4: Const wkb = 4
Const bkw = -5: Const wkw = 5
Const bnb = -6: Const wnb = 6
Const bnw = -7: Const wnw = 7
Const bpb = -8: Const wpb = 8
Const bpw = -9: Const wpw = 9
Const bqb = -10: Const wqb = 10
Const bqw = -11: Const wqw = 11
Const brb = -12: Const wrb = 12
Const brw = -13: Const wrw = 13
Dim figPic(30, 2) As Object
Dim board(8, 8) As Object
Sub ZeichneSchachbrett()
Dim i As Integer, j As Integer, farbe As Integer
Dim strPath As String, strGifName(2) As String
Dim oldSU As Boolean
oldSU = Application.ScreenUpdating
Application.ScreenUpdating = False
strPath = "C:\Programme\ChessBase\ChessProgram8\gif\"
Sheets("Tabelle1").Select
EntferneAlleSchachObjekte
Brettrandbeschriftung
strGifName(0) = strPath & "w.gif"  'weißes Leerfeld
strGifName(1) = strPath & "b.gif"  'schwarzes Leerfeld
farbe = 0
For j = 1 To 8
farbe = IIf(farbe = 1, 0, 1)
For i = 1 To 8
Set board(i, j) = ActiveSheet.Pictures.Insert(strGifName(farbe))
Call Ausrichten(i, j)
farbe = IIf(farbe = 1, 0, 1)
Next i
Next j
LoadFigures
ActiveSheet.Range("A1:J10").CopyPicture Appearance:=xlScreen, Format:=xlPicture
Worksheets("Tabelle2").Paste Destination:=Range("A1")
Application.ScreenUpdating = True
Application.ScreenUpdating = oldSU
End Sub
Private Sub Brettrandbeschriftung()
Dim i As Integer
'    Columns(1).ColumnWidth = 35.86
'    Rows(1).RowHeight = 192
With Range("A1:j10")
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
Rows("1,10").RowHeight = 12.75
Rows("2:9").RowHeight = 24
Columns(1).ColumnWidth = 2.25
Columns("B:H").ColumnWidth = 30.3 / 8
Columns(10).ColumnWidth = 2.25
For i = 1 To 8
Cells(10 - i, 1) = i
Cells(10 - i, 10) = i
Cells(1, 1 + i) = Chr(64 + i)
Cells(10, 1 + i) = Chr(64 + i)
Next i
End Sub
Private Sub LoadFigures()
Dim strPath As String, strGifName As String
Dim i As Integer, j As Integer
Dim x0 As Integer, y0 As Integer
Dim figCode, picW As Integer, picH As Integer, FF As String
strPath = "C:\Programme\ChessBase\ChessProgram8\gif\"
picW = 24
picH = 24
figCode = Array("", "r", "n", "b", "k", "q", "b", "n", "r")
j = 8: FF = "w" 'baue Reihe 1 auf
For i = 1 To 8
strGifName = strPath & "w" & figCode(i) & FF & ".gif"
Set board(i, j) = ActiveSheet.Pictures.Insert(strGifName)
Call Ausrichten(i, j)
FF = IIf(FF = "w", "b", "w")
Next
j = 7: FF = "b" 'baue Brettreihe 2 auf (weiße Beuernlinie)
For i = 1 To 8
strGifName = strPath & "wp" & FF & ".gif"
Set board(i, j) = ActiveSheet.Pictures.Insert(strGifName)
Call Ausrichten(i, j)
FF = IIf(FF = "w", "b", "w")
Next
j = 2: FF = "w" 'baue Reihe 7 auf (schwarze Bauernreihe)
For i = 1 To 8
strGifName = strPath & "bp" & FF & ".gif"
Set board(i, j) = ActiveSheet.Pictures.Insert(strGifName)
Call Ausrichten(i, j)
FF = IIf(FF = "w", "b", "w")
Next
j = 1: FF = "b"
For i = 1 To 8
strGifName = strPath & "b" & figCode(i) & FF & ".gif"
Set board(i, j) = ActiveSheet.Pictures.Insert(strGifName)
Call Ausrichten(i, j)
FF = IIf(FF = "w", "b", "w")
Next
End Sub
Private Sub Ausrichten(i, j)
Dim picW As Integer, picH As Integer
Dim x0 As Integer, y0 As Integer
x0 = Range("B2").Left
y0 = Range("B2").Top
picW = 24 'i-Richtung
picH = 24 'j-Richtung
With board(i, j)
.Left = x0 + (i - 1) * picW
.Top = y0 + (j - 1) * picH
End With
End Sub
Sub EntferneAlleSchachObjekte()
Dim objShp As Shape
For Each objShp In ActiveSheet.Shapes
objShp.Delete
Next
End Sub
Sub Einzelfigursetzen(Notation As String)
'bColumn = Left(Bez, 1) - Asc("A") '0....7
'bRow = Val(rigth(Bez, 1)) - 1     '0....7
End Sub
Das Einzelfigursetzen ist als Entwicklungsarbeit noch offen.
Ideall wäre, wenn es optional die Wahlmöglichkeit geben würde, dass die Zugfolge zur Darstellung des Spielstands führt oder man aber einen bestimmten Spielstand als Eingangstellung vorgibt. Hierzu erscheint es mit sinnvoll aus den Figuren Datentypen werden zu lassen, der all ihre Eigenschaften (Farben, Position, ...) als eigene Variable mit sich führt:
Type Schachfigur
objPic as Object
iKennNr as Integer
strCode as String
strName as String
strNotation as String
ipos as Integer
iPotenziellPos(8) as Integer
End Type
Dim Schachfiguren(60) as Schachfigur

Als Vorüberlegung sollte man auch untersuchen, ob eine eigene Funktionsklasse empfehlenswert ist, den das versetzen eines Steines wird gleichartige Abläufe nach sich ziehen (Ausgangsfeld, Endfeld, Regelkontrolle).
Doch das sind alles Ideen, die in diesem Beitragsfaden nicht weiterentwickelt werden können, denn der verschwindet anscheinend morgen oder übermorgen im Archiv und wie man oder ob man da Anworten kann, weis ich nicht.
Ich werde also nach zeitlicher Gelegenheit dieses Projekt bestimmt ein Stück weiterentwickeln. Über UweRat>markt-datenat>de können wir gerne uns über den Stand und das Schachthema austauschen, denn der Entwicklungsstand gestattet es meinem Empfinden nach nicht, dieses Forum als Projektinformationplattform zwischen uns zu nutzen, denn ein allgemeines Interesse findet diese Anwendung nicht.
Gruß,
Uwe
Anzeige
AW: Schachdiagramme darstellen
06.09.2006 15:07:21
schoentalegg
Hallo Uwe
herzlichen Dank für Deine erneute immense Arbeit.
Ich habe dein Projekt kurz ausprobiert: Es ist genial!
Du hast recht: Die Schachdiagramme werden ja wirklich nur in der Funktion eines Bildes verwendet - und können als solches auch viel besser bezeichnet und positioniert werden. Damit ist klar: ich werde die Idee mit den Fonts definitv aufgeben und die ursprüngliche Forums-Frage als beantwortet geben.
Für meine Diagramme wird es nicht nötig sein, die Zugrechte etc. zu prüfen, da ich die jeweilige Partie-Variante per API über das Clipboard an Fritz übergebe und mir von Fritz wieder ein Textfile reinziehe das dem Diagramminhalt beschreibt, im FEN-Standard z.B.:
r3kr2/pppn1ppp/1b1pbn2/1q2p1B1/3PP3/2PB1N2/PP1N1PPP/R3R1K1 b kq - 0 13
(Grosse Buchst = weiss, kleine Buchst. = schwarz, Zahlen = leere Felder von Reihe 8 bis 1, danach Zugsrecht, Rochaderecht, en passant - Möglichkeit, Züge für 50-Züge-Regel)
Dieses Textfile muss ich nur noch aufdröseln und die Figuren entsprechend platzieren, was nicht allzu kompliziert ist.
Dank deiner Vorarbeit habe ich das sogar bereits geschafft: Ich habe Deine Prozeduren für die ZeichenSchachbrett und LoadFigures so verschmolzen, dass diese nun aus einem FEN-Diagrammtext in einem Schritt ein Diagramm erstellt:
Option Explicit
Const strPath As String = "C:\Programme\ChessBase\ChessProgram8\gif"
Dim board(8, 8) As Object
Sub Test()
Call Diagramm("r3kr2/pppn1ppp/1b1pbn2/1q2p1B1/3PP3/2PB1N2/PP1N1PPP/R3R1K1 b kq - 0 13")
End Sub
Sub Diagramm(strFEN)
Dim i As Integer, j As Integer, y As Integer, x As Integer
Dim strGifName As String, strFENCode As String, FF As String, strAmZug As String
Dim oldSU As Boolean
oldSU = Application.ScreenUpdating
Application.ScreenUpdating = False
Sheets("Tabelle1").Select
EntferneAlleSchachObjekte
Brettrandbeschriftung
FF = "b": i = 1: j = 1
For x = 1 To Len(strFEN)
strFENCode = Mid(strFEN, x, 1)
Select Case strFENCode
Case "1", "2", "3", "4", "5", "6", "7", "8" 'leere Felder (Anzahl)
For y = 1 To Int(strFENCode)
FF = IIf(FF = "w", "b", "w")
strGifName = strPath & FF & ".gif"
Set board(i, j) = ActiveSheet.Pictures.Insert(strGifName)
Call Ausrichten(i, j)
i = i + 1
Next y
Case "/" 'nächste Reihe
i = 1: j = j + 1
FF = IIf(FF = "w", "b", "w")
Case " " 'Ende Diagramm -> Zugsrecht abfragen, Rest = uninteressant
strAmZug = Mid(strFEN, x, 1 + 1)
Cells(10, 1).Value = IIf(strAmZug = "w", Chr(153), Chr(152))
x = Len(strFEN)
Case Else 'Figuren Grossbuchstaben = weisse; Kleinb. = Schwarze
FF = IIf(FF = "w", "b", "w")
strGifName = strPath & Figur(strFENCode) & FF & ".gif"
Set board(i, j) = ActiveSheet.Pictures.Insert(strGifName)
Call Ausrichten(i, j)
i = i + 1
End Select
Next x
ActiveSheet.Range("A1:J10").CopyPicture Appearance:=xlScreen, Format:=xlPicture
Worksheets("Tabelle2").Paste Destination:=Range("A1")
Application.ScreenUpdating = True
Application.ScreenUpdating = oldSU
End Sub

Private Sub Brettrandbeschriftung()
Dim i As Integer
'    Columns(1).ColumnWidth = 35.86
'    Rows(1).RowHeight = 192
With Range("A1:j10")
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
Rows("1:10").RowHeight = 12.75
Rows("2:9").RowHeight = 30
Columns(1).ColumnWidth = 2.25
Columns("B:I").ColumnWidth = 5
Columns(10).ColumnWidth = 2.25
For i = 1 To 8
Cells(10 - i, 1) = i
Cells(10 - i, 10) = i
Cells(1, 1 + i) = Chr(64 + i)
Cells(10, 1 + i) = Chr(64 + i)
Next i
Cells(10, 1).Font.Name = "Wingdings 2"
End Sub


Private Function Figur(FENKuerzel As String)
Figur = Switch( _
FENKuerzel = "Q", "wq", _
FENKuerzel = "K", "wk", _
FENKuerzel = "R", "wr", _
FENKuerzel = "N", "wn", _
FENKuerzel = "B", "wb", _
FENKuerzel = "P", "wp", _
FENKuerzel = "q", "bq", _
FENKuerzel = "k", "bk", _
FENKuerzel = "r", "br", _
FENKuerzel = "n", "bn", _
FENKuerzel = "b", "bb", _
FENKuerzel = "p", "bp")
End Function


Private Sub Ausrichten(i, j)
Dim picW As Integer, picH As Integer
Dim x0 As Integer, y0 As Integer
x0 = Range("B2").Left
y0 = Range("B2").Top
picW = 30 'i-Richtung
picH = 30 'j-Richtung
With board(i, j)
.Left = x0 + (i - 1) * picW
.Top = y0 + (j - 1) * picH
End With
End Sub

Sub EntferneAlleSchachObjekte()
Dim objShp As Shape
For Each objShp In ActiveSheet.Shapes
objShp.Delete
Next
End Sub
Dein Programmierstil hat mich wirklich beeindruckt. Ich habe zwar noch nicht ganz alle Details durchschaut, trotzdem konnte ich die obige Variante einfach daraus bauen. Der Trick mit dem bord(j,i)-Objekt finde ich super! Ich werde die Feinheiten dann noch studieren, da kann ich viel dazu lernen. Die folgenden Variablendeklarationen habe ich nicht ganz verstanden, wofür diese sind:
Const brw = -13: Const wrw = 13 etc, etc
Dim figPic(30, 2) As Object
Ich kann mich nun daran machen die ganzen Aufteilerei der Datennotierung und das richtige Platzieren der Diagramme zu programmieren. Das ist jede Menge Kleinarbeit.
Dank Deinem Code konnte ich aber ein wichtigen Sprung nach vorne machen und bin nun wieder topmotiviert weiter zu programmieren.
Du hast aber recht, dass ein solches Projekt nicht mehr über das Forum abgewickelt werden kann. Ich werde Dir mal eine Version hinüberbeamen, wenn es dich interessiert.
Nochmals herzlichen Dank.
Viele Grüsse
Lothar
Anzeige
AW: Schachdiagramme darstellen
06.09.2006 19:04:45
ingUR
Danke, Lothar,
für Deine anerkennenden Worte, die Du für meine Arbeit gefunden hast und die genauso erfreuen, wie die Tatsache, dass die Ausarbeitung Dich voranbringt. Und natürlich bin ich daran interessiert, wie sich das "Baby" entwickelt und heranwächst ;).
Gruß,
Uwe
AW: Schachdiagramme darstellen -
07.09.2006 07:47:28
ingUR
Hallo, Lothar,
es wurde zu früh gelobt mein Programmstil, denn zum "guten Stil" gehört es u.a., die mit Set eingesetzten Objekte auch wieder vor dem Geltungsbereichende zu "entsorgen":
For j = 1 To 8
For i = 1 To 8
Set board(i, j) = Nothing
Next i
Next j
. Dieses ist notwendig, da die "Zeiger"-Variablen als Referenzen Speicherplatz belegen, der nicht beim Verlassen des Gültikeitsbereiches der Deklarationen freigegeben wird.
Bezüglich Deiner Frage nach der Bedeutung der Konstantendefinitionen und globalen Variablen, fehlt noch meine Antwort: Sie sind nur als Idee für die beabsichtigte Erweiterung gedacht gewesen und haben nichts mit der bisherigen Funktionalität des Programmes zu tun.
Gruß,
Uwe
bitte setze
Anzeige
AW: Schachdiagramme darstellen -
07.09.2006 20:07:45
schoentalegg
Hallo Uwe
herzlichen Dank, ich werde diese Schlaufe ergänzen.
Ich bin weiter an meinem Projekt. Ich habe inzwischen weitergearbeitet und eine Funktion eingebaut, damit die Spaltenbreite und Zeilenhöhe automatisch auf die Höhe des verwendeten Fonds eingestellt wird.
Viele Grüsse
Lothar

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige