Skojarzenia plików

0

Potrzebuje takiej funkcji:

<font color="blue">Function JakasTamNazwa(s : string) : boolean;</span>

Która ma sprawdzać, czy podane w "s" rozszerzenie pliku , np "MP3" jest otwierane przez mój program (sprawdzenie w rejestrze).

0

A nie lepiej samemu napisać taką funkcję ???
Na prawdę jest to łatwe ( o rejestracji plików jest w dziale Delphi ).

Musisz użyć TRegistry, dostać się do HCR.rozszerzenie, a dalej dostać się do klucza HCR, który jest podany jako domyślna wartość klucza HCR.rozszerzenie. Potem wchodzisz w shell\open, a tam w domyślnym kluczu jest ścieżka do exeka który "obsługuje" to rozszerzenie.
jeśli ten klucz (odpowiednio obsięty, bo tam gdzieś się cudzysłowy) jest równy applicatiion.exename (lub paramstr(0) jak kto woli) to result=true, a jeśli nie to result=false

Teraz już to tylko przetłumacz na Pascala...

0

Hmm musze przyznać, że jeśli chodzi o rejestr.. To nie mam pojęcia co do mnie mówisz człowieku - jakoś nie wchodzi mi rejestr do głowy... byłbym wdzięczny jakby ktoś napisałem mi taką funkcję...

0

Funkcja sprawdzająca, czy z plikiem o rozszerzeniu Extension jest skojarzona aplikacja App (rozszerzenie powinno być podawane bez początkowej kropki):
[code]function CheckAssociation(const Extension, App: string): boolean;
var
Reg: TRegistry;
Desc, AppReg: string;
AppRegEx: array[0..MAX_PATH - 1] of Char;
begin
Result := False;
Reg := TRegistry.Create;
try
with Reg do
begin
RootKey := HKEY_CLASSES_ROOT;

  if not OpenKey('.' + Extension, False) then Exit;
  Desc := ReadString('');
  Desc := Desc + '\shell\open\command';
  CloseKey;

  if not OpenKey(Desc, False) then Exit;
  AppReg := ReadString('');
  ExpandEnvironmentStrings(PChar(AppReg), AppRegEx, MAX_PATH);
  AppReg := AppRegEx;
  if
    (UpperCase(App) = UpperCase(Copy(AppReg, 1, Length(App)))) or
    ('"' + UpperCase(App) + '"' = UpperCase(Copy(AppReg, 1, Length(App) + 2)))
  then Result := TRUE; ///////////////////////////////////////////
  CloseKey;
end;

finally
Reg.Free;
end;
end;[/code]
W klauzuli uses należy dodać moduł Registry:
[code]uses
Windows, SysUtils, ... , Registry;[/code]
(Funkcja poprawiona i uzupełniona.
Był jeden mały błędzik z cudzysłowami. Dodałem ExpandEnvironmentStrings ponieważ w ścieżkach do programów występują niekiedy zmienne środowiskowe, np. %SystemRoot%.
Teraz już chyba wszystko powinno być OK.)

0

Dałem na forme takie checkboxy:

<font color="blue">nazwa : ext_txt, caption: TXT
nazwa: ext_php, caption: PHP</span>itd...

Procedura sprawdzająca, którą wymyśliłem do tego:

<font color="green"> for i:=0 to Options.ComponentCount-1 do begin if (Options.Components[i] is TCheckBox) and (string(Options.Components[i].Name)[1] = 'e') and (string(Options.Components[i].Name)[2] = 'x') and (string(Options.Components[i].Name)[3] = 't') then begin (Notatnik.Components[i] as TCheckBox).Checked := CheckAssociation((Options.Components[i] as TCheckBox).Caption, Application.ExeName); end; end;</span>

PS: options to nazwa formy.

Kompiluje się normalnie, ale przy wykonianiu procedury wyskakuje:

<font color="red">Invalid Class Typecass</span>

Co jest grane?

0

Błąd jest w linii (Notatnik.Components[i] as TCheckBox).Checked....
Dokonujesz enumeracji komponentów formy Options wykorzystując zmienną i. W tej samej pętli dokonujesz rzutowania komponentów z formy Notatnik stosując tą samą zmienną i.

0

Faktycznie, był to błąd przez pomyłkę (nie zauważenie), już wszystko jest poprawione, ale .... nie działa. Próbowałem na różnych rozszerzeniach i nic - wszystkie CheckBoxy są ODZNACZONE.

Może jakiś błąd jest w tej funkcji ?

0

Był mały błędzik.
Zajrzyj do postu powyżej. Tam jest poprawiona funkcja CheckAssociation.

0

Niestety dalej nic z tego - dalej nie działa. Próbowałem nawet stworzyć nową aplikację i zrobić najprostsze sprawdzenie jakie się tylko da, na różnych rozszerzeniach - zawsze wartość jest na FALSE. Czy ktoś sprawdzał u siebie czy to działa. ?

