Autor Téma: Uložení Gif za pomoci fce GetCurrentUserName  (Přečteno 5661 krát)

Offline Kukysh

  • Mladík
  • **
  • Příspěvků: 64
  • Karma: 1
    • Verze Delphi: Delphi 7, Delphi 10.3.3
Uložení Gif za pomoci fce GetCurrentUserName
« kdy: 19-09-2012, 10:58:04 »
Snažím se uložit Image do GIF, v 1. variantě se při zavření Formu s Image uloží v pořádku
a při 2. variantě GIF (za pomocí fce GetCurrentUserName) nechce vytvořit, nebude to právama?
Dá se s tím něco udělat?
Viz:
procedure TForm8.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
Image1.Picture.Assign(Image1.Picture);
Image1.Picture.SaveToFile('C:\Foto.gif'); //- funguje
Image1.Picture.SaveToFile('C:\Users\' + GetCurrentUserName + '\Desktop\Foto1.gif'); // - nefunguje

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2668
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Uložení Gif za pomoci fce GetCurrentUserName
« Odpověď #1 kdy: 19-09-2012, 11:12:52 »
Image1.Picture.SaveToFile('C:\Users\' + GetCurrentUserName + '\Desktop\Foto1.gif'); // - nefunguje[/tt]
Predne bys nemel pouzivat takovou cunarnu a misto lepeni cesty pouzit CSIDL viz http://msdn.microsoft.com/en-us/library/windows/desktop/bb762494(v=vs.85).aspx a pokud ti to nejde, tak OS na vsechny I/O operace vraci pomerne jasnou informaci v GetLastError, co se mu nelibi, tak bud protrasuj to Save nebo si treba docasne nahrad operaci s handle

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1136
  • Karma: 42
    • Verze Delphi: 7, 2010
Re:Uložení Gif za pomoci fce GetCurrentUserName
« Odpověď #2 kdy: 19-09-2012, 11:18:56 »
jeste pro jistotu doplnim

je potreba nejaka takovato funkce
Kód: Delphi [Vybrat]
  1. function GetSpecialFolderPath(folder: integer) : string;
  2. const
  3.   SHGFP_TYPE_CURRENT = 0;
  4. var
  5.   path: array [0..MAX_PATH] of char;
  6. begin
  7.   if SUCCEEDED(SHGetFolderPath(0,folder,0,SHGFP_TYPE_CURRENT,@path[0])) then
  8.     Result := path
  9.   else
  10.     Result := '';
  11. end;

Offline Kukysh

  • Mladík
  • **
  • Příspěvků: 64
  • Karma: 1
    • Verze Delphi: Delphi 7, Delphi 10.3.3
Re:Uložení Gif za pomoci fce GetCurrentUserName
« Odpověď #3 kdy: 19-09-2012, 11:27:24 »
function GetSpecialFolderPath samože mám ...

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:Uložení Gif za pomoci fce GetCurrentUserName
« Odpověď #4 kdy: 19-09-2012, 11:51:51 »
jeste pro jistotu doplnim
je potreba nejaka takovato funkce

Ještě pro jistotu doplním, že SHGetFolderPath je deprecated a od Vist nahoru bys měl použít SHGetKnownFolderPath. To samé platí pro CSIDL.

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:Uložení Gif za pomoci fce GetCurrentUserName
« Odpověď #5 kdy: 19-09-2012, 11:59:28 »
Kód: Delphi [Vybrat]
  1. function GetSpecialFolderPath(folder: integer) : string;
  2. const
  3.   SHGFP_TYPE_CURRENT = 0;
  4. var
  5.   path: array [0..MAX_PATH] of char;
  6. begin
  7.   if SUCCEEDED(SHGetFolderPath(0,folder,0,SHGFP_TYPE_CURRENT,@path[0])) then
  8.     Result := path
  9.   else
  10.     Result := '';
  11. end;

Jo a path si oprav na array[0..MAX_PATH-1] of Char;  ;)
« Poslední změna: 19-09-2012, 12:06:36 od TLama »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2668
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Uložení Gif za pomoci fce GetCurrentUserName
« Odpověď #6 kdy: 19-09-2012, 12:46:07 »
Ještě pro jistotu doplním, že SHGetFolderPath je deprecated a od Vist nahoru bys měl použít SHGetKnownFolderPath. To samé platí pro CSIDL.

No nevim, jestli je to nejstastnejsi napad prejit z CSIDL na FOLDERID, protoze alespon ja bych byl rad, aby moje aplikace sla spustit treba na XP...

Offline Kukysh

  • Mladík
  • **
  • Příspěvků: 64
  • Karma: 1
    • Verze Delphi: Delphi 7, Delphi 10.3.3
Re:Uložení Gif za pomoci fce GetCurrentUserName
« Odpověď #7 kdy: 19-09-2012, 12:48:02 »
CSIDL je pro mě velká neznámá ...

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2668
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Uložení Gif za pomoci fce GetCurrentUserName
« Odpověď #8 kdy: 19-09-2012, 12:55:38 »
CSIDL je pro mě velká neznámá ...
Proste je to konstanta prirazena nekterym adresarum na disku, kterou kdyz predas jako argument vhodne funkci, tak ti vrati abs. cestu do toho adresare.
Takze treba pro ten desktop o ktery ses snazil, pouzijes CSIDL_DESKTOPDIRECTORY ev. FOLDERID_Desktop

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1136
  • Karma: 42
    • Verze Delphi: 7, 2010
Re:Uložení Gif za pomoci fce GetCurrentUserName
« Odpověď #9 kdy: 19-09-2012, 13:43:04 »
ono bude asi uplne burt fuk, jestli je to
[0..MAX_PATH-1]
nebo
[0..MAX_PATH]

oboji funguje spravne ;)

