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:
über
if Sender is form2.neuermitarbeiter then
tut3.show
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... |
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:
auslöst.
OnClick
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 ... |
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:
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.
procedure Form2.Form2Show(Sender: TObject);
begin Form1.OnButtonClick := ClickEventHandler; end; procedure Form2.ClickEventHandler(Sender: TObject); begin // Nächster Tutorial Schritt einleiten end; |
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:
Nun der Aufruf aus der Form2
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;
Delphi-Quellcode:
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.
unit Unit2;
... implementation {$R *.dfm} uses Unit1; procedure TForm2.Button1Click(Sender: TObject); begin SendMessage(Form1.Handle, WM_FORM2_BTN1_MSG, 0, 0); //<<<<<<<<< end; |
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.
|
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.
|
AW: Knopfdruck Formübergreifend behandeln
Zitat:
|
AW: Knopfdruck Formübergreifend behandeln
Heute hat jemand geschrieben, dass wenn man schon eine Antwort liefert, diese korrekt sein sollte. :roll:
|
AW: Knopfdruck Formübergreifend behandeln
Eine Antwort, von korrekt war nicht die Rede.
|
AW: Knopfdruck Formübergreifend behandeln
dankeschön habs hinbekommen :thumb:
|
AW: Knopfdruck Formübergreifend behandeln
Darf man fragen, wie du es jetzt gelöst hast?
|
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:
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.
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; 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 |
AW: Knopfdruck Formübergreifend behandeln
Das Property Checked einer TCheckBox ist vom Typ Boolean. Es genügt daher, einfach
Delphi-Quellcode:
zu schreiben. Zur genauen Erläuterung: Wahrheitswert nicht auf TRUE prüfen.
if form2.tut4check.Checked then
|
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
|
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.
|
AW: Knopfdruck Formübergreifend behandeln
Zitat:
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. |
AW: Knopfdruck Formübergreifend behandeln
Zitat:
Zitat:
|
AW: Knopfdruck Formübergreifend behandeln
Du kannst es auch gern sichtbar und sicherbarer nennen.
sichtbar, sichbarer, am Sichtbarsten und Ultramegasichtbar :mrgreen: |
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