Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi was machen mit den Hangups ? Konsolenprobleme die zweite ^ ^ (https://www.delphipraxis.net/37700-machen-mit-den-hangups-konsolenprobleme-die-zweite-%5E-%5E.html)

hboy 12. Jan 2005 14:02

Re: was machen mit den Hangups ? Konsolenprobleme die zweite
 
nice one... nein es gibt wirklich keinen. die ( diesmal mit richtigem genus für Schleife ^^ ) Message-loop wirst du vergeblich suchen. es gibt eine bei ConsoleIn, die allerdings nach Ende der eingabe abgebrochen wird.
Wenn das so weitergeht pack ich das ganze zeug doch in einen Thread, mach ne eigene Message-loop und versuche, das Fensterli bei der CloseFunc zu schließen...

hboy 12. Jan 2005 14:06

Re: was machen mit den Hangups ? Konsolenprobleme die zweite
 
ich wollte deswegen keine eigene message-verarbeitung, weil ich ja sonst die key events des Fensters verwenden müsste, so kann ich mir die Zeichen direkt aus der Message holen. Nur so als Anmerkung.

Assarbad 12. Jan 2005 14:38

Re: was machen mit den Hangups ? Konsolenprobleme die zweite
 
Zitat:

Zitat von hboy
nice one... nein es gibt wirklich keinen. die ( diesmal mit richtigem genus für Schleife ^^ ) Message-loop wirst du vergeblich suchen. es gibt eine bei ConsoleIn, die allerdings nach Ende der eingabe abgebrochen wird.

Es gibt, wenn du ein Fenster (auf welche Art auch immer) in Windows erstellst, _immer_ eine Message-Loop. Wie gesagt, sie kann implizit sein, aber darum geht es hier nicht. Zeig doch einfach mal wo/wie du das Fenster erzeugst? Ist es _noch_ VCL? Siehe oben "ConsoleWin" (das sieht nach VCL-Form aus).

hboy 12. Jan 2005 14:50

Re: was machen mit den Hangups ? Konsolenprobleme die zweite
 
Erstens:

Hierarchie
Delphi-Quellcode:
TObject
  |
  TCustomWnd
    |
    TWnd
      |
      TConsoleWnd
ist das meine eigene Fensterklasse, zweitens gibt es kein application und deswegen auch kein application.run in dem die sein könnte und drittens wird das Fenster direkt über die WindowProc initialisiert, oder sollte ich mich da irren ?. Dazu braucht es noch keine Schleife um eine Queue abzuarbeiten.

Sag mir wo die Message-loop stecken soll ?

PS: zum Thema detaillierter Einblick in diesen Thread: Ich habe diese Konsole da
http://www.delphipraxis.net/download.php?id=9210
bis jetzt so weit gebracht. Programm ist ~130kb groß. Das will ich mit der VCL mal sehn ;)

hboy 12. Jan 2005 14:56

Re: was machen mit den Hangups ? Konsolenprobleme die zweite
 
wenn ich mir deinen Code unter dem link da anschau finde ich auch eine Message-loop. Und jetzt denk dir die mal weg.

Assarbad 12. Jan 2005 15:25

Re: was machen mit den Hangups ? Konsolenprobleme die zweite
 
Zitat:

Zitat von hboy
Erstens:

Hierarchie
Delphi-Quellcode:
TObject
  |
  TCustomWnd
    |
    TWnd
      |
      TConsoleWnd
ist das meine eigene Fensterklasse, zweitens gibt es kein application und deswegen auch kein application.run in dem die sein könnte und drittens wird das Fenster direkt über die WindowProc initialisiert, oder sollte ich mich da irren ?. Dazu braucht es noch keine Schleife um eine Queue abzuarbeiten.

Sondern?

Zitat:

Zitat von hboy
Sag mir wo die Message-loop stecken soll ?

Wird das jetzt Brezeln braten ... ähem Rätsel raten? Das will ich von dir Wissen. Jedes Form oder Fenster braucht eine Message-Loop, soviel steht fest. Und wie exakt du die hookst um dort deinen weiteren Code unterzubringen ist ja jetzt die Frage.

Zitat:

Zitat von hboy
wenn ich mir deinen Code unter dem link da anschau finde ich auch eine Message-loop. Und jetzt denk dir die mal weg.

