Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi weiterlaufen während showmessage() (https://www.delphipraxis.net/70150-weiterlaufen-waehrend-showmessage.html)

happyaura 25. Mai 2006 21:12


weiterlaufen während showmessage()
 
Hallo,
ich möchte dem User meines Programmes gerne etwas mitteilen, ohne das während dessen das Programm stehen bleibt. Am liebsten wäre es mir, wenn das ganze als popup laufen könnte, nicht als label.
ein wenig pseudocode sagt mehr, als tausend worte:
Delphi-Quellcode:
procedure Tform1.ontimer
begin
  timer.enabled:= false;

  // tu was
  if bedingung then
    //benachrichtige user z.B. Showmessage
    // das fenster sollte aber möglichst nicht bei jedem timer ausgelöst werden, sondern nur, wenn keines offen ist...
  timer.enabled:= true;
end
P.S.: mit suchen hab ich es schon versucht, aber irgendwie wohl nicht die passenden suchwörter gefunden...

Cyberbob 25. Mai 2006 21:22

Re: weiterlaufen während showmessage()
 
Das ist meines Wissens nicht möglich. Du könntest ein neues Formular erstellen und dieses anzeigen. Dann müssten die Prozeduren der Hauptform weiteraebeiten.

happyaura 25. Mai 2006 21:31

Re: weiterlaufen während showmessage()
 
das wär natürlich höchst schade. gibt es denn eine möglichkeit, wenn man die forderung nach "warnung nicht doppelt öffnen" fallen lässt? primär geht es mir erst einmal darum, dass das programm weiterläuft, vor allem der Timer weiterläuft. Buttonklicks und andere Benutzereingaben können meinentwegen gerne erst abgearbeitet werden, wenn die warnmeldung weggeklickt ist.

Cyberbob 25. Mai 2006 21:36

Re: weiterlaufen während showmessage()
 
Du könntest mit Threads arbeiten. Schau mal unter http://www.michael-puff.de/dirindex....phi/Tutorials/ nach.
Aber meineswissens gibt es keine einfache möglichkeit, das Programm während der anzeige einer MessageBox weiterlaufen zu lassen. Evtl gehts ja über SendMessage oder dergleichen, womit ich mich aber nicht so auskenne.

lizardking 25. Mai 2006 21:41

Re: weiterlaufen während showmessage()
 
Zitat:

Zitat von happyaura
das wär natürlich höchst schade. gibt es denn eine möglichkeit, wenn man die forderung nach "warnung nicht doppelt öffnen" fallen lässt? primär geht es mir erst einmal darum, dass das programm weiterläuft, vor allem der Timer weiterläuft. Buttonklicks und andere Benutzereingaben können meinentwegen gerne erst abgearbeitet werden, wenn die warnmeldung weggeklickt ist.

Cyberbob hat doch 'ne passende Loesung beschrieben... Einfach 'ne neue Form dafuer anlegen. Die darf halt nur nicht modal angezeigt werden(wie es z.B. ShowMessage macht), dann laeuft das Programm normal weiter.

Gruss, Lizzy

happyaura 25. Mai 2006 23:23

Re: weiterlaufen während showmessage()
 
hatte gehofft, dass es eine Lösung mit 1-2 befehlen gibt. Hab es nun aber über ein neues formular gebastelt, das erste mal, dass eine anwendung bei mir aus 2 formen bestehet. Und siehe da, es klappt und war gar nicht so schlimm ;-) Im Gegenteil, es ist so sogar jetzt noch etwas anwenderfreundlicher geworden.

Vielen dank für eure Hilfe.

Gruß Martin.

Luckie 25. Mai 2006 23:41

Re: weiterlaufen während showmessage()
 
Wenn du das Formular aber nicht modal anzeigen lässt, verschwindet es im Hintergrund, wenn der Benutzer das darunterliegende Fenster anklickt. Und das ist dann doch wohl nicht so gedacht oder? Ein modales Fenster hat nun mal die Eigenschaft, dass es erst weiterget, wenn man es schließt.

juergen 26. Mai 2006 00:28

Re: weiterlaufen während showmessage()
 
wie wäre es die 2. Form dann auf StayOnTop zu setzen und die Hauptform auf visible := false zu setzen?

Luckie 26. Mai 2006 00:34

Re: weiterlaufen während showmessage()
 
Weil man dann auch nicht mit einem anderen Fenster weiterarbeitenn kann, weil dein Fenster dann immer im Weg ist.

lizardking 26. Mai 2006 06:44

Re: weiterlaufen während showmessage()
 
Zitat:

