Tom: Spaltenbreite berechnen

Hello,

aus den Tabelleninformationen der MySQL-Datenbank baue ich mir nun
die folgenden Metainforamtionen zusammen:

[SETTEST2] => Array
        (
            [Type] => set
            [Null] => YES
            [Key] =>
            [Default] => Array
                (
                    [0] => Jan
                    [1] => Apr
                    [2] => Jul
                    [3] => Okt
                )

[Extra] =>
            [TypeClass] => S
            [Len] =>
            [Dec] =>
            [Rem] =>
            [Set] => Array
                (
                    [0] => Jan
                    [1] => Feb
                    [2] => Mrz
                    [3] => Apr
                    [4] => Mai
                    [5] => Jun
                    [6] => Jul
                    [7] => Aug
                    [8] => Sept
                    [9] => Okt
                    [10] => Nov
                    [11] => Dez
                )

[Style] =>
        )

[DEZ] => Array
        (
            [Type] => decimal
            [Null] => YES
            [Key] =>
            [Default] => 0.00
            [Extra] =>
            [TypeClass] => N        # N=Numeric, S=String, D=Date
            [Len] => 10
            [Dec] => 2
            [Rem] =>
            [Set] =>
            [Style] =>  align="right"  # für das <TD>-Tag
        )

Die Initial-Breite eines Feldes in der Anschließenden HTML-Tabelle soll sich aus dem Wert [Len] ergeben. Wie muss ich die den Wert für width errechnen? Ich habe im Moment einfach mit 8 multipliziert. Hängt natürlich vom Zeichensatz ab. Wie bekomme ich denn die mittlere Laufweite eines Zeichens heraus?

Mir ist dazu aufgefallen, dass in den meisten Zeichnsätzen, egal ob proportional oder diktengleich, die Laufweite aller Ziffern identisch ist. Könnt Ihr das bestätigen?

Für datetime habe ich [Len] = 19 eingestanzt. Ist das immer gleich, oder kann man da auch irgendwo schrauben?
2003-11-17 00:00:00

Was würdet Ihr bei den Typen set und enum machen? In der Listenanzeige der Datensätze habe ich da kein <Select>-Feld, sondern eine CSV-Liste
DREI,FÜNF

Die Listendarstellung soll ja nur eine Übersicht beiten, aber bei möglichst ergonomischer Darstellung.