Du meinst sicher "program test1;" - wenn du dort die Schleife wegläßt, wird sich das Programm sofort beenden, denn es kann keine Nachrichtenverarbeitung stattfinden.

hboy 12. Jan 2005 15:45

Re: was machen mit den Hangups ? Konsolenprobleme die zweite
 
hm also 1. Feststellung: es *braucht* einen loop. ja genau darum geht es ja wie ich die schleife unterbing ohne mein ganzes konzept übern haufen zu schmeißen ( nicht vorher eingeplant da nice-to-have )

Assarbad 12. Jan 2005 17:36

Re: was machen mit den Hangups ? Konsolenprobleme die zweite
 
Zitat:

Zitat von hboy
hm also 1. Feststellung: es *braucht* einen loop. ja genau darum geht es ja wie ich die schleife unterbing ohne mein ganzes konzept übern haufen zu schmeißen ( nicht vorher eingeplant da nice-to-have )

Kannst du mal die Implementation des Konsolenfensters (des Fensters!!!) zeigen.

hboy 12. Jan 2005 19:08

Re: was machen mit den Hangups ? Konsolenprobleme die zweite
 
hättest den Klassenname nennen müssn. ich nehm mal an TConsoleWnd. TCustomWnd is meine heilige kuh ;)

Delphi-Quellcode:
unit ConsoleWnd;

interface
  uses WndClass, StaticClass, types, windows, sysutils;

  type TConsoleWnd = class(TCustomWnd)
    proto: TCustomWndProtocolstatic;
    killed : boolean;
    Constructor Create(Param: Cardinal);
    Destructor Destroy; override;
  private
    fUseMessageThread: Boolean;
    TID: Cardinal;
    procedure Resize(Sender: TObject);
    procedure Hide(Sender: TObject);
    procedure SetUseMessageThread(doit: Boolean);

  public
    property UseMessageThread: Boolean read fUseMessageThread write SetUseMessageThread;
    procedure ProcessMessage;
  end;

  var WinKilled: Boolean;

implementation

 Constructor TConsoleWnd.Create(Param: Cardinal);
 begin
   inherited;
   self.Width := 700;
   self.Height := 400;
   self.UseMinConstraints := true;
   self.MinConstraintsVal := Point(700, 400);
   proto := TCustomWndProtocolstatic.Create(self.handle);
   proto.Width := self.ClientRect.Right;
   proto.Height := self.ClientRect.Bottom;
   proto.font.Color := $FFFFFF;
   proto.font.Name := 'Courier';
   proto.Color := $0;
   proto.Clear;
   self.OnResize := Resize;
   self.OnHide := Hide;
 end;

 procedure TConsoleWnd.Resize(Sender: TObject);
 begin
   if self.ClientRect.Bottom =0 then exit;
   proto.Width := self.ClientRect.Right;
   proto.Height := self.ClientRect.Bottom;
 end;

 procedure TConsoleWnd.Hide(Sender: TObject);
 begin
   proto.Hide;
   windows.TerminateProcess(GetCurrentProcess,0);
 end;

 Destructor TConsoleWnd.Destroy;
 begin
   proto.Free;
   inherited;
 end;

 procedure TConsoleWnd.ProcessMessage;
 var msg: TMsg;
 begin
   if GetMessage(msg,0,0,0) then
   begin
     TranslateMessage(msg);
     DispatchMessage(msg);
   end;
 end;


 procedure MessageProc(param: Cardinal);
 begin
  while true do TConsoleWnd(param).ProcessMessage;
 end;

 procedure TConsoleWnd.SetUseMessageThread(doit: Boolean);
 begin
   if (self.fUseMessageThread = false) and doit then
   begin
     BeginThread(nil,0,@MessageProc,@self,0,TID);
   end;

   if (self.fUseMessageThread = true) and (not doit) then
   begin
     TerminateThread(TID,0);
   end;
 end;
end.

hboy 12. Jan 2005 19:10

Re: was machen mit den Hangups ? Konsolenprobleme die zweite
 
kleine zwischenbilanz:
Das hier artet irgendwie in eine code- und Textschlacht aus. der Lösung bin ich allerdings noch nicht viel näher gekommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 Uhr.
Seite 3 von 5     123 45      

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