Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Format mit SysErrorMessage(..) (https://www.delphipraxis.net/79831-format-mit-syserrormessage.html)

silentAMD 29. Okt 2006 14:36


Format mit SysErrorMessage(..)
 
hi,
in meinem dateimanager können ganz normal dateien mit shellexecute geöffnet werden. falls ein fehler auftritt, soll eine meldung ausgegeben werden.

Delphi-Quellcode:
function TWinMain.shell_open(dirname, filename: PChar): Cardinal;
const
  OPEN_OR_EXP: array[Boolean] of PChar = ('open', 'explore');
begin
  if(filename = nil) then
    filename := '.';
  ShellExecute(Application.Handle, OPEN_OR_EXP[mi_open_exp.Checked and (filename = '.')], filename, nil, dirname, SW_SHOWNORMAL);
  Result := GetLastError();
  if(Result = ERROR_NO_ASSOCIATION) then
  begin
    if Application.MessageBox(PChar(SysErrorMessage(Result)+'.'+#10#13#10#13+'Möchten Sie manuell ein geeignetes Programm auswählen?'),APP_NAME,MB_YESNO or MB_ICONQUESTION) = mrYes then
      ShellExecute(Application.Handle, 'open', 'rundll32.exe', PChar('shell32.dll, OpenAs_RunDLL '+dirname+filename), nil, SW_SHOWNORMAL);
  end
  else if(Result <> ERROR_SUCCESS) then
    Application.MessageBox(PChar(SysErrorMessage(Result))+'.'+#10#13+'(Fehlercode '+IntToStr(Result)+')'),APP_NAME,MB_OK or MB_ICONSTOP);
end;
dies klappt auch ganz gut, allerdings tritt bei fehler ERROR_BAD_EXE_FORMAT (nr 193) ein "%1" in der meldung (%1 ist keine zulässige Win32-Anwendung) auf. ich möchte apikonform das %1 (oder falls es ein "%2" geben sollte) durch den entsprechenden wert ersetzen (hier anscheinend der dateiname)! wie mache ich das???


PLEASE HELP!!!

marabu 29. Okt 2006 14:54

Re: Format mit SysErrorMessage(..)
 
Vielleicht so:

Delphi-Quellcode:
 Format(SysErrorMessage(193), [FileName]);
Und statt #10#13 solltest du vielleicht sLineBreak (das ist #13#10) verwenden.

Grüße vom marabu

Muetze1 29. Okt 2006 16:13

Re: Format mit SysErrorMessage(..)
 
Das Problem ist, dass du den PChar() TypeCast direkt hinter dem SysErrorMessage() beendest anstatt erst den String zusammen zu bauen und dann den Typecast durch zu führen.

silentAMD 29. Okt 2006 16:49

Re: Format mit SysErrorMessage(..)
 
Zitat:

Zitat von Muetze1
Das Problem ist, dass du den PChar() TypeCast direkt hinter dem SysErrorMessage() beendest anstatt erst den String zusammen zu bauen und dann den Typecast durch zu führen.


nee war nur ein kleiner kopierfehler^^



Zitat:

Zitat von marabu
Vielleicht so:

Delphi-Quellcode:
 Format(SysErrorMessage(193), [FileName]);


soweit war ich auch schon... probiers mal selbst in einem testprogramm... da kommt ein fehler (Format '%1' ungültig oder nicht kompatibel mit Argument.)


Zitat:

Zitat von marabu
Und statt #10#13 solltest du vielleicht sLineBreak (das ist #13#10) verwenden.


kannte die konstante noch nicht... werde das umschreiben

marabu 29. Okt 2006 17:44

Re: Format mit SysErrorMessage(..)
 
Du kannst die %1 vorher in ein %s umwandeln:

Delphi-Quellcode:
var
  msg: String;
begin
  msg := StringReplace(SysErrorMessage(193), '%1', '%s', [rfReplaceAll]);
  ShowMessage(Format(msg, [FileName]));
end;
Grüße

silentAMD 29. Okt 2006 21:29

Re: Format mit SysErrorMessage(..)
 
Zitat:

Zitat von marabu
Du kannst die %1 vorher in ein %s umwandeln:

Delphi-Quellcode:
var
  msg: String;
begin
  msg := StringReplace(SysErrorMessage(193), '%1', '%s', [rfReplaceAll]);
  ShowMessage(Format(msg, [FileName]));
end;


aha... dann kann ich ja auch gleich '%1' mit FileName ersetzen ;)



ich frage mal anders: wie macht das windows??

marabu 30. Okt 2006 05:57

Re: Format mit SysErrorMessage(..)
 
Guten Morgen,

ja, da hast du natürlich Recht. Windows selbst verwendet vermutlich die API Funktion FormatMessage().

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz