Avatar billede TRoXa Novice
22. marts 2000 - 11:01 Der er 16 kommentarer og
1 løsning

Fil registrering inde i sit program

Jeg har et meget stort problem....

Jeg har startet et helt nyt project, og indsat en memo på den.

Hvad jeg nu vil er, når jeg dobbeltklikker ude i explorer, så vil jeg have den f.eks tekstfilen til at blive åbnet i mit program der kører, og hvis jeg trykker på endnu et tekst dokument skal den åbne det nye.

Jeg acceptere ikke et svar der lyder på, at programmet skal lukkes ned hver gang man åbner en ny fil :)

Hvis jeg ikke har forklaret problemet godt nok, så bare spørg
Avatar billede sjensen Nybegynder
22. marts 2000 - 14:23 #1
troxa,

når du registrerer filtypen (f.eks. TXT til at blive åbnet med dit program, vil windows aktivere dit program når du dobbeltklikker på en txt-fil.

Du skal derfor først og fremmest sørge for at der under filtyper for TXT filer er angivet at det er dit probgram der skal bruges til at åbne med.

Der er så flere metoder til at få fat i filen på, men den bedste vil være at "grappe" windows meddelelsen der kommer med "Open". I datadelen af meddelelsen er filnavnet anngivet, og du kan så lave dit program s^ledes at den fra memoen åbner filen med Memo1.loadfromfile(xx);

Denne metode skal du anvende når dit program er startet op. Når det ikke er altivt, er jeg ikke sikker på at dit program vil se windowsmeddelelsen fordi den allerede er behandlet af SHELL, så du skal starte med at læse paramstr(1)når programmet starter for at du kan åbne den fil der igangsætter programmet.

Denne metode vil du så samtidig kunne bruge til at aktivere programmet fra en kommandolinie hvor filnavnet er angivet som et parameter til programmet.

Avatar billede michaelras Nybegynder
22. marts 2000 - 15:39 #2
For at kunne åbne i et allerede kørende program, ved at dobbeltklikke i Explorer er det letteste vist nok at bruge DDE, den er vist også de eneste måde, mener jeg... (dvs. er ikke 100% sikker)

Michael
Avatar billede lrj Nybegynder
22. marts 2000 - 21:59 #3
michaelras> Så hut jeg visker er DDE ved at blive udfaset. Hvad afløseren så er, skal jeg ikke gøre mig klog på :) OLE?
Avatar billede TRoXa Novice
24. marts 2000 - 09:02 #4
Til Sjensen

Uhmm det som du skriver ved jeg godt.. michaelras er vist inde på noget af det jeg snakker om.. Det du fortæller er hvis programmet ikke kører, men jeg skulle gerne kunne sende de nye filer til det allerede åbne program... så derfor bliver jeg indtil videre nødt til at afvise dit svar

Håber i fortsat kan hjælpe mig.

TRoXa
Avatar billede lrj Nybegynder
25. marts 2000 - 23:32 #5
troxa - du associerer en filtype (ex. .txt) med dit program. Når der dobbeltclickes på programmet startes en ny kopi af det op, og det får at vide hvilken fil det skal åbne. Men her kommer tricket så: Når dit program starter op skal det checke om der allerede kører en kopi af det - gør der det, skal den eksisterende kopi have at vide at den skal åbne filen, og den nye version lukker så.

Mere overskueligt: bogstaverne refererer til samme program (dit).

A startes op.
Brugeren dobbeltklikker på en fil, som er associeret med dit program.
B starter, med information (fået fra windows) om hvilken fil det åbnes med.
B finder ud af at A kører, og fortæller A at den skal åbne filen. B lukker herefter ned.


See?
Avatar billede TRoXa Novice
30. marts 2000 - 09:36 #6
lrj... det ved jeg godt hehe... men fortæl mig hvordan jeg gør det, og du får de 60 points
Avatar billede lrj Nybegynder
01. april 2000 - 16:56 #7
hemmeligheden ligger i SendMessage funktionen. Mere tør jeg vist ikke afsløre :o)
Avatar billede jchris10 Nybegynder
12. april 2000 - 13:11 #8
Du kan bruge win-api kaldet CreateMutex(..) til at være sikker på, at der kun kan åbnes én kopi af programmet. Du kan vha. "GetLastError()" få en "ERROR_ALREADY_EXISTS" fejl, som fortæller at en kopi af programmet allerede kører, derigennem kan du vha. en TRY..Except fange denne, og derefter bruge "sendmessage" til den allerede åbne kopi af programmet og bede den om at åbne filen !

Simpelt ikk' ;-)

/Jan
Avatar billede TRoXa Novice
01. maj 2000 - 14:30 #9
Jeg er ked af at jeg har været langsom her på det sidste, men jeg har ikke kunne komme ind på eksperten fra min skole, men nu skulle det vidst virke igen.

Jan, jeg fatter nul af hvad du sagde der, så hvis du gad lave et eksempel til mig, så skal du nok få dine points + lidt ekstra, hvis jeg kan bruge det.
Avatar billede lrj Nybegynder
01. maj 2000 - 15:13 #10
Syntax
CreateMutex(
lpMutexAttributes: PSecurityAttributes;         {a pointer to security attributes}
bInitialOwner: BOOL;                 {flag for the initial ownership}
lpName: PChar                     {mutex object name}
): THandle;                    {returns a handle of the mutex object}

Et eksempel kunne så være i din initialization for unit1:

//global variabel:
var
  myMutex : THandle;


begin
  myMutex := CreateMutex(nil,false,application.filename);
//sidste parameter skal bare være unik for dit program... men det samme HVER gang du kører det..

  if GetLastError=ERROR_ALREADY_EXISTS then
  begin
    //send en message til det allerede kørende program, og bed det om at komme til forgrunden eller noget... hertil bruges SendMessage
    application.close; //så skal dette kode jo nok ikke være i initialization - aner ikke om det ville gå godt..
  end;
end;

så skal du så huske, når dit program lukker ned skal du skrive:

CloseHandle(myMutex);

dette er temmelig vigtigt, for jeg tror du vil få svært ved at starte programmet igen hvis du glemmer det... :)

Hjalp det?
Avatar billede jchris10 Nybegynder
02. maj 2000 - 08:01 #11
Sådan...se svaret fra Irj, jeg "gider" ikke at skrive det igen.
Avatar billede jchris10 Nybegynder
02. maj 2000 - 08:13 #12
Jeg er dog ikke sikker på, at det vil virke under initialization, jeg har lagt det under Form1.FormCreate(). Her virker det.

Derudover skal du ikke bruge CloseHandle(myMutex) men derimod ReleaseMutex(MyMutex).

Jeg har et andet eksempel, hvis du ikke kan få ovennævnte til at virke.
Avatar billede lrj Nybegynder
02. maj 2000 - 10:27 #13
jchris> Måske har du ret i at der skal bruges ReleaseMutex - eksemplet er taget fra "The tomes of Delphi 3 - Win32 Core API" - og de eksempler plejer at være ret præcise...

Whatever :)
Avatar billede TRoXa Novice
07. august 2000 - 12:04 #14
Tak for hjælpen... Jeg har ikke kunne komme på internet i lang tid, men nu er jeg tilbage :)

Jeg synes at JChris10 har fortjent pointene. Håber at det er ok med dig LRJ
Avatar billede lrj Nybegynder
07. august 2000 - 18:42 #15
Tjah, sådan kan det jo gå. Det var dog mig der kom med koden, så en anden gang var det nok federe at fordele pointsene... Ik\'?
Avatar billede TRoXa Novice
08. august 2000 - 10:06 #16
Lrj... Jeg er endnu ikke så kendt herinde, så det vidste jeg ikke at man kunne... sorry :(
Avatar billede lrj Nybegynder
18. august 2000 - 19:11 #17
Det er okay - men der står en lille fin vejledning når man accepterer svar. Det eneste problem er lige at læse hvad der står før man trykker okay - ganske udbredt ;)
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