Offline Kukysh

  • Mladík
  • **
  • Příspěvků: 64
  • Karma: 1
    • Verze Delphi: Delphi 7, Delphi 10.3.3
Re:Uložení Gif za pomoci fce GetCurrentUserName
« Odpověď #10 kdy: 19-09-2012, 13:52:57 »
Tak jsem na tom stejně i v případu:
Kód: Delphi [Vybrat]
  1. Image1.Picture.SaveToFile(GetSpecialFolderPath(CSIDL_DESKTOP, false));

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 211
  • Karma: 9
    • Verze Delphi: 7, XE6, Delphi 10.2 Tokyo
Re:Uložení Gif za pomoci fce GetCurrentUserName
« Odpověď #11 kdy: 19-09-2012, 15:28:04 »
Jméno uživatele, případně dlouhé jména adresářů mohou obsahovat mezery, celý vytvořený název souboru i cestou bych uzavřel do dvojitých uvozovek:
Kód: Delphi [Vybrat]
  1. Image1.Picture.SaveToFile('"C:\Users\' + GetCurrentUserName + '\Desktop\Foto1.gif"');
  2.  
(možná to není vidět, takže před C: je dvojitá uvozovka a na konci za gif je dvojitá uvozovka)

Karel

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2668
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Uložení Gif za pomoci fce GetCurrentUserName
« Odpověď #12 kdy: 19-09-2012, 15:53:05 »
ono bude asi uplne burt fuk, jestli je to
[0..MAX_PATH-1]
nebo
[0..MAX_PATH]

oboji funguje spravne ;)

Nic nemen, mel jsi to spravne, odecteni jednicky je chyba, protoze to ma byt buffer pro NUL terminated string o delce MAX_LENGTH. Takze kdyz mas pole od 0, tak tim pridavas jeden znak pro to NUL na konci. Jina vec by byla, kdybys misto pole znaku pouzil jako buffer string, napr.

Kód: Delphi [Vybrat]
  1. SetLength(path,MAX_LENGTH)
protoze Delphi ten NUL automaticky pridava, aby se s rezetezcem dalo pracovat v pripade potreby jako z ASCIIZ (NUL terminated) retezci.

A funguje ti to jenom proto, ze vracena cesta je kratsi nez MAX_PATH, kdyby nebyla tak, by to prepsalo pamet  >:(




Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2668
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Uložení Gif za pomoci fce GetCurrentUserName
« Odpověď #13 kdy: 19-09-2012, 15:59:54 »
Tak jsem na tom stejně i v případu:
Kód: Delphi [Vybrat]
  1. Image1.Picture.SaveToFile(GetSpecialFolderPath(CSIDL_DESKTOP, false));
Tak to snad hlasi nejakou chybu, ne? Kdyz to neumis zjistit jinak, tak si misto ukladani obrazku zkus na te ceste treba vytvorit soubr s danym jmenem treba funkci SysUtils.FileCreate a a v pripade chyby se podivej, co vraci GetLastError.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 576
  • Karma: 25
Re:Uložení Gif za pomoci fce GetCurrentUserName
« Odpověď #14 kdy: 19-09-2012, 16:14:01 »
Jméno uživatele, případně dlouhé jména adresářů mohou obsahovat mezery, celý vytvořený název souboru i cestou bych uzavřel do dvojitých uvozovek:
Kód: Delphi [Vybrat]
  1. Image1.Picture.SaveToFile('"C:\Users\' + GetCurrentUserName + '\Desktop\Foto1.gif"');
  2.  
(možná to není vidět, takže před C: je dvojitá uvozovka a na konci za gif je dvojitá uvozovka)

to předpokládám hodí chybu nebo se bude ignorovat, uvozovka " není na Windows platný znak v názvu adresáře. Uvozovky se používají pro parametry programů, nikoliv v parametrech funkcí, kde je jasné, co jsou jednotlivé parametry