AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi In virt. Meth. wird stat. Meth. aufgerufen, diese Verdecken?
Thema durchsuchen
Ansicht
Themen-Optionen

In virt. Meth. wird stat. Meth. aufgerufen, diese Verdecken?

Ein Thema von APP · begonnen am 22. Apr 2003 · letzter Beitrag vom 23. Apr 2003
Antwort Antwort
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#1

In virt. Meth. wird stat. Meth. aufgerufen, diese Verdecken?

  Alt 22. Apr 2003, 06:57
Hallo,
Ich möchte verhindern, dass ein Modales Fenster unter bestimmten Umständen geschlossen wird.
[EDIT] Das Programm soll aber weiterlaufen, auch wenn das Fenster geöffnet bleibt. [/EDIT]

(Siehe auch Thread)
Dort Überschrieb ich die Methode ShowModal, diese Lösung ist aber nicht sehr elegant.

Daher untersuchte ich die Methode ShowModal etwas genauer:

in der
Delphi-Quellcode:
function TCustomForm.ShowModal: Integer;
var
...
begin
...
  try
    Show;
    try
...
    finally
      Hide; // <---------------------------------
    end;
  finally
...
  end;
end;
befindet sich u.a. der Aufruf von Hide, den ich Überschreiben wollte.

Hide ist aber eine statische Methode:

Delphi-Quellcode:
procedure TCustomForm.Hide;
begin
  Visible := False;
end;
Wenn ich nun folgendes schreibe

Delphi-Quellcode:
TYPE
   TForm3 = CLASS(TForm)
   PRIVATE
      FDebugMode: Boolean;
   PUBLIC
      PROCEDURE Hide; // Static, d.h. nicht Override-bar
      PROPERTY DebugMode: Boolean READ FDebugMode WRITE FDebugMode;
   END;

PROCEDURE TForm3.Hide;
BEGIN
   IF DebugMode AND (fsModal IN self.FormState) THEN
   ELSE
      Visible := False; // Original-Code
END;
wird nach

Delphi-Quellcode:
PROCEDURE TForm1.Button2Click(Sender: TObject);
VAR
   aDebugForm : TForm3;
BEGIN
   aDebugForm := TForm3.Create(self);
   aDebugForm.DebugMode := TRUE;
   aDebugForm.Showmodal; // Hier gibt es ein "Hide"
END;
trotzdem TCustomForm.Hide und nicht "mein" Hide aufgerufen,
kann ich das irgendwie verhindern (ausser das ich die VCL patche) ?


p.s. Mir ist klar das dieses Verhalten die Regeln der OOP befolgt (zumindest jene die mir geläufig sind), aber trotzdem: Es muß doch noch einen anderen Weg geben, oder?
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#2
  Alt 22. Apr 2003, 07:09
Hallo App,

wie du ja selbst schon gesagt hast: Hide ist eine statische Methode und wird deshalb "früh gebunden", soll heißen, die Adresse der Funktion wird schon im Comiliervorgang festgelegt und sie hat keinen Eintrag in der VMT (virtuellen Methoden Tabelle). Es kann dir deshalb (außer dem Patchen von VCL) nicht gelingen, dass dein Hide aufgerufen wird. Natürlich könntest du versuchen eine neue Komponente von einem Vorgänger abzuleiten, bei der Hide noch nicht definiert ist, dabei dürfte aber der Aufwand deutlich größer sein.

Eventuell könntest du eine eigene "ShowModalCustomHide" schreiben, die parallel zu ShowModal existiert.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3
  Alt 22. Apr 2003, 08:43
Hallo,

erst mal ist es wichtig zu wissen was für ein Fenster du benutzt. Ich würde ein "normales" Fenster benutzen und es mit ShowModal aufrufen. Dann ist es recht einfach alle Bedingungen in der OnClose Methode zu verarbeiten um ein Schließen zu verhindern.

Gruß oki
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#4
  Alt 22. Apr 2003, 10:58
Hallo oki,
da hast Du schon recht, aber mein Programm soll danach ja weiterlaufen,
das tut es aber nicht wenn das modale Fenster nicht geschlossen wird.

