Avatar billede jan_l Nybegynder
07. juni 2001 - 19:54 Der er 39 kommentarer og
1 løsning

ShellExecute (kan ikke finde fil)

Jeg har følgende linie i mit program:
ShellExecute(Handle,\'open\',PChar(\'Help\\Help.html\'),pchar(\'\'),pchar(\'\'),SW_SHOWNORMAL);

Det virker for så vidt meget godt, men....

Hvis jeg forinden har brugt en OpenDialog eller en SaveDialog, så påstår den at den ikke kan finde filen Help.html.

Jeg går ud fra at det er fordi, der er en eller anden default sti der bliver ændret, men hvad kan jeg gøre for at undgå dette problem??
Avatar billede martinlind Nybegynder
07. juni 2001 - 21:44 #1
Gi\' den hele stien til Help.html

ExtractFilePath( Application.exename)+\'Help\\Help.html\';

/Martin
Avatar billede jan_l Nybegynder
07. juni 2001 - 22:19 #2
Jeg er bange for at jeg ikke rigtig ved, hvordan jeg skal bruge det.

Jeg prøvede følgende:
procedure TForm1.miHelpClick(Sender: TObject);
Begin
ShellExecute(Handle,\'open\',ExtractFilePath(Burgmann.exe)+\'Help\\Help.html\'),pchar(\'\'),pchar(\'\'),SW_SHOWNORMAL);
  end;

Men det virkede ikke.
Delphi siger: Undeclared identifier: \'Burgmann\'

For at det virker så skal programmet vel være \"oprettet\" i windows\'s Path ellers kan den vel ikke vide hvad det for en *.exe den skal \"ExtractFilePath\" fra.
Der kan jo ligge flere exe\'r med samme navn.(i forskellige biblioteker, vel at mærke :)

Skal jeg hente stien til programmet f.eks ved FormCreate eller hvordan gør jeg?
Avatar billede martinlind Nybegynder
07. juni 2001 - 22:50 #3
Sådan :

ShellExecute(Handle,\'open\',ExtractFilePath( Application.exename)+\'Help\\Help.html\'),pchar(\'\'),pchar(\'\'),SW_SHOWNORMAL);
 
og så skal du havde en bib. struktur, med en help bib. der hvor dit program ligger.

-------------------------------------

directory of ....

..
help <dir>
Burgmann.exe 1234kb 12.12.12


C:\\>_


---------------------------------------

Du bruger Application variablen som har en property der hedder exename, som jeg skev så virker det *S*

/Martin
Avatar billede jan_l Nybegynder
07. juni 2001 - 23:18 #4
Jeg fik nogle irriterende fejl med:
Incompatible Types: \'String\' and\'PChar\'

Men det lykkedes ved at jeg gjorde sådan her:
procedure TForm1.miHelpClick(Sender: TObject);
var
Path: String;
Begin
  Path := ExtractFilePath(ParamStr(0)) + \'Help\\Help.html\';
  ShellExecute(Handle,\'open\',PChar(Path),pchar(\'\'),pchar(\'\'),SW_SHOWNORMAL);
end;
Avatar billede jan_l Nybegynder
07. juni 2001 - 23:20 #5
Du får se\'føllig pointene, for at have fået mig ind på den rette vej...

Det lyder helt religiøst :)

Mvh.
      Jan
Avatar billede ziron Nybegynder
07. juni 2001 - 23:23 #6
bare for at rette dig martin så skal filen også ind i en PChar, og så bruge nil, synes det ser bedre ud, er der endelig forskel :-)

ShellExecute(Handle, \'open\', PChar(ExtractFilePath( Application.exename)+\'Help\\Help.html\')), nil, nil, SW_SHOWNORMAL);

/ZIRON
Avatar billede jan_l Nybegynder
07. juni 2001 - 23:34 #7
-> Ziron

Hvis jeg prøver med dit forslag så får jeg denne fejlmeddelelse:
Not enough actual parameters
Avatar billede martinlind Nybegynder
07. juni 2001 - 23:35 #8
Det var min erfaring der spillede mig et lille pus, jeg tænker ikke på String/PChar, jeg er så vant til at bruge PChar til API kald.

Jan >> Du kar faktisk gjort som man gjore i gl. dage, paramstr(0) virker fint i delphi også, hvilket paramcount også gør, men problemet var som fejlen også sagde string/pchar, Delphi kan typecaste mellem String og PChar som du har lyst til, så længe vi taler \"huge\" string og altså ikke ShortString ( kun 255 karakterer ), så som ziron skiver en pchar rundt om også \"funker\" det.
du kan også bruge PChar(Strx+\' Hej du\'), det bliver også til en valid PChar til et API-kald.

/Martin
Avatar billede ziron Nybegynder
07. juni 2001 - 23:38 #9
hov sådan:

ShellExecute(Handle, \'open\', PChar((ExtractFilePath( Application.exename))+\'Help\\Help.html\'), nil, nil, SW_SHOWNORMAL);

/ZIRON
Avatar billede ziron Nybegynder
07. juni 2001 - 23:43 #10
martinlind >> nu har jeg ikke lige gidet at læse alle indlæg i dit web-sjov spg. så nu spøger jeg bare, hvad blev det til fik i den ned???

/ZIRON
Avatar billede jan_l Nybegynder
07. juni 2001 - 23:49 #11
->Ziron
Jep, så virker det også.

Hvis der er et let svar på det her (og I gider), har I så en enkel løsning på det.

Jeg bruger shellexecute to forskellige steder.
Det ene sted (ovenstående) er det altid en html-fil, men det andet sted kan det være en vilkårlig fil *.*
Er der en setting, så man kan sørge for at filen altid åbnes med notepad, eller et andet program der er registreret til *.txt filer.
Avatar billede ziron Nybegynder
07. juni 2001 - 23:50 #12
2 sek...

/ZIRON
Avatar billede ziron Nybegynder
08. juni 2001 - 00:14 #13
sådan:

Shellexecute(Handle, \'open\', PChar(\'c:\\windows\\Notepad.exe\'), PChar(\' c:\\din_fil.jul\'), nil, SW_SHOW);

skulle man så ikke have lidt point???

/ZIRON
Avatar billede ziron Nybegynder
08. juni 2001 - 00:16 #14
du skal lige tage højte for at notepad ikke altid ligger der, så...

/ZIRON
Avatar billede martinlind Nybegynder
08. juni 2001 - 00:28 #15
Hvis du bare laver en Open på din fil så bruger windows den assosering der er til den på gældende filtype helt af sig selv.
Avatar billede ziron Nybegynder
08. juni 2001 - 00:29 #16
martin >> af hvad at jeg har forstået så skal alle filer åbenes i notepad, eller er det bare mig???

/ZIRON
Avatar billede jan_l Nybegynder
08. juni 2001 - 00:31 #17
Det kan vi sagtens finde ud af :)

Men hvordan, skal jeg oprette et nyt spørgsmål, eller er der en mere elegant måde?
Avatar billede ziron Nybegynder
08. juni 2001 - 00:32 #18
bare lav et nyt spg. hvor der står point til den som du nu er tilfeds med...

/ZIRON
Avatar billede martinlind Nybegynder
08. juni 2001 - 00:33 #19
Ziron >> Det har du ret i, det andet var bare som en extra oplysning.
Avatar billede jan_l Nybegynder
08. juni 2001 - 00:35 #20
Jo, filen som bliver gemt kan have et vilkårligt efternavn, da filen skal kunne bruges i flere forskellige sammenhænge.
Man kan selvfølgelig bare gemme den fra programmet som en *.txt fil, og så omdøbe den senere.
Det ville bare være en mere elegant løsning, at brugeren kunne give filen det rigtige navn med det samme.

Findes der ikke en kommando så man kan finde \"windir\"?

Jeg har ledt i WIN32.hlp, men har ikke kunnet finde noget.
Avatar billede ziron Nybegynder
08. juni 2001 - 00:38 #21
kommer med det nu...

/ZIRON
Avatar billede ziron Nybegynder
08. juni 2001 - 00:41 #22
var
notepad : String;
begin
reg := TReginifile.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
notepad := reg.ReadString(\'Software\\Microsoft\\Windows\\CurrentVersion\', \'SystemRoot\', \'c:\\windows\');
notepad := IncludeTrailingBackslash(notepad);
reg.free;

Shellexecute(Handle, \'open\', PChar(notepad + \'Notepad.exe\'), PChar(\' c:\\din_fil.jul\'), nil, SW_SHOW);


/ZIRON
Avatar billede ziron Nybegynder
08. juni 2001 - 00:50 #23
har lavet en fejl skal lige rette...

/ZIRON
Avatar billede jan_l Nybegynder
08. juni 2001 - 00:56 #24
Jeg har fundet her i WIN32.hlp, men kan ikke finde ud af at bruge det:

The GetSystemDirectory function retrieves the path of the Windows system directory. The system directory contains such files as Windows libraries, drivers, and font files.

UINT GetSystemDirectory(

    LPTSTR lpBuffer,    // address of buffer for system directory
    UINT uSize     // size of directory buffer
  );   


Parameters

lpBuffer

Points to the buffer to receive the null-terminated string containing the path. This path does not end with a backslash unless the system directory is the root directory. For example, if the system directory is named WINDOWS\\SYSTEM on drive C, the path of the system directory retrieved by this function is C:\\WINDOWS\\SYSTEM.

uSize

Specifies the maximum size of the buffer, in characters. This value should be set to at least MAX_PATH.



Return Values

If the function succeeds, the return value is the length, in characters, of the string copied to the buffer, not including the terminating null character. If the length is greater than the size of the buffer, the return value is the size of the buffer required to hold the path.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks

Applications should not create files in the system directory. If the user is running a shared version of Windows, the application does not have write access to the system directory. Applications should create files only in the directory returned by the GetWindowsDirectory function.

See Also
GetCurrentDirectory, GetWindowsDirectory, SetCurrentDirectory
Avatar billede ziron Nybegynder
08. juni 2001 - 00:56 #25
var
notepad : String;
VI    : TOSVersionInfo;
OSStr : String;
begin

VI.dwOSVersionInfoSize := SizeOf(VI);
  GetVersionEX(VI);
  If  (VI.dwPlatformID = VER_PLATFORM_WIN32s) Then
    OSStr := \'Windows 3.1\'
  Else If (VI.dwPlatformID = VER_PLATFORM_WIN32_WINDOWS) And
          (VI.dwMinorVersion = 0) Then
    OSStr := \'Windows 95\'
  Else If (VI.dwPlatformID = VER_PLATFORM_WIN32_WINDOWS) And
          (VI.dwMinorVersion > 0) Then
    OSStr := \'Windows 98\'
  Else If (VI.dwPlatformID = VER_PLATFORM_WIN32_NT) Then
      OSStr := \'Windows NT\'
  Else
    OSStr := \'Unknown OS System.\';

if OSStr = \'Windows 98\' then
begin
reg := TReginifile.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
notepad := reg.ReadString(\'Software\\Microsoft\\Windows\\CurrentVersion\', \'SystemRoot\', \'c:\\windows\');
notepad := IncludeTrailingBackslash(notepad);
reg.free;

Shellexecute(Handle, \'open\', PChar(notepad + \'Notepad.exe\'), PChar(\' c:\\din_fil.jul\'), nil, SW_SHOW);
end
else
  if OSStr = \'Windows NT\' then
  begin
  reg := TReginifile.Create;
  reg.RootKey := HKEY_LOCAL_MACHINE;
  notepad := reg.ReadString(\'Software\\Microsoft\\Windows NT\\CurrentVersion\', \'SystemRoot\', \'c:\\windows\');
  notepad := IncludeTrailingBackslash(notepad);
  reg.free;

  Shellexecute(Handle, \'open\', PChar(notepad + \'Notepad.exe\'), PChar(\' c:\\din_fil.jul\'), nil, SW_SHOW);
  end

sådan det færdige...

/ZIRON
Avatar billede ziron Nybegynder
08. juni 2001 - 00:57 #26
ja det kan du også bruge, du må selv om det...

/ZIRON
Avatar billede jan_l Nybegynder
08. juni 2001 - 01:03 #27
Jeg tror nu nok jeg vil satse på din løsning, men den giver mig en fejlmeddelelse ved denne linie:
reg := TReginifile.Create;

Den siger: Undeclared identifier
Avatar billede ziron Nybegynder
08. juni 2001 - 01:05 #28
jeg har dette med i pulic:

reg : TReginifile;

og så registry i uses...

/ZIRON
Avatar billede jan_l Nybegynder
08. juni 2001 - 01:14 #29
Rigistry i Uses havde jeg husket, men...

Det virker Perfekt, Juhuuu !!!

Du skal have rigtig mange tak.

PS.
Sådan noget kode som det her, er det bare noget man kan, eller ved man \"bare\" hvor man skal lede efter det.... eller begge dele?  :)
Avatar billede ziron Nybegynder
08. juni 2001 - 01:17 #30
har haft fået hjælp før men nu kan man det, ellers kigger man i sine notater :-)

/ZIRON
Avatar billede jan_l Nybegynder
08. juni 2001 - 01:21 #31
Jeg må hellere smutte nu, da jeg har et møde i morgen tidlig med min vejleder på uni.

Det er godt gjort, at man skal knokle sådan for at lave et afgangsprojekt ;)

Men I har helt sikkert reddet min dag, øøøh aften/nat

Mvh.
      Jan
Avatar billede ziron Nybegynder
08. juni 2001 - 01:24 #32
ja okay jeg tror også jeg smutter ud skal til X-samen imorgen...

/ZIRON
Avatar billede jan_l Nybegynder
08. juni 2001 - 01:32 #33
God fornøjelse.

pøj pøj
Avatar billede ziron Nybegynder
08. juni 2001 - 01:33 #34
tak og ilige måde :-)

/ZIRON
Avatar billede martinlind Nybegynder
08. juni 2001 - 11:54 #35
VAR
  Str : PChar;
  Si  : Integer;

begin
  Str := StrAlloc(MAX_PATH+1);
  GetWindowsDirectory(Str,Si);
  ShowMessage(String(Str));
  StrDispose(Str);
end;

Som du kan se jan, er det langt pænere kode at benytte det API kald du selv fandt. Ikke for at nedgøre ziron overhovdet ikke, hans virker jo også.

/Martin
Avatar billede jan_l Nybegynder
08. juni 2001 - 15:05 #36
-> Martinlind

Det er noteret, til evt. senere brug.  :)
Avatar billede martinlind Nybegynder
08. juni 2001 - 16:11 #37
og den fordel at hvis microsoft finder på at ændre placeringen i reg. basen så virker din kode stadig det gør ziron\'s ikke.
Avatar billede ziron Nybegynder
08. juni 2001 - 17:12 #38
martinlind >> ja ja kender man typen :-)

nej det er rigitg nok det du siger, men det var det første jeg kom til at ttænke på og så har jeg slet ikke tænkt på det med det sidste :-(

/ZIRON
Avatar billede martinlind Nybegynder
08. juni 2001 - 17:27 #39
Beklager, jeg er født sådan *GG*
Avatar billede ziron Nybegynder
08. juni 2001 - 17:28 #40
hehe :-)

/ZIRON
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