Zitat von Luckie
Wenn du das Formular aber nicht modal anzeigen lässt, verschwindet es im Hintergrund, wenn der Benutzer das darunterliegende Fenster anklickt. Und das ist dann doch wohl nicht so gedacht oder? Ein modales Fenster hat nun mal die Eigenschaft, dass es erst weiterget, wenn man es schließt.

Kann man ja entsprechend so steuern, dass im OnActivate der Hauptform ein BringToFront der zweiten Form aufgerufen wird, wenn diese sichtbar ist. Zwar eine etwas... oehm... hakelige Loesung, aber sie funktioniert ;)

Gruss,
Lizzy

turboPASCAL 26. Mai 2006 08:59

Re: weiterlaufen während showmessage()
 
Wie währe es den so:

Delphi-Quellcode:
implementation

{$R *.dfm}

var
  ShowMyMessage: Boolean = FALSE;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // Anderer Code

  if Bedingung then
  begin
    if not ShowMyMessage then
    begin
      ShowMyMessage := TRUE;
      MessageBox(Handle, 'Hi', 'Information', {MB_TOPMOST or} MB_ICONINFORMATION or MB_OK);
    end;
  end;

  // Anderer Code
end;

Cyberbob 26. Mai 2006 13:37

Re: weiterlaufen während showmessage()
 
Er will aber, das das Programm weiterläuft (weiterarbeitet), während die Meldung angezeigt wird.

Helmi 26. Mai 2006 14:20

Re: weiterlaufen während showmessage()
 
Hallo,

du könntest es auch so machen:

Delphi-Quellcode:
  private
    { Private-Deklarationen }
    f: TForm;

{ ... }

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  Timer1.Enabled := CheckBox1.Checked;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  If CheckBox2.Checked then
    begin
      If not f.Visible then
        f.Show;
    end
  else
    begin
      f.Hide;
    end;

  Label1.Caption := TimeToStr(now);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  f := CreateMessageDialog('Meldung', mtWarning, []);
  f.Height := 75;
end;
CheckBox2.checked wäre deine Bedingung
und die checkBox1 diente mir nur als ein/ausschalten des timers.

ach ja - über CreateMessageDialog bekommst du eine TForm.
Und diese kannst du, wenn du es willst, nach Herzenslust ändern.

z. B.:
Delphi-Quellcode:
f.color := blue;
etc.
[edit]
die Zeile:
Delphi-Quellcode:
Label1.Caption := TimeToStr(now);
dient nur dazu, dass man sieht dass das Prog weiterläuft

happyaura 27. Mai 2006 00:39

Re: weiterlaufen während showmessage()
 
Vielen Dank für eure antworten.

ich hab es so ähnlch gehandhabt, wie Helmi vorgeschlagen hat, sprich mit show und hide gearbeitet. Nur hab ich mein eigenes Formular, in dem ich mit ein paar Labels ein paar Statusmeldungen ausgebe. Aber CreateMessageDialog kann man sich mal gut merken.
Es soll schon so sein, dass während des dies warnfenster offen ist, andere eingaben im Hauptformular getätigt werden können, bzw sogar sollen, damit die fehlermeldung nicht mehr auftritt.

turboPASCAL 27. Mai 2006 07:32

Re: weiterlaufen während showmessage()
 
Zitat:

Zitat von Cyberbob
Er will aber, das das Programm weiterläuft (weiterarbeitet), während die Meldung angezeigt wird.

Und das macht es auch, MessageBox hält das Programm nicht an!

SirThornberry 27. Mai 2006 08:35

Re: weiterlaufen während showmessage()
 
also bisher hat bei mir Messagebox auch immer dazu geführt das der Source hinter dem Aufruf erst ausgeführt wird wenn der Dialog geschlossen wird.
Es gibt aber auch noch die Möglichkeit mit PostMessage an die eigene Anwendung eine Message zu schicken und bei Empfang der Message ShowMessage aufzurufen.

turboPASCAL 27. Mai 2006 09:07

Re: weiterlaufen während showmessage()
 
@Gummibärchen, ich bezog mich nur auf das Timerbeispiel.

Zitat:

Zitat von SirThornberry
Es gibt aber auch noch die Möglichkeit mit PostMessage an die eigene Anwendung eine Message zu schicken und bei Empfang der Message ShowMessage aufzurufen.

Das ist auch eine Idee die man Umsetzen könnte.

Delphi-Quellcode:
unit Unit1;

interface

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

const
  WM_MYMESSAGE = WM_USER + $000001;

type
  TMyMessage = Record
                 // foo
               end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure WMMyMessage(var M: TMyMessage); message WM_MYMESSAGE;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMMyMessage(var M: TMyMessage);
begin
  ShowMessage('Hi');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  PostMessage(Handle, WM_MyMessage, 0, 0);
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:46 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