Button-Click per Software simulieren

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Button-Click per Software simulieren

Beitrag von malabarista »

Ich möchte innerhalb eines Formulars per Software einen bestimmten Button des Formulars anclicken.
Wie geht das ?
Früher konnte man unter Windows eine wm_... Nachricht versenden, - ich möchte aber eine Lösung, die sowohl unter Windows als auch unter Linux funktioniert.

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Button-Click per Software simulieren

Beitrag von theo »

Was ist der Sinn der Sache in einem eigenen Formular?
Warum rufst du nicht einfach die Ereignisbehandlungsprozedur direkt auf? Button1Click(Self);

Wenn man eine fremde Anwendung (WebBrowser oder so) "fernsteuern" will, kann ich es noch verstehen.

jc99
Beiträge: 29
Registriert: Fr 19. Mai 2017, 18:04
OS, Lazarus, FPC: Win10x64, L 1.8rc3, FPC3.0.2
CPU-Target: 64
Wohnort: Nord-Baden
Kontaktdaten:

Re: Button-Click per Software simulieren

Beitrag von jc99 »

theo hat geschrieben:Was ist der Sinn der Sache in einem eigenen Formular?
Warum rufst du nicht einfach die Ereignisbehandlungsprozedur direkt auf? Button1Click(Self);

Wenn man eine fremde Anwendung (WebBrowser oder so) "fernsteuern" will, kann ich es noch verstehen.

Auch für die eigene Anwendung gibt es durchaus einen Sinn:
Zu Testzwecken
Ich erstelle für wichtige Dialoge TestCases (DUnit) die normales Verhalten / unnormales Verhalten / Monkey simuliert.
und vergleiche ob der Form die erwarteten Informationen liefert, oder zumindest bedienbar bleibt.
OS: ...-Win10 x64
Laz: ...-1.8rc1
https://github.com/joecare99/public
'~| . . /'' . .
,_|oe \_,are

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Button-Click per Software simulieren

Beitrag von wp_xyz »

theo verweist in seinem Beitrag aus anno 2009 (viewtopic.php?f=10&t=2436) auf den Ordner components/mouseandkeyinput/ in der Lazarus-Installation.

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: Button-Click per Software simulieren

Beitrag von malabarista »

Ich möchte einen Ablauf innerhalb eines Programms automatisieren.