Liebe Grüße aus http://www.braunschweig.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
  1. Hallo,

    Die Initial-Breite eines Feldes in der Anschließenden HTML-Tabelle soll sich aus dem Wert [Len] ergeben. Wie muss ich die den Wert für width errechnen? Ich habe im Moment einfach mit 8 multipliziert. Hängt natürlich vom Zeichensatz ab. Wie bekomme ich denn die mittlere Laufweite eines Zeichens heraus?

    In einer Proportionalschrift mit Standardlaufweite benötigen die breitesten Zeichen ca. 3/4 des Schriftgrades als Breite. Bei serif-Schriften ist das etwas weniger (29/40), bei sans-serif-Schriften etwas mehr (31/40). Willst Du also auf Nummer Sicher gehen, solltest Du die Anzeigebreite berechnen: anzZeichen*Schriftgrad*3/4. Dann ist soviel Platz, dass z.B. anzZeichen Mal ein O hineinpasst.

    Natürlich ist das meistens zu breit. Die schmalsten Zeichen beanspruchen ca. 1/5 des Schriftgrades. Nimmt man an, dass sich in einer Textzeile schmale und breite Zeichen die Waage halten, könnte man rechnen: (3/4 + 1/5)/2 = 19/40. Dann wäre die Anzeigebreite = anzZeichen*Schriftgrad*19/40. Das ist natürlich kritisch, weil durchaus ein Übergewicht breiter Zeichen in einer Zeile vorkommen kann.

    Mir ist dazu aufgefallen, dass in den meisten Zeichnsätzen, egal ob proportional oder diktengleich, die Laufweite aller Ziffern identisch ist. Könnt Ihr das bestätigen?

    Ja.

    Ich habe da mal etwas gebastelt:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
            "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <title>Font-Width</title>
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
    <style type="text/css">
    <!--
    div {font-family:sans-serif;}
    /*div {font-family:serif;}
    -->
    </style>
    </head>
    <body>
    <div style="position:absolute; top:0; left:0;">
    <div style="position:absolute; top:10px; left:10px; background-color:#C6C3C6; font-size:400px;">O</div>
    <div style="position:absolute; top:10px; left:10px; background-color:#00FF00; font-size:400px;">a</div>
    <div style="position:absolute; top:10px; left:10px; background-color:#FF0000; font-size:400px;"> </div>
    <div style="position:absolute; top:10px; left:10px; background-color:#FFFF00; font-size:400px;">l</div>
    <div style="border-top:1px solid black; position:absolute; top:10px; left:10px; width:400px;"> </div>
    <script type="text/javascript">
    <!--
    for (var i = 10; i<=410; i+=10) {
     document.write("<div style='border-left:1px solid black; position:absolute; height:400px; top:10px; left:" + i + "px;'>" + ((i/100==parseInt(i/100,10))?i/100:' ') + "</div>");
    }
    //-->
    </script>
    </div>
    <div style="position:absolute; top:0; left:410px;;">
    <div style="position:absolute; top:10px; left:10px; background-color:#C6C3C6; font-size:400px;">08</div>
    <div style="position:absolute; top:10px; left:10px; background-color:#00FF00; font-size:400px;">1</div>
    <div style="border-top:1px solid black; position:absolute; top:10px; left:10px; width:400px;"> </div>
    <script type="text/javascript">
    <!--
    for (var i = 10; i<=410; i+=10) {
     document.write("<div style='border-left:1px solid black; position:absolute; height:400px; top:10px; left:" + i + "px;'>" + ((i/100==parseInt(i/100,10))?i/100:' ') + "</div>");
    }
    //-->
    </script>
    </div>
    </body>
    </html>

    viele Grüße

    Axel

    1. Hello,

      Danke für die ausführliche Antwort. Ich werde es gleich einbauen.

      Da die Listendarstellung nur eine gute Übersicht über den Datenbestand geben soll, werde ich der Tabelle aber feste Breite (display:fixed) auf den Weg geben. Ich habe sowieso eine maximale Spaltenbreite von 30 (als Konstante für's Modul) festgelegt. Einige Textfelder sind ohnehin länger.

      Man könnte nun z.B. 100 Zeichen auf den Title legen. Wenn man dann auf die Zelle zeigt, sieht man mehr von dem spannenden Feldinhalt, ohne gleich in die Detaildarstellung des Datensatzes umschalten zu müssen.

      Außerdem überlege ich auch noch, wie ich den Tabellen oder hilfsweise dem Modul die "Datentypen" Link, eMail und Document beibringen kann, damit man direkt in die Liste klicken kann und nicht erst in die Detaildarstellung umschalten muss.

      Ich hätte gerne alle Informationen zentral gespeichert, aber wahrscheinlich werde ich einen "Table of Tables" brauchen. Die Beschreibungstexte für die Felder müssen ja auch irgendwie parametrisierbar sein. Es ist schade, dass MySQL für die Satzbeschreibung einer Tabelle kein "User Definitions Field" hat. Das wäre ein echter Mehrnutzen.

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
  2. Hallo.

    Die Initial-Breite eines Feldes in der Anschließenden HTML-Tabelle soll sich aus dem Wert [Len] ergeben. Wie muss ich die den Wert für width errechnen? Ich habe im Moment einfach mit 8 multipliziert. Hängt natürlich vom Zeichensatz ab. Wie bekomme ich denn die mittlere Laufweite eines Zeichens heraus?

    Da du die von Nutzer verwendete Schriftart nicht kennst: gar nicht.

    Mir ist dazu aufgefallen, dass in den meisten Zeichnsätzen, egal ob proportional oder diktengleich, die Laufweite aller Ziffern identisch ist. Könnt Ihr das bestätigen?

    Bei den meisten, nicht aber bei allen. Gute Schriftarten verfügen einerseits über Ziffern für den Tabellensatz, die die gleiche Laufweite aufweisen und denen auch etwa die Währungssysmbole angepasst sind. Andererseits sind für den Fließtext Ziffern mit individueller Laufweite, gern auch als Mediävalziffern, integriert. Welche Ziffern eingesetzt werden, obliegt dem Nutzer, nicht dem Autoren.
    Einzig dicktengleiche Schriftarten sind hier berechbar, jedoch nicht schriftartübergriefend. Es gibt keine Formel, die das Verhältnis von Höhe zu Breite hinreichend beschreibt. Formatiere den gleichen Text in zwei unterschiedlichen Schriftarten, aber der gleichen Schriftgröße, und du wirst dies erkennen. Die Schwierigkeiten von gleichen Schriftarten unterschiedlicher Hersteller (z. B. diverse "Garamond" oder "Times") sowie von ähnlich wirkenden Schriftschnitten einer Schriftfamilie (z. B."normal", "regular", "book") sind dabei noch nicht einmal berücksichtigt.

    Für datetime habe ich [Len] = 19 eingestanzt. Ist das immer gleich, oder kann man da auch irgendwo schrauben?

    Es lässt sich immer "irgendwo schrauben".

    Die Listendarstellung soll ja nur eine Übersicht beiten, aber bei möglichst ergonomischer Darstellung.

    Diese letzliche Einschätzung obliegt dem Nutzer, aber es ist wirklich löblich, dass du dich darum bemühst.
    MfG, at

    1. Hello,

      Diese letzliche Einschätzung obliegt dem Nutzer, aber es ist wirklich löblich, dass du dich darum bemühst.

      Das ist aber nett[tm] gesagt. Aber ich mag gar nicht mehr klagen. Das Ziel für heute ist erreicht:

      http://www.braunschweig.de/~selfHTML/Liste_Screenshot_MSIE5_5_02b.jpg

      Funktioniert nun schon in mehreren Browsern mit verschiedensten Schriften und Skalierungen.

      Soll ja keine Doktorarbeit werden, sondern eine praxisgerechte und benutzerfreundliche Funktion für den Zugriff auf MySQL-Tabellen.

      Die Buttons kommen morgen dran und dann die Detailansicht, in die man mit [?] umschalten kann. Wäre nun noch toll, wenn man einen :hover für den [?]-Button (Post, <input type="submit" ...>) definieren könnte.

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      1. Hello,

        Hier der richtige Link:

        http://www.bitworks.de/~selfHTML/Liste_Screenshot_MSIE5_5_02b.jpg

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      2. Hallo.

        Das ist aber nett[tm] gesagt. Aber ich mag gar nicht mehr klagen. Das Ziel für heute ist erreicht:

        Gratuliere :-)

        Die Buttons kommen morgen dran und dann die Detailansicht, in die man mit [?] umschalten kann. Wäre nun noch toll, wenn man einen :hover für den [?]-Button (Post, <input type="submit" ...>) definieren könnte.

        Definieren kannst du eine Menge. Versuche es doch, vielleicht funktioniert es ja mit dem einen oder anderen Browser.
        MfG, at

        1. Hello,

          Die Buttons kommen morgen dran und dann die Detailansicht, in die man mit [?] umschalten kann. Wäre nun noch toll, wenn man einen :hover für den [?]-Button (Post, <input type="submit" ...>) definieren könnte.

          Definieren kannst du eine Menge. Versuche es doch, vielleicht funktioniert es ja mit dem einen oder anderen Browser.
          MfG, at

          Leider nicht. Und onMouseover/onMouseout sind eben nur Bakshish. Funktioniert ja nicht immer...

          Wichtiger ist, dass die ganze Logik klappt mit den gestaffelten Formularen, Benutzerrechten, Ankern, Multipost-Schutz, Fakeschutz etc...

          Und nachher darf man eben nicht mehr eintppen müssen als (symbolisch):

          $formhandle = new_form(handle:$con,name:$table,array:$specs)

          und man kann arbeiten. Alles andere muss dan automatisch gehen.

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen