Jak uruchomić w naszej aplikacji inny program jako modalny?

Jak uruchomić w naszej aplikacji inny program jako modalny?
O2
  • Rejestracja:około 5 lat
  • Ostatnio:około miesiąc
  • Postów:47
0

Witam, znacie jakies tricki jak uruchomić w naszej aplikacji inny program jako modalny?

znalazłem coś takiego, ale nie chce się kompilować, albo jestem zbyt nawalony za co przepraszam ;D

Kopiuj
function EditAndWait(const AFileName : string) : boolean;
var
  Info: TShellExecuteInfo;
begin
  FillChar(Info, SizeOf(Info), 0);
  Info.cbSize := SizeOf(Info);
  Info.lpVerb := 'edit';
  Info.lpFile := PAnsiChar(AFileName);
  Info.nShow := SW_SHOW;
  Info.fMask := SEE_MASK_NOCLOSEPROCESS;
  Result := ShellExecuteEx(@Info);
  if(Result) and (Info.hProcess <> 0) then 
  begin
    WaitForSingleObject(Info.hProcess, Infinite);
    CloseHandle(Info.hProcess);
  end;
end;

FP
  • Rejestracja:prawie 2 lata
  • Ostatnio:28 dni
  • Postów:37
2

Funkcja jest ok, tylko zmień tą linie kodu.

Kopiuj
Info.lpFile := PAnsiChar(AFileName);

Zamiast tego daj

Kopiuj
Info.lpFile := PChar(AFileName);

ja bym ta funkcje zdefiniował tak.

Kopiuj
function UseAndWait(const AFileName: string; Action: string = 'open'): Boolean;
var
  Info: TShellExecuteInfo;
begin
  FillChar(Info, SizeOf(Info), 0);
  Info.cbSize := SizeOf(Info);
  Info.lpVerb := PChar(Action);
  Info.lpFile := PChar(AFileName);
  Info.nShow := SW_SHOWNORMAL;
  Info.fMask := SEE_MASK_NOCLOSEPROCESS;
  Result := ShellExecuteEx(@Info);
  if (Result) and (Info.hProcess <> 0) then begin
    WaitForSingleObject(Info.hProcess, Infinite);
    CloseHandle(Info.hProcess);
  end;
end;


edytowany 3x, ostatnio: Riddle
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Tuchów
  • Postów:12175
1

Wątek dotyczy co prawda Delphi, ale wiem jak to zrobić w Lazarusie — można skorzystać z klasy TProcess i ona daje możliwość poczekania aż wywołany proces zakończy działanie lub go uruchomić bez czekania. Jest też wersja dla Delphi, przeportowana z Free Pascala. W razie czego, możesz podglądnąć źródła i skorzystać tylko z tego czego potrzebujesz.

Rozwiązanie w czystym Win32 API znajdziesz np. tutaj — https://stackoverflow.com/a/17339308/19103115


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
O2
  • Rejestracja:około 5 lat
  • Ostatnio:około miesiąc
  • Postów:47
0

Dzięki Panowie za podpowiedz, dzięki wam podołam :)

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Tuchów
  • Postów:12175
0
first_person napisał(a):

[…] tylko zmień tą linie kodu.

Kopiuj
Info.lpFile := PAnsiChar(AFileName);

Zamiast tego daj

Kopiuj
Info.lpFile := PChar(AFileName);

IMO nie bardzo. Nie mam Delphi, więc nie sprawdzę, ale ShellExecuteEx to alias ShellExecuteExA, czyli wersji obsługującej kodowanie ANSI, czyli o codepointach jednobajtowych. W Delphi typ PChar jest aliasem PWideChar, czyli jest to wskaźnik na ciąg znaków z dwubajtowymi codepointami i dla takich ciągów przeznaczone są funkcje WinAPI z postfiksem W, np. ShellExecuteExW.

Tak więc jeśli ciąg jest kodowany w ANSI, to należy skorzystać z ShellExecuteEx(A), a jeśli w Unicode, to z ShellExecuteExW. Trzeba patrzeć po typach parametrów — LPCSTR jest dla ANSI, LPCWSTR dla Unikodu.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 5x, ostatnio: flowCRANE
O2
  • Rejestracja:około 5 lat
  • Ostatnio:około miesiąc
  • Postów:47
0

@furious programming:
ale @first_person ma racje.

Jeżeli dasz PAnsiChar kompilator da taki komunikat.
Incompatible types: 'PWideChar' and 'PAnsiChar'

Sprawdziłem, wszystko ok
image

EDIT:
@furious programming:

Piszesz ze nie masz Delphi, Delphi od Borlanda to już przeżytek.
Zainstaluj sobie Rad Studio, ciąglę jest rozwijany
https://www.embarcadero.com/products/rad-studio/whats-new-in-11-alexandria

Mozesz kodzic w nim zarówno w Object Pascalu jak i C++

Fajnie w nim mozna kodzic, dla przykladu

Kopiuj
procedure test;
begin
  for var i := 0 to 100 do begin
  // jakis kod.
  end;

  var s :=       'siemano';
  var f :=        11.2;
  var number :=   120 * 765 mod 10;

 // itd itd
end;

edytowany 4x, ostatnio: Observer2323
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Tuchów
  • Postów:12175
0
Observer2323 napisał(a):

@furious programming:
ale @first_person ma racje.

Jeżeli dasz PAnsiChar kompilator da taki komunikat.
Incompatible types: 'PWideChar' and 'PAnsiChar'

No właśnie — nie powinieneś używać typów z Ansi w nazwie, skoro Delphi od bardzo dawna używa Wide znaków i ciągów jako domyślnych dla Char i String. Wszystko co napisałem w poście wyżej jest prawidłowe, tak samo jak sugestia @first_person, bo zapewne pole Info.lpFile jest zadeklarowane jako PChar, który jest aliasem PWideChar.

Piszesz ze nie masz Delphi, Delphi od Borlanda to już przeżytek.

No bo nie mam — dawno temu porzuciłem Delphi na rzecz Lazarusa i Free Pascala. ;)


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
FP
  • Rejestracja:prawie 2 lata
  • Ostatnio:28 dni
  • Postów:37
1

flowCRANE
Dzięki, ale przesiadłem się na Lazarusa (z 8 lat temu) właśnie po to, aby nie używać Delphi. Szczególnie, że nie podoba mi się ich licencja i notoryczne problemy z odnawianiem kluczy. Lazarus, choć uboższy i bardziej zabugowany, daje mi pełną wolność.
O2
  • Rejestracja:około 5 lat
  • Ostatnio:około miesiąc
  • Postów:47
0

@first_person:

o nowa wersja, dotychczas jechalem na 11 :)

edytowany 1x, ostatnio: Observer2323
SK
  • Rejestracja:około 7 lat
  • Ostatnio:2 dni
  • Postów:99
0

Ale nowej wersji Community Edition nie będzie pewnie przez 1-2 lata, jak było z 11.3

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.