Entwickler-Ecke

Sonstiges (Delphi) - wenn ShowMessage dann geht es, warum ?


mimi - Mi 21.05.03 17:49
Titel: wenn ShowMessage dann geht es, warum ?
Hallo,
ich habe folgende funktion, die aber nur funktioniert wenn ich den ShowMessage einsetzt andefals geht er nicht, warum?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function TSokubahn.ShowMyDialog(aCaption,aDialogText:String; aDialogTyp:Integer):Integer;
var
  raus:Boolean;
begin
  raus:=False;
  strCaption:=aCaption;
  strText:=aDialogText;
  DialogTyp:=aDialogTyp;
  DrawDialog:=True;
  JaNein:=-1;

  repeat
    application.ProcessMessages;
    ShowMessage('TEST'); // jetzt geht es, ohne es geht es nicht   
  until JaNein > -1;
  result:=JaNein;
end;


mimi - Mi 21.05.03 18:00

jetzt geht es auch ohne ShowMessage, ich habe einfach application.HandleMessage genommen, aber warum geht es jetzt ? was ist der unterschied ?


Da_Knuddelbaer - Mi 21.05.03 18:32
Titel: bekanntes Problem
Hey mimi, exakt das gleiche Phänomen hatte ich vor der Info-Abiturklausur auch gehabt. Beispeilsweise habe ich ein Fibonacci programmiert, ohne ShowMessage hat es funktioniert, MIT ShowMessage aber nicht. Mir scheint es liegt daran dass Delphi bei seinen Programmen eine gewisse Zeit benötigt um Aufgaben zu erfüllen. Wenn diese Zeit beispielsweise durch ShowMessages überschritten oder gar unterschritten werden dann kommt es zu Fehlern, die aber nicht im Quellcode selber liegen.
Ich gebe dir morgen früh mal ein paar Beispiele, die alle richtig sind und genau das berechnen was sie sollen, abhängig davon ob eine ShowMessage vorhanden ist oder nicht ;)

Gruß,
Knuddelbaer


TheNeon - Mi 21.05.03 18:36

... tja ....... Gott sei dank kam Fibbonacci nicht dran ;)

naja .... ich und Knuddelbaer haben aber auch festgestellt, dass es anstatt von Showmessage auch mit sleep(100) geht :shock: ..... bau das mal ein und staune ;)


Bye :wink2:


mimi - Mi 21.05.03 20:12

komische geschiechten, ich hatte das schon ein paar mal erlebt das es MIT SCHOMESSAGE geht und ohne Schowmessage nicht.

was ist ein "Fibbonacci" ?
ich habe noch keine erklärung dafür gefunden, was macht schowMessage genau ?
ruft es das formula einfach mit ShowModel auf ?


Da_Knuddelbaer - Do 22.05.03 09:15

Ich weiss es ehrlich gesagt nicht. Aber es muss dennoch Zeitbedingt sein da es ja wie weiter oben steht auch mit einem einfachen Sleep-Befehl von MINDESTENS 50 ms geht. Bei einem Wert kleiner 50 kommen die gleichen Fehler wie ohne ShowMessage.

Die Fibonacci-Zahlenfolge ist eine simple Addition der beiden Vorgängerzahlen zur Nachfolgerzahl bis zum n-ten Element.
Beispiel:
3 7 10 17 27 44 71 115 ...

oder

1 2 3 5 8 13 21 34 ...

Wir hatten schon vor spasseshalber mal Borland zu fragen was es wirklich mit der ShowMessage auf sich hat, zumal ein Einserkandidad bei uns (weiblich natürlich) am gleichen Tag bei einem anderen Prog genau das gleiche Problem mit einer ShowMessage hatte. :lol:
Leider finde ich die Projektdateien nicht mehr, ich werde sie wohl erst nochmal proggen müssen...


mimi - Do 22.05.03 14:58

schade, aber das wunder mich immer wieder bei ShowMessage
auch in anderen projekten ist das der fall...

ich würde gerne mal wissen was ShowMessage genau macht,einfach ein form auf den bildschrim erstellt wohl nicht....


Da_Knuddelbaer - Sa 24.05.03 11:24

Mein Bruder hat noch ein weiteres ShowMessage-Problem:

Fügt mal bitte in einem neuen Projekt zuerst 3 Edits, ein Image und 2 UpDowns ein. Setzt die UpDown auf Edit2 und Edit3.

Danach fügt bei einem UpDown (ursprünglich bei UpDOwn 2 was auf Edit3 zeigt) folgenden Code ein:


Quelltext
1:
2:
3:
4:
5:
 try
  Image1.Picture.LoadFromFile (IntToStr(Updown2.Position) +'.bmp');
 except
   ShowMessage (IntToStr(Updown1.Position));
 end;



Ihr könnte gerne im Verzeichnis ein paar Bilder die durchnummeriert sind einfügen (wäre vielleicht besser).

Und noch was:


Quelltext
1:
2:
3:
4:
5:
 try
  Image1.Picture.LoadFromFile (IntToStr(Updown2.Position) +'.bmp');
 finally
   ShowMessage (IntToStr(Updown1.Position));
 end;


hat auch einen tollen Effekt, egal wo ihr dann hinklickt, es wird dann immer auf das Teil geklickt, auch Alt-F4 wird nicht funzen. Lediglich Rechtsklick und der Taskmanager helfen da.

Greetz,
Knuddelbaer :)


mimi - Sa 24.05.03 15:07

hat er denn schonmal alternativen zum ShowMessage befel ausprobiert ?
z.b.MessageDlg ?


Da_Knuddelbaer - Sa 24.05.03 15:25

Nein aber du kannst es ja gerne testen ;)


Dezipaitor - Sa 24.05.03 15:33

hi
ich habe mich mal mit dem problem auseinandergesetzt:

folgendes müsste klappen (ohne FileExists):

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.UpDown2Click(Sender: TObject; Button: TUDBtnType);
begin
try
 Image1.Picture.LoadFromFile (IntToStr(Updown2.Position) +'.bmp');
 except
   Updown2.Position := Updown2.Position-1;
   UpDown2Click(Sender,Button);
 end;
end;


Dezipaitor - Sa 24.05.03 15:39

@mimi :

ich habe folgende Erklärung parat :

das liegt an der Art wie ProcessMessages und HandleMessage
die Nachrichtenschlange abarbeiten :

die hilfe zu ProcessMessages sagt :
Interrupts the execution of an application so that it can process the message queue.

die hilfe zu HandleMessage sagt:
Interrupts the execution of an application while Windows processes a message in the Windows message queue.


der unterschied liegt bei beiden in den unterstrichenen wörtern:
während ProcessMessages die gesamte WindowsNachrichtenschlange abarbeitet (also alle Fenster),
schaut HandleMessage nur nach den Nachrichten für seine Anwendung (TApplication).
Daher kann es passieren, dass bei ProcessMessages die Anwendung zuerst mal garkeine Rechenzeit bekommt, besonders wenn das empfangen der Nachrichten in TApplication durch eine Endlosschleife blockiert wird.


das ganze ist aber alles sehr undurchsichtig,wie windows nachrichten und rechenzeit verteilt.
deshalb gebe ich keine 100% garantie darauf.




[/u]


mimi - Sa 24.05.03 15:46

und wie passt das nun zusammen ?
ich würde wirklich wissen was showMessage macht, kann mir das jemmand genau sagen ?


Da_Knuddelbaer - Sa 24.05.03 16:35

@dezipaitor:
Es klappt genauso gut wenn man einfach die ShowMessage rausnimmt ;)
Sobald diese ShowMessage-Zeile entfernt wurde funktioniert alles wunderbar.

In diesem Thread geht es uns um die wahre Bedeutung und Arbeitsweise der ShowMessage, die entweder Fehler behebt oder gar Fehler verursacht.


TheNeon - So 25.05.03 01:24

Da_Knuddelbaer hat folgendes geschrieben:
@dezipaitor:
Es klappt genauso gut wenn man einfach die ShowMessage rausnimmt ;)
Sobald diese ShowMessage-Zeile entfernt wurde funktioniert alles wunderbar.

In diesem Thread geht es uns um die wahre Bedeutung und Arbeitsweise der ShowMessage, die entweder Fehler behebt oder gar Fehler verursacht.


..... da showmessage jedoch dasselbe bewirkt wie sleep(100) hat dezipaitor garnicht mal so unrecht mit der Asoziation. :wink2: