[Delphi] savedialog & savepicturedialog

Pagina: 1
Acties:
  • 107 views sinds 30-01-2008
  • Reageer

  • marenk_vos
  • Registratie: Augustus 2001
  • Laatst online: 23-07 13:21
Ik probeer op een eenvoudige manier de gebruiker bestanden te laten opslaan. Nu is het zo dat als ik van de savedialog de property filename aan roep (na het executen) dat de extentie niet automatisch wordt overgenomen. Ik kan ook geen extention of zoiets vinden als property. De gebruiker moet deze dus alsnog zelf intypen ook al heeft de gebruiker de extentie al gekozen.

Hebben jullie dit zelf ook en hebben jullie hier een oplossing voor zodat de gebruiker bijvoorbeeld als naam AFBEELDING kan intypen en dan de extentie uit het lijstje kan KIEZEN en deze niet daarna ook nog hoeft in te typen.

Het gaat om Delphi 5

[ Voor 0% gewijzigd door marenk_vos op 31-10-2002 09:15 . Reden: versie delphi niet vermeld ]

Dell XPS 17 Intel i7 2630 Nvidia GT555 3Gb Hd1: OCZ Vertex 2 SSD 60 GB Hd2: 500Gb


  • Quitter3
  • Registratie: Januari 2001
  • Laatst online: 13-02 16:30
Dit moet je zelf implementeren.
Bij properties->filter, kun je filters zetten. Bijv Afbeelding : *.jpg
Als de gebruiker deze kiest, kun je OnTypeChanged event afvangen. In deze event handler kun je dan vervolgens aan de hand van FilterIndex bepalen welek extensie je moet gebruiken.

  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 09-01 10:13

MaxxRide

Surf's up

Dit hangt trouwens ook nog af van wat de gebruiker intoetst. Ik ben altijd geneigd om wel gewoon een extensie in the tikken bij de filename, in dat geval krijg je dus WEL de juiste extensie en hoef je deze er dus niet meer aan te plakken....

Je zult er dus eerst even op moeten checkuh.

If you are not wiping out you are nog pushing enough...


  • marenk_vos
  • Registratie: Augustus 2001
  • Laatst online: 23-07 13:21
ik stel mij dan zoiets voor: de gebruiker toets een naam in al dan niet met extentie, als de gebruiker op het extetievakje klikt en hij verandert de extentie dan moet ik dus de extentie achter de filename plakken (dus gewoon opnieuw de filename uitlezen en controleren of de gekozen extentie al in de filenaam zit, zo niet, DAN de extentie uitlezen en erachter plakken. Maar waar kan ik die gekozen extentie vinden? savepicturedialog. ??????

Dell XPS 17 Intel i7 2630 Nvidia GT555 3Gb Hd1: OCZ Vertex 2 SSD 60 GB Hd2: 500Gb


  • Quitter3
  • Registratie: Januari 2001
  • Laatst online: 13-02 16:30
De extensies staan met de naam in de property filter. Ze staan allemaal in 1 string.
de verschillende mogelijkheden worden gescheiden door | .
v.b: 'Text files (*.txt)|*.TXT | Pascal files (*.pas)|*.PAS'

De property FilterIndex geeft aan welke geselecteerd is. Je moet nu dus met deze FilterIndex de goede extensie uit de string halen.
Pas op: de naam en extentie van een Filter worden ook gescheiden door een |.

  • marenk_vos
  • Registratie: Augustus 2001
  • Laatst online: 23-07 13:21
Ik heb een stukje code gemaakt maar het werkt nog niet helemaal:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure Tfrmafbeeldingen.SavePictureDialog1TypeChange(Sender: TObject);
var teller:integer;
    i:integer;
    burp:string;
begin
str:=SavePictureDialog1.Filter;
teller:=SavePictureDialog1.FilterIndex*2;
i:=0;
while i<teller do
   begin
   burp:=leestotscheidingsteken('|',str);
   i:=i+1;
   end;
showmessage(burp);
end;

function Tfrmafbeeldingen.leestotscheidingsteken(separator:string;str:string):string;
var i : integer;
begin
i:=Pos(separator, str);
Result := Copy(str, 1, i-1);
Delete(str, 1, i);
showmessage(str);
end;


Op de een of andere manier werkt de delete niet, hij verwijderd het stuk van de string niet.

Dell XPS 17 Intel i7 2630 Nvidia GT555 3Gb Hd1: OCZ Vertex 2 SSD 60 GB Hd2: 500Gb


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Hij verwijderd het als het goed is wel uit de veriable str van de functie leestotscheidingsteken.

Maar str wordt nooit meer teruggegeven dus voor de functie SavePictureDialog1TypeChange veranderd ie niet.

Het is een beetje vreemde constructie die je gemaakt hebt en ik denk dat ie nog wel wat debuggen nodig heeft, maar wat de oplossing op je vraag is dit:

code:
1
function Tfrmafbeeldingen.leestotscheidingsteken(separator:string; var str:string):string;

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Als je nu geen filter op geeft en daarna zelf de file extention achter de filename zet ?

Je kunt de extentie van een bestand extracten :
ExtractFileExt(filename);

Misschien dat je daar wat mee kan.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

marenk_vos schreef op 31 oktober 2002 @ 14:43:
Ik heb een stukje code gemaakt maar het werkt nog niet helemaal:
Delphi:
17
18
19
20
21
22
23
24
25
function Tfrmafbeeldingen.leestotscheidingsteken(separator:string;
  str:string):string;
var i : integer;
begin
  i:=Pos(separator, str);
  Result := Copy(str, 1, i-1);
  Delete(str, 1, i);
  showmessage(str);
end;
Op de een of andere manier werkt de delete niet, hij verwijderd het stuk van de string niet.
Vervang regel 23 door
Delphi:
23
  Delete(Result, 1, i);

[ Voor 0% gewijzigd door Tomatoman op 31-10-2002 21:21 . Reden: layout verbeterd ]

Een goede grap mag vrienden kosten.


Verwijderd

Zijn er eigenlijk ook ergens goede tuturials te vinden over Delphi?

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

Hoe los je nou op een nette manier het opslaan van een bestand op, net zoals als bijvoorbeeld Office-applicaties dat doen? Je hebt Opslaan, maar ook Opslaan als.... Als je een nieuw bestand hebt gemaakt, maar nog geen bestandsnaam hebt opgegeven, moet altijd het dialoogvenster Opslaan als... verschijnen, zelfs als je op Opslaan drukt. De onderstaande code doet dat. Hij gaat ervanuit dat je een button FileSave en een button FileSaveAs hebt.

Delphi:
1
2
3
4
5
6
7
8
9
procedure TForm1.FileSaveClick(Sender: TObject);
begin
  Save;   // simpelweg bestand opslaan
end;

procedure TForm1.FileSaveAsClick(Sender: TObject);
begin
  SaveAs; // dialoogvenster 'Opslaan als...', daarna bestand opslaan
end;
Tot zover piece of cake, nu nog Save en SaveAs implementeren.
Delphi:
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var
  FullFileName: string;  { pad + bestandsnaam. Aanvankelijk leeg. }

function TForm1.Save: Boolean;
var
  OldCursor: TCursor;
begin
  if FullFileName = '' then
    Result := SaveAs
  else
    try
      OldCursor := Screen.Cursor;
      Screen.Cursor := crHourglass;
      try
        { Hier proberen je document daadwerkelijk op te slaan. }
      finally
        Screen.Cursor := OldCursor;
      end;
      Result := True;
    except
      Application.HandleException(Self);
      Result := False;
    end;
end;
SaveAs is wat ingewikkelder.
Delphi:
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
function TForm1.SaveAs: Boolean;
var
  IDList: PItemIDList;
  Path: array[0..MAX_PATH] of Char;
  OldFileName: TFileName;
begin
  if FullFileName = '' then
  begin
    { Proberen de map 'Mijn Documenten' te vinden. }
    if SHGetSpecialFolderLocation(Application.Handle, CSIDL_PERSONAL,
      IDList) = S_OK then
    begin
      SHGetPathFromIDList(IDList, @Path);
      SaveDialog.InitialDir := Path;
    end;
    SaveDialog.FileName := 'Nieuw document';
  end
  else
    SaveDialog.FileName := FullFileName;
  if SaveDialog.Execute then
  begin
    if ExtractFileExt(SaveDialog.FileName) = '' then
      { Standaardextensie: .txt   - dit kan ook iets anders zijn. }
      SaveDialog.FileName := SaveDialog.FileName + '.txt';
    OldFileName := FullFileName;
    FullFileName := SaveDialog.FileName;
    Result := Save;
    if not Result then
      FullFileName := OldFileName;
  end
  else
    Result := False;
end;

De Filter property van SaveDialog moet als volgt zijn ingesteld (FilterIndex = 2):
code:
1
Alle bestanden (*.*)|*.*|Tekstbestanden (*.txt)|*.txt

Een goede grap mag vrienden kosten.


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Lijkt wel alsof niemand de 'DefaultExt'-property kent.

Siditamentis astuentis pactum.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

DefaultExt geeft zo nu en dan ongewilde effecten. Als je DefaultExt op bijvoorbeeld '.txt' instelt en de bestandsnaam 'tekstbestand.ini' opgeeft, blijkt er opeens een bestand 'tekstbestand.ini.txt' op je schijf te staan. Niet erg intuïtief voor de gebruiker :(.

Een goede grap mag vrienden kosten.


  • marenk_vos
  • Registratie: Augustus 2001
  • Laatst online: 23-07 13:21
Het probleem van ongewilde effecten met defaultex had ik eerst ook. Het probleem was dat ook al roep je defaultex aan dat ie dan alsnog zijn eigen filter als extentie pakt. Als je bijvoorbeeld afbeeldingen wilt laten zien en je zet er een filter in als bijvoorbeeld (*.bmp;*.jpg) dat hij altijd *.bmp als extentie eraan vastplakt als de gebruiker zelf geen extentie invult.

Mijn programma code is:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
procedure Tfrmafbeeldingen.Button2Click(Sender: TObject);
var currentfile:string;
    positie:integer;
    str:string;
begin
CurrentFile:=FileListBox1.FileName;

if currentfile='' then
   begin
   showmessage('U heeft geen bestand gekozen');
   end
else
   begin
   positie:=pos('.',currentfile);
   str:=copy(currentfile,positie+1,3);

   if str='jpg' then
      begin
      savedialog1.defaultext:='jpg';
      end
   else
      begin
      savedialog1.defaultext:='bmp';
      end;

   if SaveDialog1.Execute then  { get a file name }
      begin
      Image1.Picture.SaveToFile(savedialog1.filename)   { save if already named }
      end;

   frmafbeeldingen.FileListBox1.Update;
   end;

end;


Het probleem van dubbele extenties heb ik niet ervaren, als de gebruiker zelf een etentie invult dan negeert hij de defaultextetie en pakt hij dus de eerste extentie uit het filter

Dell XPS 17 Intel i7 2630 Nvidia GT555 3Gb Hd1: OCZ Vertex 2 SSD 60 GB Hd2: 500Gb

Pagina: 1