16. august 2002 - 08:55Der er
20 kommentarer og 1 løsning
Gns. antal pixel pr karakter
Er der nogen der har kendskab til en tommerfingerregel for hvor mange pixels, man skal anvende pr. karakter, når man vil designe hvor bredt f.eks et TEditField skal være for at kunne indeholde en gennemsnitligt dansk tekst. Det er en fast proportional font, så der er jo himmelvid forskel på bredden af et 'i' og et 'W'.
Glem alt om gennemsnit. Tag i stedet udgangspunkt i "W" (som det bedeste tegn), og lav dit felt bredt nok til x-antal af dette tegn (så bliver dit felt alrig for lille). Funktionen "TextWidth" kan fortælle dig breeden af disse X-antal "W" tegn.
Fra Delphi's egen hjælp <SNIP> TCanvas.TextWidth Returns the width, in pixels, of a string rendered in the current font.
function TextWidth(const Text: string): Integer; function TextWidth(const Text: WideString): Integer;
Description
Use TextWidth to determine the length a string will occupy in the image. TextWidth indicates whether a given string will fit in the available space. Other graphical elements in the image such as lines, or additional strings can be positioned to accommodate the width of the text.
TextWidth returns the same value as TextExtent(Text).cx. </SNIP>
pellelil: At sætte width efter 'W' er overkill, da feltet så i 99% tilfælde vil være alt for bredt, og ødelægge designet af resten af billedet. Borrisholt: Hvordan kan man måle en streng man ikke kender? Jeg synes ikke at der er nogen af svarene, der dur, beklager.
Hvis "W" er overkill" så må "i" være underkill. Måske det er en skade jeg pådrog mig da jeg for år tilbage lavede systemer til styring af beton/asfalt-produktion, men jeg mener at man som programmør altid skal tage udgangspunkt i "worst-case-scenario" (eller Murphy's love: "hvad der kan gå galt, går galt"). I denne hensende bliver dit felt med "W" ALDRIGT for kort, og du vil ALDRIG komme ud for at man ikke kan læse hele feltets indhold (uden at skulle scrolle).
Der findes ikke noget "fast definieret gennemsnit", så hvis "I" er det mindste tegn og "W" det sørste kan du jo bare lave hver-anden-af-hver !?
Ikke for at være kræsen, men mit oprindelige spørgsmål gik på "kendskab til en tommerfingerregel for hvor mange pixels, man skal anvende pr. karakter". Selvom I har mange gode overvejelser, har I ikke dette kendskab, muligvis fordi en sådan tommerfingerregel ikke findes. Jeg er dog ret sikker på at en sådan kunne laves, lidt ligesom LIX-målinger.
Der findes ikke noget "fast definieret gennemsnit", eller "tommelfingerregel" om du vil. Du har 2 muligheder: enten laver du plads til den længst mulige streng eller også "opfinder du selv" et gennemsnit. Hvis vi endelig skal kalde det et gennemsnit kunne: hver anden "I", hver anden "W" være et udmærket foreslag da du således vil få et felt der er midt i mellem den korteste og den længste (vel og mærke hvis alle x-antal tegn er i brug, men her kan man igen argumentere for at hvis feltet er 30 tegn lagt så vil det måske gennemsnitligt kun bestå at 22 tegn).
På et eller andet sæt er du nødt til at tage udgangspunkt i "TextWidth ", da et skift i font-valg kan få hele billedet til at se anderledes ud. Men andre ord et gennemsnit/tommelfingerregl med en font-type kan være helt anderledes med en anden font-type (også selv om de begge er PS)
Eksemplet her sætter bredden på en edit til at kunne rumme 20 gennemsnitlige tegn.
procedure TForm1.Button2Click(Sender: TObject); const CharCount = 20; var DC : HDC; TM : TTextMetric; Old : THandle; begin DC := GetDC(Edit1.Handle); try Old := SelectObject(DC, Edit1.Font.Handle);
Forskellen må vel være "tmAveCharWith", som netop er det "fast definerede gennemsnit" som jeg påstod ikke fandtes, men i følge hjælpen: <SNIP> tmAveCharWidth
Specifies the average width of characters in the font (generally defined as the width of the letter x). This value does not include the overhang required for bold or italic characters. </SNIP>
Så ved jeg ikke hvor meget "jeg vil gi'" for dette gennemsnit. Dels typer det på at den "bare" tager udgangspunkt i "x" og at "x" altid - ved brug af en hver font er det "gennemsnitlige bogstav" vil jeg stærkt tyde på. Derudover hvis man skal lave et reelt "gennemsnit" er man endvidere nødt til at tage udgangspunkt i det pågældendes sprog da brugen af de enkelte bogstaver heller ikke er uvæsentlig (eksempelvis forekommer "w" og "x", "y", "z" ikke så ofte på Dansk som det gør på Engelsk, og de har slet ikke vores Danske bogstaver).
pellelil: Det er rigtigt at tmAveCharWith ikke tager højde for den statistiske anvendelse af de enkelte bogstaver på de enkelte sprog, og det ville være dejligt, hvis denne funktionalitet fandtes, men GetTextMetrics afspejler alligevel et forsøg på at løse problemet, og er det bedste bud på at løse problemet, jeg har set endnu.
erve> Jamen jeg har skam heller ingen problemer med at nico22 får point'ene, eftersom han gav det svar du søgte. Jeg påpeger såmænd bare at dette "gennemsnit" er en tilnærmet og til tider fejlagtig methode.
Alt efter skærmbilledets udseende ville jeg personligt enten lave plads til x-antal W'er eller også afsætte hvad jeg synes vil være passende - "uanset hvad Microsoft synes at gennenmsnittet skal være" (læs: uden at kalde GetTextMetrics)
Ellers kan man jo bare bruge Courier New som font. Grimt, men det virker om man er sikker på at det passer. Det minder en om de gode gamle dage hvor man kun brugte tegn af fast bredde (C64 bl.a.)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.