Avatar billede pablopablo Nybegynder
29. december 2004 - 16:11 Der er 6 kommentarer

Hjælp til Font metoder

Hejsa...

Jeg har nogle font som i C# winform som jeg skal kunne gemme i i acccess database og selvfølgelig kunne læse ind igen...

Jeg har stort set fundet ud af hvordan jeg lettest kan gøre det, men der et lille problem...

Nedenfor kan i se et lille eks. på hvordan jeg har gjort...

Font f = new Font("Arial",8);

//Lægges senere i db...
string test2 = f.ToHfont().ToString();

//Læses senere fra db...
IntPtr i = (IntPtr)Int32.Parse(test2);

som i måske allerede ved eller kan gætte jer til, generere metoden "ToHfont" et 32 bit int nr, så jo gerne skulle repræsentere de forskellige fonte der nu engang eksistere...problemet er blot, at det IKKE er det samme nummer som genereres hver gang koden køres! er det ikke mærkeligt?? Når det ikke er det, ja så virker det jo selvsagt heller ikke når jeg skal læse det ind fra databasen igen...den kan ikke tolke nummeret som blev ligger gemt i databasen, den siger at den ikke er en "True Type" font...trods det samme nummer virker fint i det lille eksempel...dvs. inden det bliver skrevet til databasen...

Håber meget i kan hjælpe mig med mit mytiske problem...;)

Mvh. PabloPablo
Avatar billede tomjelen Nybegynder
29. december 2004 - 19:02 #1
Jeg ved ikke hvor du har læst, at Font.ToHfont() skulle give et nummer der repræsentere de forskellige fonte der eksistere.

I følge msdn giver ToHfont() dig et windows handle for dit Font object. Et windows handle er en slags ID, som windows bruger til at identificere din font. Når du f.eks. åbner en fil, så får man et windows handle til denne fil. Når du så senere skal læse eller noget andet fra filen, så giver du det handle til windows så den fatter hvilken fil du snakker om.

Så det tal du har fået fra ToHfont(), identificere kun den enkelte instans af din font klasse. Det tal er forskelligt fra instans til instans, derfor kan du kun bruge det til at referer til en "levende" instans af objektet.

Hvis du prøver at afvikle følgene linier, vil du se at test1 og test2 har helt forskellige værdier.

System.Drawing.Font f = new System.Drawing.Font("Arial",8);
System.Drawing.Font f2 = new System.Drawing.Font("Arial",8);

string test1 = f.ToHfont().ToString();
string test2 = f2.ToHfont().ToString();

Så metoden vil ikke kunne bruges til det du prøver på, hvis du vil bruge værdien til at genoprette fonten efter formen er blevet lukket, eller font objectet er blevet disposed.
Avatar billede pablopablo Nybegynder
29. december 2004 - 22:19 #2
ok! Tak for den fine forklaring...men ved du hvordan jeg lettest gør det jeg reelt ønsker...?-)
Avatar billede erikjacobsen Ekspert
29. december 2004 - 22:21 #3
Ja, du kan jo ikke gemme nummeret. Men gem så oplysningerne: "Arial",8 og håb på at
fonten findes på maskinen der skal bruge det.
Avatar billede tomjelen Nybegynder
29. december 2004 - 22:50 #4
Du kan gøre som erikjacobsen skriver, eller du kan også vælge at serialize objektet og gemme det i din database som binær data.

Det sidste an evt. gøres på følgende måde:

using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

Font fnt1 = new Font("Arial",8);

BinaryFormatter fmt1 = new BinaryFormatter();
MemoryStream ms1 = new MemoryStream();

fmt1.Serialize(ms1, fnt1);

byte[] fontdata = ms1.GetBuffer();
ms1.Close();
// Gem byte array i db

// hent byte array fra db
byte[] fontdata2 = fontdata;

BinaryFormatter fmt2 = new BinaryFormatter();
MemoryStream ms2 = new MemoryStream(fontdata2);
Font fnt2 = (Font)fmt2.Deserialize(ms2);
ms2.Close();
Avatar billede pablopablo Nybegynder
29. december 2004 - 23:59 #5
ok, tak for eksemplet! Microsoft kunne da godt have gjort det noget lettere synes jeg - fx på den måde jeg først troede ToHfont virkede på...;)

Anyway - læg et svar tomjelen og få dine velfortjente points!
Avatar billede tomjelen Nybegynder
30. december 2004 - 09:27 #6
ok :)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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