Avatar billede erve Nybegynder
16. august 2002 - 08:55 Der 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'.
Avatar billede borrisholt Novice
16. august 2002 - 08:58 #1
du kan jo selv måle det med Canvas.TextWidth og  Canvas.TextHeight .. Så er det jo blot at bruge en font der "ligner" din

Jens B
Avatar billede pellelil Nybegynder
16. august 2002 - 09:02 #2
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>
Avatar billede borrisholt Novice
16. august 2002 - 09:13 #3
Ti hi Pelle ...

Min hest og jeg er for hurtige ...

Jens B
Avatar billede pellelil Nybegynder
16. august 2002 - 09:20 #4
Hov, hov, hvad hedder hesten? Tror du ikke hellere at den vil dele evt. point med sin navne-bror !?

Hvad blev det forøvrigt til med mit "sæt-størrelsen-på-vinduet-for-et-andet-program" program ?
Avatar billede erve Nybegynder
16. august 2002 - 09:24 #5
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.
Avatar billede pellelil Nybegynder
16. august 2002 - 09:31 #6
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 !?
Avatar billede doc404 Novice
16. august 2002 - 10:00 #7
De to heste interesserede herrer har ret... Du kan jo blot brug Canvas.TextWidth med din gennemsnitlige danske tekst som argument.
Avatar billede borrisholt Novice
16. august 2002 - 10:03 #8
doc404 >> Selvfølgelig har vi ret .....

========  DET HAR VI ALTID  ========

Get use to it :-)

Jens B
Avatar billede borrisholt Novice
16. august 2002 - 10:04 #9
Pelle mhv .. sæt-størrelsen-på-vinduet-for-et-andet-program Så er det blor at grave handlet frem til det også sætte SetClientRect ....

Jens B
Avatar billede pellelil Nybegynder
16. august 2002 - 10:38 #10
Sådan Borrisholt, tell him <G>
Avatar billede erve Nybegynder
16. august 2002 - 12:56 #11
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.
Avatar billede pellelil Nybegynder
16. august 2002 - 13:08 #12
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)
Avatar billede nico26 Nybegynder
16. august 2002 - 17:09 #13
procedure TForm1.Button1Click(Sender: TObject);
var
  TM : TTextMetric;
begin
  GetTextMetrics(Canvas.Handle, TM);
  ShowMessage(Format('Gns. bredde: %d', [TM.tmAveCharWidth]));
end;
Avatar billede nico26 Nybegynder
16. august 2002 - 17:19 #14
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);

    GetTextMetrics(DC, TM);
    Edit1.ClientWidth := TM.tmAveCharWidth * CharCount;

    SelectObject(DC, Old);
  finally
    ReleaseDC(Edit1.Handle, DC);
  end;
end;
Avatar billede erve Nybegynder
16. august 2002 - 20:29 #15
nico22: Sådan - tak! Det var squ da lige GetTextMetrics jeg skulle bruge. Interessant struktur iøvrigt den der TEXTMETRIC.
Avatar billede nico26 Nybegynder
16. august 2002 - 20:32 #16
yep - mange finurlige informationer :)
Avatar billede borrisholt Novice
19. august 2002 - 08:17 #17
erve >> Fortæl mig lige forskellen på den svar nico22 afgav og så mit/Pelles ?

Jens B
Avatar billede pellelil Nybegynder
19. august 2002 - 09:06 #18
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).
Avatar billede erve Nybegynder
19. august 2002 - 13:06 #19
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.
Avatar billede pellelil Nybegynder
19. august 2002 - 13:24 #20
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)
Avatar billede hlj Nybegynder
20. august 2002 - 11:36 #21
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.)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester