22. marts 2000 - 11:01Der 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
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.
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)
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
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.
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 !
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.
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... :)
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...
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 ;)
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.