0

Po pierwsze ja bym raczej sprawdza wasciwosc Controls a nie Components a po drugie nie tylko CheckBoxy sa komponentami a za tem to co zwroci wlasciwosc Components moze nie pochodzic z bazowej klasy TcheckBox! zatem przed rzutowaniem dodaj linijke

if Notatnik.Components[j] is TCheckBox then
tu wstaw twoj taki jak jest tzn.
if( Notatnik.Components[j] as TCheckbox).checked then
itd...

[cya]

0

Funkcja jest dobra na 99%.
U mnie wszystko działa OK.

Spróbuj tak:
[code]procedure Test;
begin
if CheckAssociation('exe', '%1') then
ShowMessage('True')
else
ShowMessage('False');
end;[/code]
Powinien pojawić się komunikat z True.
Pamiętaj, że funkcja zwróci True tylko wtedy, gdy z rozszerzeniem Extension skojarzona jest aplikacja App.
Gdzie:
Extension - rozszerzenie bez początkowej kropki (np.: Extension := 'txt');
App - pełna ścieżka do programu (np.: App := 'C:\WINNT\system32\notepad.exe').
Jakbyś udostępnił fragment kodu, to może mógłbym więcej pomóc.

0

Niestety dalej wielkie NIC. Już myślałem, że bład tkwi w innej części kodu, dlatego postanowiłem zrobić zupełnie nową - testową aplikacje.

Cały kod (żeby był wszystko jasne):

[code]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Registry;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function CheckAssociation(const Extension, App: string): boolean;
var
Reg: TRegistry;
Desc, AppReg: string;
AppRegEx: array[0..MAX_PATH - 1] of Char;
begin
Result := False;
Reg := TRegistry.Create;
try
with Reg do
begin
RootKey := HKEY_CLASSES_ROOT;

if not OpenKey('.' + Extension, False) then Exit;
Desc := ReadString('');
Desc := Desc + '\shell\open\command';
CloseKey;

if not OpenKey(Desc, False) then Exit;
AppReg := ReadString('');
ExpandEnvironmentStrings(PChar(AppReg), AppRegEx, MAX_PATH);
AppReg := AppRegEx;
if
(UpperCase(App) = UpperCase(Copy(AppReg, 1, Length(App)))) or
('"' + UpperCase(App) + '"' = UpperCase(Copy(AppReg, 1,Length(App) + 2)))
then Result := TRUE; ///////////////////////////////////////////
CloseKey;
end;
finally
Reg.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if CheckAssociation('php', Application.ExeName) then
ShowMessage('True')
else
ShowMessage('False');
end;

end.[/code]

Wstawiłem jeden TButton, i mimo czy daje skojarzenie php na ten program czy też inny, zawsze pokazuje się FALSE. Już mnie to zaczyna zdeczka denerwować. Proszę HELP Me..

<font color="blue">PS: Mam Borland Delphi 6.0 Enterprise + Windows XP Professional SP1</span>

0

Hmmm.... mnie też to zainteresowało :)
ale niestety mi działa dobrze [glowa]

p.s. wprowadziłem drobną zmianę co
do klucza 'open' może o to chodzi...

function CheckAssociation(Ext, App: String): Boolean;
var
  Reg : TRegistry;
  Tab : Array[0..255] of Char;
begin
  Result := False;
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_CLASSES_ROOT;
  if Reg.OpenKey('.' + Ext, False) then
  begin
    Ext := Reg.ReadString('');
    Reg.CloseKey;
    if Reg.OpenKey(Ext + '\shell', False) then
    begin
      Ext := Reg.ReadString('');
      if Ext = '' then Ext := 'open';
      if Reg.OpenKey(Ext + '\command', False) then
      begin
        Ext := Reg.ReadString('');
        ExpandEnvironmentStrings(PChar(Ext), Tab, 256);
        Ext := Tab;
        Result := Pos(UpperCase(App), UpperCase(Ext)) > 0;
        Reg.CloseKey;
      end;
    end;
  end;
  Reg.Free;
end;
0

Ktoś ma może jakiś pomysł dlaczego to mi nie działa.. mi się wydaje, że chodzi o system XP - jakieś pomysły?

0

Ktoś ma może jakiś pomysł dlaczego to mi nie działa.. mi się wydaje, że chodzi o system XP - jakieś pomysły?

też mam XP, a może wklej wyciąg z klucza phpfile\shell ?
no nie wiem, dziwne to to...

0

Byłbym wdzięczny, jakby ktoś mi wysłał na maila skompilowany program - testujący np. 'php' albo 'ini' - obojętnie - może ja mam tu cos źle. Mój mail: [email protected]

Z góry THX!

1 użytkowników online, w tym zalogowanych: 0, gości: 1