Jump to content

Tworzenie malej aplikacji w Embarcadero RAD Studio XE2


rapidsebuja

Recommended Posts

Witam jestem nowy w tym temacie i dopiero co zaczynam.

Nie wiem czy ten temat jest w odpowiednim dziale...

W programie "Embarcadero RAD Studio XE2" chce stworzyc mala aplikacje pod windows 7 x64.

Udalo mi sie cos takiego stworzyc:

juqDGITlRJ6QA.jpg

 

Nie wiem jak mam dodac polecenie cmd pod buttony. Tzn.: Kazdy button uruchamia pewne polecenie cmd.

Nie wiem tez gdzie powinienem importowac / zapisac polecenia cmd wraz z aplikacjami ktore te polecenia maja uruchamiac...

Fajnie by bylo jak by byl do tej aplikacji plik .ini w ktorym moglbym wpisac sciezki umiejscowienia polecen cmd dla buttonow...

 

Prosze o wyrozumialosc nie znam zadnych jezykow programowania a zalezy mi bardzo na tym projekcie...

Link to comment
Share on other sites

1)

ShellExecute(0, nil, 'cmd.exe', '/C polecenie', nil, SW_HIDE);

mam nadzieję że zadziała

2) nie bardzo rozumiem

3)

var  INI : TIniFile;
begin
INI := TINIFile.Create('C:\moj.ini');
try
  ShowMessage(      INI.ReadString('Main', 'Klucz', 'Wartość domyślna')    );
finally
  INI.Free;
end;

Link to comment
Share on other sites

2) chodzi o to ze np. w miejscu : C:\Windows\Specials\ beda 4 katalogi :

"pierwszy" - a w nim polecenie .cmd i plik .exe (cmd wlancza tylko tryb silent)

"drugi" - a w nimj .cmd i .reg

"trzeci" - i tak dalej...

Ogolnie 4 foldery i 4 buttony.

W pliku ini chcialbym wpisywac sciezki docelowe do tych plikow cmd (kazdy ma inna lokalizacje bo bedzie umieszcony w oddzielnym folderze)

 

 

i proslibym o wyjasnienie gdzie wkleic kod dotyczacy . ini....

 

" ShellExecute(0, nil, 'cmd.exe', '/C polecenie', nil, SW_HIDE); " wywala blad...

 

 

Moze taki przyklad dla pierwszego buttona (prosze o napisanie kodu z nazwami uzytymi w przykladzie)

 

Mam folder :

C:\Windows\Specials\Button1 - w nim pliki : Directx.exe i Directx.cmd

 

Aplikacja stworzona w tym programie znajdowala by sie w :

C:\Users\Rapidsebuja\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Win7care - nazywala by sie "narzedziownia.exe"

 

w folderze "Win7care" - pliki: "narzedziownia.exe" , "sciezki.ini"

 

Jak powinno to wygladac?

Link to comment
Share on other sites

tak wyglada kod:

 

unit System7care;
interface
uses
 System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
 FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs;
type
 TForm1 = class(TForm)
Button1: TButton;
Brush1: TBrushObject;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
 private
{ Private declarations }
 public
{ Public declarations }
 end;
var
 Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
end.

Link to comment
Share on other sites

Juz rozkminilem:P

 

unit Unit1;
interface
uses
 System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
 FMX.Types, FMX.Controls, FMX.Forms, ShellAPI, FMX.Dialogs;
type
 TAplikacja = class(TForm)
Brush1: TBrushObject;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
 private
{ Private declarations }
 public
{ Public declarations }
 end;
var
 Aplikacja: TAplikacja;
implementation
{$R *.fmx}
procedure TAplikacja.Button1Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'polecenie.cmd', nil, 'C:\Special\Aktualizacja DirectX', 0);
end;
procedure TAplikacja.Button2Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'gracz.cmd', nil, 'C:\Special\Tryb gracza', 0);
end;
procedure TAplikacja.Button3Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'uslugi.cmd', nil, 'C:\Special\Pozadkowanie uslug', 0);
end;
procedure TAplikacja.Button4Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'rejestr.cmd', nil, 'C:\Special\Optymalizacja rejestru', 0);
end;
end.

 

u mnie tylko tak dziala, moze sie przyda innym

Link to comment
Share on other sites

progressbar niby zrobilem ale nie dziala...

 

 

unit Unit1;
interface
uses
 System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
 FMX.Types, FMX.Controls, FMX.Forms, ShellAPI, FMX.Dialogs;
type
 TAplikacja = class(TForm)
Brush1: TBrushObject;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
ProgressBar1: TProgressBar;
Procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure ProgressBar1Click(Sender: TObject);
 private
{ Private declarations }
 public
{ Public declarations }
 end;
var
 Aplikacja: TAplikacja;
implementation
{$R *.fmx}
procedure TAplikacja.Button1Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'polecenie.cmd', nil, 'C:\Special\Aktualizacja DirectX', 0);
end;
procedure TAplikacja.Button2Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'gracz.cmd', nil, 'C:\Special\Tryb gracza', 0);
end;
procedure TAplikacja.Button3Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'uslugi.cmd', nil, 'C:\Special\Pozadkowanie uslug', 0);
end;
procedure TAplikacja.Button4Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'rejestr.cmd', nil, 'C:\Special\Optymalizacja rejestru', 0);
end;
procedure TAplikacja.Button5Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'zwykly.cmd', nil, 'C:\Special\Tryb gracza', 0);
end;
procedure TAplikacja.ProgressBar1Click(Sender: TObject);
begin
with TForm.Create(self) do
try
 ShowModal;
finally
 Free;
 end;
End;
end.

Link to comment
Share on other sites

