Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Knopfdruck Formübergreifend behandeln (https://www.delphipraxis.net/180237-knopfdruck-formuebergreifend-behandeln.html)

rhodan 4. Mai 2014 07:42

Knopfdruck Formübergreifend behandeln
 
hallo!

ich bin gerade dabei ein tutorial zu programmieren welches in einer eigenen form angezeigt wird.
In einem gewissen Schritt fordere ich den Benutzer auf per Knopfdruck (auf dem hauptformular) einen neuen Mitarbeiter anzulegen.
Das problem ist, ich krieg es auf der Tutorialform nicht mit wenn dieser button gedrückt wurde, um den nächsten schritt im tutorial einzuleiten...die mainform heisst 'form2' die andere 'tutorial'.
ich hab von von

Delphi-Quellcode:
if Sender is form2.neuermitarbeiter then
tut3.show
über

Delphi-Quellcode:
if form2.neuermitarbeiter.click=true then

sowie

Delphi-Quellcode:
if (Sender is form2.neuermitarbeiter) then

ein bischen was ausprobiert, ich kriegs irgendwie nicht hin :S
ich mache das in einer timer routine alle 500ms..wie prüfe ich ob der user auf form2 einen bestimmten button gedrückt hat??! :( :?

danke für die hilfe...

Sir Rufo 4. Mai 2014 09:02

AW: Knopfdruck Formübergreifend behandeln
 
Das geht leider nicht, denn es wird nirgendwo vermerkt, dass ein Button gedrückt wurde.

In dem Moment des Drückens wird eine Nachricht verschickt auf die der Button dann reagiert und das Ereignis
Delphi-Quellcode:
OnClick
auslöst.

Du kannst jetzt versuchen auf diese Nachricht zu lauschen oder dein Tutorial im OnClick des Buttons zu informieren oder selber in der Form einen Status merken oder ...

Aviator 4. Mai 2014 09:08

AW: Knopfdruck Formübergreifend behandeln
 
Hier würden dir Events weiterhelfen.
Entweder abonnierst du auch in Form2 das OnClick Event des Buttons in Form1 oder du definierst dir ein eigenes Event, das ausgelöst wird, sobald du den Button klickst.

Quellcode Form1:
Delphi-Quellcode:
private
  FOnButtonClick: TNotifyEvent
public
  property OnButtonClick: TNotifyEvent read FOnButtonClick write FOnButtonClick;
...

procedure Form1.ButtonClick(Sender: TObject);
begin
  if Assigned(FOnButtonClick) then
    FOnButtonClick(Sender);
end;

Quellcode Form2:
Delphi-Quellcode:
procedure Form2.Form2Show(Sender: TObject);
begin
  Form1.OnButtonClick := ClickEventHandler;
end;

procedure Form2.ClickEventHandler(Sender: TObject);
begin
  // Nächster Tutorial Schritt einleiten
end;
Der Quellcode ist nur so runtergeschrieben und nicht getestet. Es ist möglich, dass Fehler drin sind. Schau dir aber bitte trotzdem das Tutorial auf Delphi-Treff an, damit du verstehst, was genau hier passiert. Mein Beispiel soll nur als Grundlage bzw. als Anfang dienen.

Popov 4. Mai 2014 12:19

AW: Knopfdruck Formübergreifend behandeln
 
Das mit den Events ist schon eine gute Richtung. Eine Möglichkeit über alle Formen zu agieren wäre z. B. es mit Messages zu machen. Hier ein kleines Beispiel:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const
  WM_FORM2_BTN1_MSG = WM_USER + 1; //<<<<<<<<<

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure WMForm2Btn1(var Msg : TMessage); message WM_FORM2_BTN1_MSG; //<<<<<<<<<
...

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.WMForm2Btn1(var Msg : TMessage); //<<<<<<<<<
begin
  ShowMessage('Hallo, hier ist Form2');
end;
Nun der Aufruf aus der Form2
Delphi-Quellcode:
unit Unit2;

...

implementation

{$R *.dfm}

uses
  Unit1;

procedure TForm2.Button1Click(Sender: TObject);
begin
  SendMessage(Form1.Handle, WM_FORM2_BTN1_MSG, 0, 0); //<<<<<<<<<
end;
Du kannst bei einem Event eine Message mit abschicken. Unter normalen Umständen kann sie ignoriert werden, wenn du aber im Tutorial-Modus bist, kannst du sie auswerten.

DeddyH 4. Mai 2014 12:28

AW: Knopfdruck Formübergreifend behandeln
 
Auf diese Art und Weise hast Du aber zirkuläre Referenzen zwischen erster und zweiter Unit. Da wäre es doch besser, z.B. im versendenden Formular eine Liste von Fensterhandles vorzuhalten (in Form einer Property), in die sich die interessierten Formulare eintragen können. Diese Liste arbeitet das Formular dann einfach ab. Somit müssen zwar die Units der interessierten Formulare jeweils Unit2 einbinden, aber nicht anders herum.

Sir Rufo 4. Mai 2014 12:33

AW: Knopfdruck Formübergreifend behandeln
 
Nun ich persönlich habe dafür einen Messenger wo sich jeder für eine spezielle Message eintragen/austragen kann. Allen Beteiligten ist nur der Messenger bekannt und dadurch gibt es keine Abhängigkeiten ausser mit dem Messenger.

Popov 4. Mai 2014 12:51

AW: Knopfdruck Formübergreifend behandeln
 
Zitat:

Zitat von DeddyH (Beitrag 1257866)
Auf diese Art und Weise hast Du aber zirkuläre Referenzen zwischen erster und zweiter Unit.

Das es besser geht, stimme ich dir zu. Es ist auch nicht die Lösung. Vielmehr soll dieses Beispiel vorerst nur die Idee nennen wie es gehen könnte.

mkinzler 4. Mai 2014 12:57

AW: Knopfdruck Formübergreifend behandeln
 
Heute hat jemand geschrieben, dass wenn man schon eine Antwort liefert, diese korrekt sein sollte. :roll:

Popov 4. Mai 2014 13:10

AW: Knopfdruck Formübergreifend behandeln
 
Eine Antwort, von korrekt war nicht die Rede.

rhodan 4. Mai 2014 17:52

AW: Knopfdruck Formübergreifend behandeln
 
dankeschön habs hinbekommen :thumb:

Aviator 4. Mai 2014 18:04

AW: Knopfdruck Formübergreifend behandeln
 
Darf man fragen, wie du es jetzt gelöst hast?

rhodan 4. Mai 2014 19:58

AW: Knopfdruck Formübergreifend behandeln
 
hatte die lösung bevor ich die antworten gelesen habe hier..wobei meine lösung eher unsauber ist :S
hab auf der hauptform eine checkbox plaziert.
wenn der knopf gedrückt wird, wird sie gecheckt.

in der tutorialform dann:

Delphi-Quellcode:
form2.tut4check.enabled:=true;
.
.
//dann erfolgt irgendwo auf der hauptform der knopfdruck vom user
.
.
if form2.tut4check.Checked=true then
begin
tut3.Hide;
tut4.Show;
tutcancel.Caption:='OK';
end;
zuvor wird geprüft ob die box enabled ist bevor sie gecheckt wird, so werden alle knopfdrücke vom tutorial ignoriert bis ich bei dem richtigen schritt im Tut angekommen bin.

keine saubere lösung aber die checkbox kann zumindest überprüft werden dadurch. die events muss ich mir auf jedenfall noch angucken, danke für die tipps

Perlsau 4. Mai 2014 20:18

AW: Knopfdruck Formübergreifend behandeln
 
Das Property Checked einer TCheckBox ist vom Typ Boolean. Es genügt daher, einfach
Delphi-Quellcode:
if form2.tut4check.Checked then
zu schreiben. Zur genauen Erläuterung: Wahrheitswert nicht auf TRUE prüfen.

rhodan 4. Mai 2014 20:30

AW: Knopfdruck Formübergreifend behandeln
 
ahh, danke! spart man sich schreibarbeit...war auch froh als ich show/hide entdeckt habe..früher hab ich immer alles mit visible zugekleistert :P

Perlsau 4. Mai 2014 20:31

AW: Knopfdruck Formübergreifend behandeln
 
Wenn du dir den Link oben mal durchliest, wirst du feststellen, daß es nicht um's Einsparen von Schreibarbeit geht, sondern darum, Laufzeitfehler zu vermeiden.

himitsu 4. Mai 2014 21:20

AW: Knopfdruck Formübergreifend behandeln
 
Zitat:

Zitat von rhodan (Beitrag 1257927)
war auch froh als ich show/hide entdeckt habe..früher hab ich immer alles mit visible zugekleistert :P

Jupp, es geht nicht immer um Einsparung von Schreibarbeit/Code.

Nur weil zwei Funktionen ähnlich heißen, machen sie noch lange nicht das Selbe und man sollte tunlichts aufpassen, was man wann verwendet. :warn:


Show macht eine Komponente nicht nur sichtbar, sonder es macht sie auch sichtbar.

Show, sorgt dafür, daß Sie sichtbar wird. So wird z.B. urplötzölich ein PageControl umgeblättert, wenn man darin die Komponente "sichtbar" gemacht.
Visible aber schaltet nur die Sichtbarkeit der Komponente um und nicht Die der übergeordneten Komponenten.

Und bei einer TForm bringt das Show die Form auch noch nach vorne (BringToFront), was Visible:=True allerdings nicht macht.

DeddyH 5. Mai 2014 08:06

AW: Knopfdruck Formübergreifend behandeln
 
Zitat:

Zitat von himitsu (Beitrag 1257932)
Show macht eine Komponente nicht nur sichtbar, sonder es macht sie auch sichtbar.

WOW :shock:
Zitat:

Zitat von Opa Hoppenstedt
Im liberalen Sinne heißt liberal nicht nur liberal.

:mrgreen:

himitsu 5. Mai 2014 08:24

AW: Knopfdruck Formübergreifend behandeln
 
Du kannst es auch gern sichtbar und sicherbarer nennen.

sichtbar, sichbarer, am Sichtbarsten und Ultramegasichtbar :mrgreen:

Perlsau 5. Mai 2014 12:57

AW: Knopfdruck Formübergreifend behandeln
 
So finde ich das am optimalsten ... :twisted:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:11 Uhr.

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