Avatar billede mj89dk Nybegynder
17. januar 2004 - 12:57 Der er 10 kommentarer

Registry - DefaultIcon & kun en instance

Hej!

Inde på en eller anden side fandt jeg noget kode til at gøre sådan at ens programmer åbner filtypen .xxx

Det virker fint, bortset fra koden til ikonet. Den laver kort sagt ikke ikonet om.

Her er koden jeg benytter:

    Reg := TRegistry.Create;

    Reg.RootKey := HKEY_CLASSES_ROOT;
    Reg.OpenKey('FreeMail', True);
    Reg.WriteString('', 'FreeMail fil');
    Reg.CloseKey;

    Reg.OpenKey('FreeMail\DefaultIcon', True);
    Reg.WriteString('', Application.ExeName+',0');
    Reg.CloseKey;

    Reg.OpenKey('FreeMail\shell\open\command', True);
    Reg.WriteString('', Application.ExeName + ' "%1"');
    Reg.CloseKey;

    Reg.RootKey := HKEY_CLASSES_ROOT;
    Reg.OpenKey('.fmsg', True);
    Reg.WriteString('', 'FreeMail');
    Reg.CloseKey;
    Reg.Free;


Så et andet spørgsmål, hvordan gør jeg sådan at den ikke åbner en ny kopi af mit program, men åbner det program som allerede kører?

Hilsen Mark
Avatar billede mj89dk Nybegynder
17. januar 2004 - 12:58 #1
Lige et andet spørgsmål, kan jeg gøre sådan, at den ikke bruger mit programs ikon, men et ikon jeg har fx i en ico fil (eller en TIcon)?
Avatar billede mj89dk Nybegynder
17. januar 2004 - 13:41 #2
Ved ikke lige hvad der er sket (har leget lidt med det), men nu laver den ikonet om, men nu kan man ikke åbne ved at dobbeltklikke.. Koden:

    Reg := TRegistry.Create;

    Reg.RootKey := HKEY_CLASSES_ROOT;
    Reg.OpenKey('FreeMail', True);
    Reg.WriteString('', 'FreeMail fil');
    Reg.CloseKey;

    Reg.OpenKey('FreeMail\DefaultIcon', True);
    Reg.WriteString('', Application.ExeName+',0');
    Reg.CloseKey;

    Reg.OpenKey('FreeMail\shell\open\command', True);
    //Reg.WriteString('', '"'+Application.ExeName + ' %1"');
    Reg.WriteString('', '"'+Application.ExeName+'" "%1"');
    Reg.CloseKey;

    //Reg.RootKey := HKEY_CLASSES_ROOT;
    Reg.OpenKey('.fmsg', True);
    Application.Icon.SaveToFile(ProgramDir+'icon.ico');
    Reg.WriteString('', ProgramDir+'icon.ico');
    Reg.CloseKey;
    Reg.Free;
Avatar billede mj89dk Nybegynder
17. januar 2004 - 14:15 #3
Fandt selv ud af det... Men hvorn gør man sådan at den åbner i det kørende program, ikke åbner programmet igen?
Avatar billede baxos Nybegynder
17. januar 2004 - 21:47 #4
måske lyder det lidt dumt men prøv dette
lav et Boolean i reg name  procces    hvergang programmet kører skal den være true og hvis det er lukket false så kan du arbejde vidre derfra ^^
Avatar billede baxos Nybegynder
17. januar 2004 - 21:59 #5
så kan du også lave et lille client program som heletiden tjekker om man åbner en fil hvis den bliver åbnet tjekker den det via reg
Avatar billede mj89dk Nybegynder
18. januar 2004 - 16:22 #6
Hmm.. en idé.. tror bare ikke det er smart at åbne og lukke regdb'en hele tiden.. Vil lige høre om der er en anden måde..
Avatar billede hrc Mester
19. januar 2004 - 12:48 #7
Når dit program startes må det søge efter allerede åbne instanser. Hvis der findes andre, så skal det tage fat i instansen og fodre den med de parametre som programmet ligger inde med og derefter terminere (på en eller anden måde må du forhindre at den anden instans forsøger at sende parametrene tilbage igen (den skal ikke tjekke om der er andre instanser - for der kan jo gå lidt tid inden det er afsluttet).

En anden løsning er kun at tillade een instans.
Avatar billede hrc Mester
19. januar 2004 - 12:58 #8
I øvrigt kan dit brug af registreringsdatabasen forbedres lidt. Der er bl.a ingen grund til at bruge CloseKey før alle data er skrevet til databasen - en Free til TRegistry vil også skrive det hele (alternativt kan du lege lidt med LazyWrite propertien):

with TRegistry.Create do
  try
    RootKey := HKEY_CLASSES_ROOT;
    if OpenKey('FreeMail',true) then
      WriteString('', 'FreeMail fil'); // Default values from WinNT and up

    if OpenKey('FreeMail\DefaultIcon', True) then
      WriteString('', Application.ExeName+',0');

    if OpenKey('FreeMail\shell\open\command', True) then
      WriteString('', Application.ExeName + ' "%1"');

    if OpenKey('.fmsg', True) then
      WriteString('', 'FreeMail');
  finally
    Free;
  end;
Avatar billede hrc Mester
25. januar 2004 - 00:55 #9
Er du kommet videre med problemet?
Avatar billede mj89dk Nybegynder
26. januar 2004 - 19:16 #10
hrc -> Du skriver:
"En anden løsning er kun at tillade een instans."
Hvordan gør jeg dette?

Til den anden løsning:
Har du lidt kode (evt en artikel)?

Hilsen Mark
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