A jak ma działać skoro nie masz żadnego kodu, który go oprogramowuje. Zachowanie TProgressBar zmieniasz ustawiając własności Position, Min i Max (wszystkie typu integer). Poza tym bez sensu zrobiłeś wywołanie tych polecen cmd, podając im "sztywne" ścieżki. Powinieneś to raczej zrobić poprzez albo wyszukiwanie plików lub katalogi i pobieranie do nich ścieżek lub jeżeli są one w katalogu, w którym znajduje się plik wykonywalny Twójego programu: ExtractFilePath(Application.ExeName) + 'cosiktam.cmd'.

Pozdrawiam: olesio

Link to comment
Share on other sites

Sciezki sa sztywno bo pierwszy raz w zyciu cos takiego robie...

nie znam zadnych jezykow programowania i potrzebuje pomocy z tym paskiem reszta ma zostac bo jest mi tak wygodniej...

Prosze kogos o dopisanie kodu pod progressbar post 7-my zawiera czysty kod bez bledow i potrzeba do niego dopisac progressbar...

Niestety tego juz chyba nie przeskocze...

Link to comment
Share on other sites

Ale nie bardzo rozumiem, co ma pokazywać ProgressBar, bo proces uruchamiania pojedyńczego procesu, o ile wiem przy użyciu ShellExecute raczej nie zwizualizujesz, bo jak niby można pokazać jak długo będzie się uruchamiał proces. Co określić jako Max. U każdego w zależności od prędkości dysku, komputera, zamulenia innymi procesami, programu antywirusowego w tle, fragmentacji dysku jak i za pewne jeszcze wielu innych czynników będzie inna. Natomiast jeżeli chcesz uruchomić te cztery buttony to rób to po każdym wywołaniu procedury ShowProgrss tak jak pokazałem to w kodzie na szybko ponizej. Kod poniżej jest przykładowy i poglądowy dla Ciebie żebyś wiedział co i jak. Nazwałem również formatkę Aplikacja, chociaż proponował bym stosować raczej anglo języczne nazwy i dodawać do ich słowo Form na przykład główną Formatkę nazwać MainForm. Jeśłi chcesz pokazywać Splashe czyli takie właśnie specjalne okienka pozwalające pokazywać się do póki nie zakończył się postęp jakiejś operacji to w google znajdziesz mnóstwo przykłądów i informacji jak robić SplashScreeny w Delphi. Oczywiście dla poprawności należało by zrobić to co poniżej w wątku, ale to byś musiał sobie o wątkach w Delphi poczytać. I fajnie, że coś sam działasz, ale staraj się nawet jak nie zamierzasz później napisać wielu programów, pisać swoje programy dobrze czyli nazewnictwo, formatowanie kodu, nie stosowanie ścieżek na sztywno i tym podobne przydadzą się zawsze żeby byś ze swojego dziełą zadowolonym i wiedzieć zę działą ok. Poza tym takie rzeczy co kombinujesz niekiedy wygodniej jest zrobić w pakietach instalacyjncyj jak NSIS (NullSofu) albo InnoSetup. Dokumentacji i przykładowych skryptów (a szczególnie do NSIS'a, z którego czasami korzystam do tworzenia instalek) na google jest mnóśtwo. Do Inno Setup też za pewne znajdziesz, tam piszesz kod w jęzku będący identycznym składniowo z Delphi czyli nieco łątwiej. Ok, oto przykłądowy kod. W razie pytań pisz, ale wszystko powinno być jasne. Na formatce umieść tylko TProgressBar o własności Name ProgrsssBar i TLabel o własności Name ProgressLabel i ułóż je łądnie. Mozesz również wyśrodkować formę przez własnośc Position oraz przez własnośc BorderStyle wyłączyć jej ramkę z między innymi "X" do zamykania aby wyglądało to na prawie pr0 SplashScreen :) EDIT: kod poniżej był ładnie sformatowany i powinien raczej wyglądac jak tutaj: http://pastebin.com/psHEEaZ4 ale coś go wstawiacz kodu na Unit1 niestety przeformatował i wygląda nie za ładnie.

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls;
type
 TAplikacja = class(TForm)
ProgressBar : TProgressBar;
ProgressLabel : TLabel;
procedure FormActivate(Sender : TObject);
 private
 public
 end;
var
 Aplikacja : TAplikacja;
 ProgressCnt : Byte = 0;
 Progress_Arr : array[0..3] of string =
(
'Aktualizacja DirectX',
'Tryb gracza',
'Pozadkowanie uslug',
'Optymalizacja rejestru'
);
implementation
{$R *.dfm}
procedure ShowProgress;
begin
 with Aplikacja do
 begin
ProgressLabel.Caption := Progress_Arr[ProgressCnt];
if ProgressCnt < Length(Progress_Arr) then
begin
 	ProgressCnt := ProgressCnt + 1;
 	ProgressBar.Position := ProgressCnt;
end;
 end;
end;

procedure TAplikacja.FormActivate(Sender : TObject);
var
 I : integer;
begin
 ProgressBar.Position := 0;
 ProgressLabel.Caption := '';
 ProgressBar.Max := Length(Progress_Arr);
 ShowMessage('Rozpoczynamy pokazywanie postępu.');
 for I := Low(Progress_Arr) to High(Progress_Arr) do
 begin
ShowProgress;
ShowMessage('Potwierdż OK aby wykonać kolejny krok.');
 end;
 Close;
end;

end.

I sorry za ewentualne literówki w powyższym teksrcie. Tekxt pisany po niepełnym odespaniu nocki w pracy oraz kilku piwkach, ale temat na tyle jest banalny że wszystko powinno być jasne, w razie czego pytaj.

Pozdrawiam: olesio

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...