Avatar billede exp-ralle Nybegynder
06. juni 2003 - 20:43 Der er 14 kommentarer og
2 løsninger

Finde FilType der er valgt?

Hej

Hvordan finder man i delphi ud af hvilken filtype i filter brugeren har valgt...

Jeg har et filter med Tekst filer (*.txt)|*.txt og
PHP filer (*.php, *.php4)|*.php, *.php4

men jeg vil gøre sådan at hvis brugeren glemmer fil extention så sætter den det automatisk på... alt efter om man har valgt txt eller php filteret i filtype combo boxen (i en SaveDialog)

Har bakset med dette længe og jeg fatter jemen af det så plz hjælp...


Rasmus
Avatar billede exp-ralle Nybegynder
06. juni 2003 - 20:59 #1
Jeg har set det i 100 programmer... fx. Notesblok... det MÅ kunne lade sig gøre...
Avatar billede athlon-pascal Juniormester
06. juni 2003 - 21:03 #2
if (LowerCase(ExtractFileExt('c:\hest.test')) = LowerCase('.txt')) or (LowerCase(ExtractFileExt('c:\hest.test')) = LowerCase('.php')) or (LowerCase(ExtractFileExt('c:\hest.test')) = LowerCase('.php4')) then
    ShowMessage('Filnavnet er OK')
  else
    ShowMessage('Filnavnet er ikke OK');
Avatar billede exp-ralle Nybegynder
06. juni 2003 - 21:06 #3
HVad mener du nu med C:\hest.test?

Og desuden kan jeg ikke rigtigt bruge det der... for det er en løsning der automatisk SÆTTER ext'en PÅ hvis man ikke har skrevet en... ikke en der tjekker!
Avatar billede athlon-pascal Juniormester
06. juni 2003 - 21:06 #4
var
  FileName, FileExt: String;
begin
  FileName := 'c:\hest.test';
  FileExt := LowerCase(ExtractFileExt('c:\hest.test'));
  if (FileExt = LowerCase('.txt')) or (FileExt = LowerCase('.php')) or (FileExt = LowerCase('.php4')) then
    ShowMessage('Filnavnet er OK')
  else
    FileName := FileName + '.php';
end;
Avatar billede exp-ralle Nybegynder
06. juni 2003 - 21:17 #5
Jamen det skal virke med ALLE de der ext både .txt .php og .php4

Altså hvis du skriver Fil i filnavn og har valgt tekst filer i filter så sætter den auto .txt på og det samme med .php og .php4... kan ikke lige se at de du skrev her over ville virke hvis man valgte php filer i filter og skrev fx. fil... så burde den lave det om til fil.php og det er det jeg ikke kan...

Har kigget på SaveDialogs DefaultEXT event, det ser nogenlunde rigtigt ud men hvordan kan jeg have flere (.txt hvis tekst filer er valgt og .php hvis php filer er valgt...)!
Avatar billede athlon-pascal Juniormester
06. juni 2003 - 21:18 #6
Man skal vist ind og kigge på FilterIndex; og Filter; ...
Avatar billede exp-ralle Nybegynder
06. juni 2003 - 21:30 #7
Jeg har tjekket filterindex... det er bare hvilket filter (tekst filer/php filer) der skal være standard... og det hjælper ikke at ændre det (har prøvet).. og filter ændrer sig vel ikke i run time... det er jo en design time event hvor man sætter filteret... eller hvad??
Avatar billede athlon-pascal Juniormester
06. juni 2003 - 21:42 #8
Jeg er ved at prøve og finde noget :-)
Avatar billede exp-ralle Nybegynder
06. juni 2003 - 21:44 #9
Ok... se evt. om du kan finde noget om DefaultEXT tror måske det er det men beskrivelsen er dårlig...
Avatar billede athlon-pascal Juniormester
06. juni 2003 - 21:45 #10
Det har jeg prøvet ...
Avatar billede exp-ralle Nybegynder
06. juni 2003 - 21:56 #11
Ok se om du kan finde ud af noget andet der virker :D (hvis du gider? :D)!
Avatar billede athlon-pascal Juniormester
06. juni 2003 - 21:58 #12
Det er en lidt rodet kode, men så langt er jeg nået:

procedure TForm1.Button1Click(Sender: TObject);
var
  FileName, FileExt, S: String;
  StringList: TStringList;
  I: Integer;
begin
  if SaveDialog1.Execute then
  begin
    FileExt := LowerCase(SaveDialog1.Filter);
    StringList := TStringList.Create;
    FileExt := StringReplace(FileExt, '#', '#1', [rfReplaceAll] + [rfIgnoreCase]);
    FileExt := StringReplace(FileExt, ',', '#2', [rfReplaceAll] + [rfIgnoreCase]);
    FileExt := StringReplace(FileExt, ' ', '#3', [rfReplaceAll] + [rfIgnoreCase]);
    FileExt := StringReplace(FileExt, '|', ',', [rfReplaceAll] + [rfIgnoreCase]);

    Caption := FileExt;
    StringList.CommaText := FileExt;

    StringList.Text := StringReplace(StringList.Text, '#3', ' ', [rfReplaceAll] + [rfIgnoreCase]);
    StringList.Text := StringReplace(StringList.Text, '#2', ',', [rfReplaceAll] + [rfIgnoreCase]);
    StringList.Text := StringReplace(StringList.Text, '#1', '#', [rfReplaceAll] + [rfIgnoreCase]);
    I := 0;

    while I < StringList.Count do
    begin
      StringList.Delete(I);
      Inc(I, 1);
    end;
    for I := 0 to StringList.Count - 1 do
    begin
      S := StringList[I];
      if Pos(',', S) > 0 then
        S := Copy(S, 1, Pos(',', S) - 1);
      if Pos('*', S) = 1 then
        Delete(S, 1, 1);
      StringList[I] := S;
    end;
    ListBox1.Items.Assign(StringList);
    StringList.Free;
//    SaveDialog1.FilterIndex; SaveDialog1.Filter;
    FileName := SaveDialog1.FileName;
    FileExt := LowerCase(ExtractFileExt(FileName));
    if (FileExt = LowerCase('.txt')) or (FileExt = LowerCase('.php')) or (FileExt = LowerCase('.php4')) then
      ShowMessage(FileName + ' *')
    else
    begin
      FileName := FileName + '.php';
      ShowMessage(FileName);
    end;
  end;
end;
Avatar billede athlon-pascal Juniormester
06. juni 2003 - 22:08 #13
Det her virker halvt:

procedure TForm1.Button1Click(Sender: TObject);
var
  FileName, FileExt, S: String;
  StringList: TStringList;
  I: Integer;
begin
  if SaveDialog1.Execute then
  begin
    FileExt := LowerCase(SaveDialog1.Filter);
    StringList := TStringList.Create;
    FileExt := StringReplace(FileExt, '#', '#1', [rfReplaceAll] + [rfIgnoreCase]);
    FileExt := StringReplace(FileExt, ',', '#2', [rfReplaceAll] + [rfIgnoreCase]);
    FileExt := StringReplace(FileExt, ' ', '#3', [rfReplaceAll] + [rfIgnoreCase]);
    FileExt := StringReplace(FileExt, '|', ',', [rfReplaceAll] + [rfIgnoreCase]);

    Caption := FileExt;
    StringList.CommaText := FileExt;

    StringList.Text := StringReplace(StringList.Text, '#3', ' ', [rfReplaceAll] + [rfIgnoreCase]);
    StringList.Text := StringReplace(StringList.Text, '#2', ',', [rfReplaceAll] + [rfIgnoreCase]);
    StringList.Text := StringReplace(StringList.Text, '#1', '#', [rfReplaceAll] + [rfIgnoreCase]);
    I := 0;

    while I < StringList.Count do
    begin
      StringList.Delete(I);
      Inc(I, 1);
    end;
    for I := 0 to StringList.Count - 1 do
    begin
      S := StringList[I];
      if Pos(',', S) > 0 then
        S := Copy(S, 1, Pos(',', S) - 1);
      if Pos('*', S) = 1 then
        Delete(S, 1, 1);
      StringList[I] := S;
    end;
    ListBox1.Items.Assign(StringList);

    FileName := SaveDialog1.FileName;
    FileExt := StringList[SaveDialog1.FilterIndex - 1];
    if StringList.IndexOf(LowerCase(ExtractFileExt(SaveDialog1.FileName))) >-1 then
      ShowMessage(FileName + ' *')
    else
    begin
      FileName := FileName + FileExt;
      ShowMessage(FileName);
    end;
    StringList.Free;
  end;
end;

Den kan endnu ikke finde ud af det når en filtype har mere end et efternavn, da kan den kun med det første...
Avatar billede athlon-pascal Juniormester
06. juni 2003 - 22:08 #14
Forresten, slet ListBox1.Items.Assign(StringList);, det er kun noget jeg bruger til mine tests :-)
Avatar billede exp-ralle Nybegynder
06. juni 2003 - 22:14 #15
Hmm... fedt nok at du har gidet at lave sådan en kode til mig (prøver den senere, ser film) men tror du ikke det kan gøres på en simpel måde?
Avatar billede exp-ralle Nybegynder
06. juni 2003 - 22:44 #16
Hmm... fandt ud af en måde med DefaultEXT... det skulle bare være det samme som Filter...

Synes godt du kan få lidt point for alt den tid du har brugt her selvom jeg selv fandt "svaret", så vi deler...!
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