Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Form in Event erzeugen mündet in merkwürdiges Verhalten (https://www.delphipraxis.net/174296-form-event-erzeugen-muendet-merkwuerdiges-verhalten.html)

delphinub23 15. Apr 2013 18:35

Form in Event erzeugen mündet in merkwürdiges Verhalten
 
Hallo Delphianer,

ich möchte eine Art IRC-Chat mit separaten Chat-Fenstern für jede private Unterhaltung erstellen. Für die Kommunikation zwischen IRC und Client nutze ich die IdIRC- Komponente.
Ziel soll sein, dass sich bei eingehenden privaten Nachrichten (Event: IdIRC.OnPrivateMessage) ein neues Formular (wichtig: NICHT modal) öffnet.

Derzeit versuche ich es so:

Hauptformular
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdContext, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdCmdTCPClient, IdIRC, Unit2;

type
  TForm1 = class(TForm)
    IdIRC1: TIdIRC;
    procedure IdIRC1Connected(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure IdIRC1ServerWelcome(ASender: TIdContext; const AMsg: string);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  IdIRC1.Connect;
end;

procedure TForm1.IdIRC1Connected(Sender: TObject);
begin
  OutputDebugString(PChar('##### IRCConnected'));
end;

procedure TForm1.IdIRC1ServerWelcome(ASender: TIdContext; const AMsg: string);
begin
  OutputDebugString(PChar('##### IdIRCServerWelcome'));
  if TForm2.Execute then
    OutputDebugString(PChar('##### TForm2.Executed'));
end;

end.
Chat-Formular
Delphi-Quellcode:
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    class var FForm: TForm2;
    class function Execute: Boolean;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

class function TForm2.Execute: Boolean;
begin
  FForm := TForm2.Create(Application);
  FForm.Show;
  Result := True;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  Beep;
end;

end.
Wenn der Code ausgeführt wird, öffnet sich die zweite Form. Nur leider friert die Anwendung direkt ein. Wenn ich aber das zweite Formular außerhalb eines Events erzeuge, funktioniert das. Modale Formulare funktionieren, wenn diese innerhalb des Events erzeugt und angezeigt werden.

Nun zu meiner Frage:
Ist es möglich Formulare innerhalb von Ereignissen zu erzeugen, die nicht modal sind?

grüße,
dnub

Aviator 15. Apr 2013 20:10

AW: Form in Event erzeugen mündet in merkwürdiges Verhalten
 
Probier es mal mit Delphi-Referenz durchsuchenCreateNew

delphinub23 15. Apr 2013 22:11

AW: Form in Event erzeugen mündet in merkwürdiges Verhalten
 
CreateNew zeigt das gleiche Verhalten - sollte auch so sein, da durch CreateNew auch der Standard Konstruktor gerufen wird.

Luckie 15. Apr 2013 22:13

AW: Form in Event erzeugen mündet in merkwürdiges Verhalten
 
Zeige doch endlich mal Quellcode. So kommen wir nicht weiter.

delphinub23 15. Apr 2013 22:20

AW: Form in Event erzeugen mündet in merkwürdiges Verhalten
 
Der Quelltext aus dem ersten Post reicht dir nicht?
Mehr habe ich nicht.

Luckie 15. Apr 2013 22:30

AW: Form in Event erzeugen mündet in merkwürdiges Verhalten
 
Sorry, habe die Threads verwechselt.

Sir Rufo 15. Apr 2013 22:38

AW: Form in Event erzeugen mündet in merkwürdiges Verhalten
 
Ich wette mal, dass der Aufruf nicht im MainThread-Kontext erfolgt.

delphinub23 16. Apr 2013 12:03

AW: Form in Event erzeugen mündet in merkwürdiges Verhalten
 
Zitat:

Zitat von Sir Rufo (Beitrag 1211599)
Ich wette mal, dass der Aufruf nicht im MainThread-Kontext erfolgt.

Korrekt. Die IdIRC-Komponente arbeitet die Events in ihrer eigenen Thread-Nachrichtenschleife ab. Gelöst habe ich es, indem ich die MainForm via PostMessage informiere und dann im MainForm-Kontext das neue Formular erzeuge.

Danke an alle Beteiligten :wink:


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