Beispiel:
Das Programm wird mit einem Parameter aufgerufen.
Aufgrund dessen soll ein Formular gestartet werden, es werden automatisch bestimmte Werte in das Formular eingetragen, automatisch weiterverarbeitet (="Klick auf OK-Button), und anschliessend ausgedruckt werden(Klick auf Druck-Button). Danach beendet sich das Programm wieder.

Dieser Ablauf soll manuell (=normal) möglich sein, aber unter bestimmten Umständen auch voll-automatisch ablaufen.
Und dafür brauche ich diesen "Button-Click" (mehrfach).

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Button-Click per Software simulieren

Beitrag von theo »

Das erklärt aber mMn nicht, wieso du einen Button-Click brauchst.
Das kannst du doch auch durch den Aufruf der Methoden erledigen, quasi ohne Button?
Oder wo ist das Problem dabei?

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Button-Click per Software simulieren

Beitrag von wp_xyz »

Meinst du sowas? Dieses Demoprogramm schreibt munter in eine Laufende Notepad-Instanz. Wenn man jetzt noch wüsste, wie das unter Linux geht... (ok, das war eigentlich deine ursprüngliche Frage...)

Code: Alles auswählen

uses
  MouseAndKeyInput, LCLType, Process, Windows;
 
procedure SwitchToThisWindow(h1: hWnd; x: bool); stdcall;
  external user32 Name 'SwitchToThisWindow';
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  h: THandle;
begin
  h := FindWindow('NotePad', nil);
  Label1.Caption := 'Handle = ' + IntToStr(h);
  if h > 0 then begin
    SwitchToThisWindow(h, true);
    KeyInput.Apply([ssShift]);
    KeyInput.Press(VK_A);
    KeyInput.Unapply([ssShift]);
    KeyInput.Press(VK_B);
    KeyInput.Press(VK_C);
  end;
end

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Button-Click per Software simulieren

Beitrag von theo »

@wp_xyz: Bevor wir hier kompliziertes Zeug vorschlagen, sollten wir abklären, ob malabarista nicht einfach einen Denkfehler macht.
Nach seinen Schilderungen, sehe ich keinen Grund für solche Maßnahmen.

linus
Beiträge: 22
Registriert: Di 19. Okt 2010, 17:23
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Kaiserstuhl

Re: Button-Click per Software simulieren

Beitrag von linus »

Also ich habe in einer Anwendung, die wahlweise im Bediener- oder Automatik-Modus läuft mal sowas implementiert (also Steuerung über Aufruf-Parameter)... Hilft das vielleicht weiter?

Code: Alles auswählen

procedure TFrmDispo.FormCreate(Sender: TObject);
var
  ....
begin
  // Programm-Modus festlegen
  fPM := pmUser;
  for iParam := 0 to ParamCount do begin
    Param := ParamStr(iParam);
 
    // Zerlegung
    Key   := StrListElem(Param, '=', 1); Key   := AnsiUpperCase(Key);
    Value := StrListElem(Param, '=', 2); Value := AnsiUpperCase(Value);
 
    // Festlegung Programm-Modus
       if (Key = 'PM') then begin
         if (Value = 'AUTO')
           then fPM := pmAuto
           else fPM := pmUser;
         end;
    end;
 
  // im Automatic-Mode Arbeiten verrichten
  if (fPM = pmAuto) then begin
    hier einfach die notwendigen Arbeiten erledigen, wie z.B.
    - zuerst die notwendigen Werte eintragen/einlesen
    - Plausi-Prüfungen
    - Druck auslösen
    - sonstiges
 
    // und dann nix wie weg...
    Close;
    Application.Terminate;
    end;
end;
Wer mehr denkt hat mehr vom Hirn...

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: Button-Click per Software simulieren

Beitrag von malabarista »

@linus: genauso soll es ablaufen, wahlweise Bedienermodus oder auto-Modus.
Nur mit dem Unterschied, dass es über mehrere Formulare läuft (nicht nur eines)

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: Button-Click per Software simulieren

Beitrag von malabarista »

@linus: kann man das alles bereits im FormCreate machen ???
Das war mir neu. Ich dachte man müsste mindestens den Show-/Paint-Vorgang abwarten.

linus
Beiträge: 22
Registriert: Di 19. Okt 2010, 17:23
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Kaiserstuhl

Re: Button-Click per Software simulieren

Beitrag von linus »

malabarista hat geschrieben:@linus: genauso soll es ablaufen, wahlweise Bedienermodus oder auto-Modus.
Nur mit dem Unterschied, dass es über mehrere Formulare läuft (nicht nur eines)


Wenn das über mehrere Formulare weg laufen soll, würde ich mir überlegen, ob die betreffenden Code-Teile in eine separate Unit ausgelagert werden können. Dann ist das auch etwas schöner zum Lesen und evtl. auch etwas besser für die Wartbarkeit...
Wer mehr denkt hat mehr vom Hirn...

jc99
Beiträge: 29
Registriert: Fr 19. Mai 2017, 18:04
OS, Lazarus, FPC: Win10x64, L 1.8rc3, FPC3.0.2
CPU-Target: 64
Wohnort: Nord-Baden
Kontaktdaten:

Re: Button-Click per Software simulieren

Beitrag von jc99 »

malabarista hat geschrieben:@linus: kann man das alles bereits im FormCreate machen ???
Das war mir neu. Ich dachte man müsste mindestens den Show-/Paint-Vorgang abwarten.

[Standardantwort #1:]... das kommt drauf an ...
Und zwar ob du Teile deines Codes in separate Forms, Datamodules o.ä. ausgelagert hast.
Der Form selbst ist bei Formcreate schon voll erstellt, und solange Du dich nur auf Objekte und Klassen im Form beziehst ist alles OK, aber Du kannst hier nicht davon ausgehen, daß andere Forms und Klassen auch schon erstellt worden sind.
Desweiteren ist die Fehlerbehandlung nicht so schön oder führt zu interessanten Ergebnissen. Soweit ich es verstanden habe ist FormCreate dazu gedacht weitere Elemente Componenten, Controls o.ä. zu Initialisieren.
Die Fehlerbehandlung geht bei einem Fehler in FormCreate davon aus, daß der Form nicht in Ordnung ist und Zerstört ihn gleich wieder. Deshalb ist es besser zumindest ein OnShow, oder einen OnTimer abzuwarten, damit ist sichergestellt daß sich die Anwendung im Run-Modus befindet.
OS: ...-Win10 x64
Laz: ...-1.8rc1
https://github.com/joecare99/public
'~| . . /'' . .
,_|oe \_,are

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: Button-Click per Software simulieren

Beitrag von malabarista »

Das mit dem OnTimer ist eine schöne Idee.
Damit komme ich aus diesem ersten OnShow heraus.

Antworten