Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Progr.-ausführung durch Button1.Click o. Form1.OnCreate (https://www.delphipraxis.net/63906-progr-ausfuehrung-durch-button1-click-o-form1-oncreate.html)

swbo 24. Feb 2006 10:40


Progr.-ausführung durch Button1.Click o. Form1.OnCreate
 
Hallo,

ich möchte, dass eine Prozedur ausgeführt wird. Wird diese Prozedur unter Button1.Click eingebunden und klickt dann zur Ausführung auf diese Schaltfläche, so wird ohne Probleme das jeweilige ausgeführt. Nun möchte ich aber diese Prozedur aufrufen, wenn mein Delphi-Programm gestartet wird. Dies sollte doch mit Form1.OnCreate möglich sein. Aber leider passiert dann nach dem Starten der *.exe nichts mehr. Was mache ich falsch?

Die Prozedur, die eingebunden werden soll:

Delphi-Quellcode:
procedure VerbindungBestaetigen;
var hOE: hWnd;
begin
  hOE:=FindWindow(nil,'Trader Workstation');     // Finde das Fenster
  SetForegroundWindow(hOE);                      // Bringe es in den Vordergrund

  SendMessage(hoe,WM_KEYDOWN,VK_RETURN,0);      // Drücke die Enter-Taste
  SendMessage(hoe,WM_KEYUP,VK_RETURN,0);
end;

kalmi01 24. Feb 2006 10:42

Re: Progr.-ausführung durch Button1.Click o. Form1.OnCreate
 
Hallo swbo,

leg Deinen Prozedureaufruf ins OnShow.

marabu 24. Feb 2006 10:56

Re: Progr.-ausführung durch Button1.Click o. Form1.OnCreate
 
Hallo,

Initialisierungen und die Bereitstellung von Resourcen im event handler für OnCreate der Form sind korrekt. Eingriffe in die Benutzerschnittstelle (hier das Schließen eines fremden Fensters) würde ich an die Programmaktivierung binden - dann ist auch die Nachrichtenschleife deiner Anwendung funktionstüchtig.

Du kannst die Komponente TApplicationEvents (Palette Zusätzlich) verwenden und dort das Ereignis OnActivate. Du solltest eine private Form-Variable (Running: Boolean) deklarieren und bei der ersten Aktivierung auf True setzen, damit bestimmte Aktionen nicht mehrfach ausgeführt werden.

Grüße vom marabu

swbo 25. Feb 2006 14:03

Re: Progr.-ausführung durch Button1.Click o. Form1.OnCreate
 
Hallo marabu,

ich habe den Code wie folgt geändert:

Delphi-Quellcode:
procedure TTradeManager.ApplicationEvents1Activate(Sender: TObject);
var hOE: hWnd; Running: Boolean;
begin
  Running := false;

  if Running = false then
  begin
    hOE:=FindWindow(nil,'Trader Workstation');     // Finde das Fenster
    SetForegroundWindow(hOE);                      // Bringe es in den Vordergrund
    SendMessage(hoe,WM_KEYDOWN,VK_RETURN,0);       // drücke ENTER
    SendMessage(hoe,WM_KEYUP,VK_RETURN,0);
    Running := true;
  end;
end;

procedure TTradeManager.FormCreate(Sender: TObject);
begin
    iabsocket1.Connected := true;
    ApplicationEvents1Activate(Sender);
end;

procedure TTradeManager.Button1Click(Sender: TObject);
begin
  AuswFutChange.ItemIndex;
  AuswFutChange.OnChange(AuswFutChange.Items);
end;
Dabei scheint es zu funktionieren und manchmal, bei mehrmaligem Ausführen und Wiederschließens dann nicht mehr. Habe ich Deinen Wortlaut richtig interpretiert? Die Combobox AusFutChange soll auch ohne auf Button1 zu drücken ausgeführt werden. Wo müßte ich diese zwei Zeilen unterbringen? Vielen Dank!

marabu 25. Feb 2006 15:38

Re: Progr.-ausführung durch Button1.Click o. Form1.OnCreate
 
Hallo swbo,

du hast die Variable Running als lokale Variable deklariert - so wird sie bei jedem Eintritt in die Prozedur neu erzeugt. Sie gehört in den Abschnitt private deiner Form und wird beim Erzeugen der Form automatisch mit False initialisiert:

Delphi-Quellcode:
type
  TTradeManager = class(TForm)
    // ...
  private
    Running: Boolean;
    // ...
  end;
Dementsprechend ändert sich deine Ereignisbehandlungsroutine ein wenig:

Delphi-Quellcode:
procedure TTradeManager.ApplicationEvents1Activate(Sender: TObject);
var
  hOE: hWnd;
begin
  if not Running then
  begin
    // Finde das Fenster
    hOE := FindWindow(nil, 'Trader Workstation');  
    // Bringe es in den Vordergrund  
    SetForegroundWindow(hOE);                      
    // drücke ENTER
    SendMessage(hoe,WM_KEYDOWN,VK_RETURN,0);      
    SendMessage(hoe,WM_KEYUP,VK_RETURN,0);
    // verhindere erneute Ausführung
    Running := true;
  end;
end;
Den Code für das Ereignis OnActivate() der Application im Ereignis OnCreate() deiner Form aufzurufen ist überflüssig bis schädlich - wir wollten ja gerade weg von diesem zu frühen Zeitpunkt. Das Ereignis OnActivate() wird automatisch ausgelöst und der entsprechende Code wird dann ausgeführt - ohne dein Zutun, also:

Delphi-Quellcode:
procedure TTradeManager.FormCreate(Sender: TObject);
begin
  iabsocket1.Connected := true;
end;
Was genau du beim Ereignis OnClick() von Button1 vorhast, das entzieht sich leider meiner Kenntnis. Weißt du näheres darüber?

Freundliche Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 Uhr.

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