TSCHULDIGUNG , ich dachte neues Thema - neuer Tread, leider ist der Zusammenhang nun futsch,
daher eine Kurzzusammenfassung des "Parent-Threads"
Programm anhalten und auf Taste/Button warten:

Zitat:
ich schreibe gerade an ein "DebugWindow", das bestimmte Meldungen, die ich im Hauptprogramm einfüge in einem separaten Fenster anzeigt.
...
Nun möchte ich aber eine Art "Einzelschrittmodus" implementieren, d.h. erst nachdem der Weiter-Knopf gedrückt wurde soll das Hauptprogramm weitermachen.
...
  • Zuerst dachte ich daran das DebugWindow modal anzuzeigen,
    das hat aber den Nachteil das das Fenster bis zum nächsten
    Aufruf verschwindet, das möcht ich aber nicht!
    (Ich habe auch versucht zur Laufzeit ein 2. Fenster zu erzeugen und
    als Parent ein Panel auf dem DebugWindow anzugeben und dieses Fenster
    Modal zu zeigen, leider funktionierte das Ganze nicht wie erwartet)
  • Dann versuchte ich es mit einer Endlosschleife:
p.s. Ich habe dort auch eine Lösung gepostet, die ich aber nicht sehr elegant finde .
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#5
  Alt 22. Apr 2003, 15:33
Hi,

ich hab mir deine eingefügten Komentare sowie deinen Link angeschaut.

Folgende Lösung:

Schreibe einen Thread in dem Du die Aktionen deines nicht modalen Überwachungsfensters steuerst (Fenster auch in diesem Thread kreieren und aufrufen).

An den entsprechenden Stellen deines Hauptprogrammes setzt du eine Abfrage über eine eigene Function für Warten (in dieser ein Sleep und Application.ProcessMessages). Mit dem Thred kannst du ein Ereignis senden, mit dem eine globale Variable deines Hauptprogrammes gesetzt wird.

Das alles so etwa nach dem Schema


Delphi-Quellcode:
Function MyWeiter: Boolean;
begin
  Result := False;
  sleep(50);
  Application.ProcessMessages;
  if not isWait then Result := True;
end;

  // laufend im Hauptprogramm

  // ab hier warten
  repeat
  until MyWeiter
  isWait := False;
  

  // und weiter zum nächsten Wartepunkt
Die Variable isWait wird durch das Ereignis des Thread für das Anzeigefenster gesetzt. So liegt das Fenster aus dem Thread heraus immer oben und der Programmablauf wird durch die Schalter gesteuert.

Gruß oki
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#6
  Alt 22. Apr 2003, 20:49
Hallo oki,
vielen Dank für Deine Bemühungen, ich habe mir Deine Lösung leider nur Kurz ansehen können, aber ich finde den Ansatz sehr interessant.


p.s. Außerdem habe ich etwas über Endlosschleifen gelernt:
Delphi-Quellcode:
REPEAT
  sleep(50);
  Application.ProcessMessages;
UNTIL MyWeiter;
belastet den Prozessor (genauer die CPU-Auslastun im Taskmanager) fast gar nicht, aber
Delphi-Quellcode:
REPEAT
  Application.ProcessMessages;
UNTIL MyWeiter;
führt zu einer 100% CPU-Auslastung

...und ein Druck auf
Delphi-Quellcode:
PROCEDURE TForm1.Button4Click(Sender: TObject);
BEGIN
   sleep(3000);
END;
führt dazu, dass das Programm 3 Sekunden nicht ansprechbar ist (d.h. nicht einmal die Form läßt sich bewegen), da habe ich die OH
Zitat:
The Sleep function suspends the execution of the current thread for a specified interval.
wohl falsch verstanden, ich meinte eher dass der Prozess "Prozessorzeit zurückgibt" aber doch noch Messages verarbeitet (wie der kleine Maxi sich das so vorstellt...).

Tja, man lernt nie aus!
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7
  Alt 22. Apr 2003, 22:13
Zitat:
suspends the execution of the current thread
Man muss nur wissen was alles zum "current thread" gehört.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#8
  Alt 23. Apr 2003, 14:02
Jo,

ich denke das wars.

Gruß oki
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 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