![]() |
Problem mit MessageBox.Show
Guten Abend, allerseits.
Ich habe ein mir unerklärliches Phänomen in folgendem Programmteil:
Delphi-Quellcode:
Führe ich an der Stelle //==>
procedure frmSpiel.dummy_Click(sender: System.Object; e: System.EventArgs);
var lfdNr, zeile, spalte : integer; s: Integer; z: Integer; begin if (sender is &Label) then lfdNr := integer((sender as &Label).Tag); zeile := (lfdNr DIV 27) + 1; if (lfdNr MOD 27) = 0 then dec(zeile); spalte := lfdNr MOD 27; if spalte = 0 then spalte := 27; inc(Auswahl ); Maximum := Auswahl; Zahl.zeile := zeile DIV 3; if (zeile MOD 3) = 0 then dec(Zahl.zeile); Zahl.zeile := Zahl.zeile*3 + 1; Zahl.spalte := spalte DIV 3; if (spalte MOD 3) = 0 then dec(Zahl.spalte); Zahl.spalte := Zahl.spalte*3 + 1; Quadrat.zeile := zeile DIV 9; if (zeile MOD 9) = 0 then dec(Quadrat.zeile); Quadrat.zeile := Quadrat.zeile*9 + 1; Quadrat.spalte := spalte DIV 9; if (spalte MOD 9) = 0 then dec(Quadrat.spalte); Quadrat.spalte := Quadrat.spalte*9 + 1; for s := 1 to 28 - 1 do begin if (s MOD 3) = (spalte MOD 3) then begin Basiszahlen[s,zeile].IsPossible := false; end; end; for z := 1 to 28 - 1 do begin if (z MOD 3) = (zeile MOD 3) then begin Basiszahlen[spalte,z].IsPossible := false; end; end; for z := Zahl.zeile to Zahl.zeile + 3 - 1 do for s := Zahl.spalte to zahl.spalte + 3 - 1 do Basiszahlen[s,z].IsPossible := false; for z := Quadrat.zeile to Quadrat.zeile + 9 - 1 do for s := Quadrat.spalte to Quadrat.spalte + 9 - 1 do begin if ((z MOd 3) = (zeile MOD 3)) AND ((s MOD 3) = (spalte MOD 3)) then Basiszahlen[s,z].IsPossible := false; end; Basiszahlen[spalte,zeile].IsChecked := true; Basiszahlen[spalte,zeile].IsPossible := true; // ==> MessageBox.Show(spalte.ToString+'/'+zeile.ToString); // ==> Text := spalte.ToString+'/'+zeile.ToString; // Spiel aktualisieren for s := 1 to 28 - 1 do for z := 1 to 28 - 1 do begin if not Basiszahlen[z,s].IsPossible then begin Spiel[z,s].Font := System.Drawing.Font.Create('Arial', 9, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, (Byte(0))); Spiel[z,s].Enabled := false; end; if Basiszahlen[z,s].IsChecked then begin Spiel[s,z].Enabled := true; Spiel[s,z].Height := 77; Spiel[s,z].Width := 77; Spiel[s,z].Left := Spiel[zahl.spalte,zahl.zeile].Left; Spiel[s,z].Top := Spiel[zahl.spalte,zahl.zeile].Top; Spiel[s,z].Font := System.Drawing.Font.Create('Arial', 12, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, (Byte(0))); Spiel[s,z].BringToFront; end; end; end; 1. "MessageBox.Show(spalte.ToString+'/'+zeile.ToString)" aus, werden die folgenden Anweisungen nicht mehr ausgeführt 2. "Text := spalte.ToString+'/'+zeile.ToString" aus, läuft alles problemlos weiter. Ich hoffe, jemand von Euch kann mir erklären, was da passiert?! Gruß Jürgen |
Re: Problem mit MessageBox.Show
Guten Morgen.
Leider habe ich für mein Problem noch keine Lösung gefunden und scheinbar ist von Euch noch niemand damit konfrontiert worden. Ich habe schon versucht, in einem einfacheren Projekt das Problem zu reproduzieren - ist mir aber nicht gelungen. Im o.a. Quelltext habe ich versuchsweise MessageBox.Show weiter oben aufgerufen und dann vor den for-Schleifen eine Kontrollanweisung (z.B. BackColor := System.Drawing.Color.Red) eingefügt. Dadurch konnte ich feststellen, dass offensichtlich alle Anweisung bis zu den for-Schleifen ausgeführt werden und schließe daraus, dass es eigentlich nicht am Quelltext liegen kann. Gleichzeitig habe ich festgestellt, dass nach dem Klick auf OK die MessageBox zwar sofort verschwindet, es aber ungewöhnlich lange dauert, bis die darunter liegenden Komponenten wieder neu gezeichnet sind. Nachdem ich nun alleine nicht mehr weiterkomme, wäre ich dankbar, wenn sich eine/r unserer Spezialisten meines Problems annehmen könnte. Vielen Dank und noch einen schönen Tag. Gruß Jürgen. |
Re: Problem mit MessageBox.Show
Hallo, Allerseits.
Da bin ich wieder mit meinem - noch immer nicht gelösten - Problem. Ich habe jetzt einmal ein kurzes (relativ sinnfreies) Testprojekt geschrieben, bei dem der gekennzeichnete Block nach "MesseageBox.Show('TEST!'); " nicht ausgeführt wird. Klammert man diese Anweisung aus, dann funktioniert's wieder:
Delphi-Quellcode:
Auf dem Formular liegt nur ein unsichtbares Label namens "Dummy".
unit uMessageTest;
interface uses System.Drawing, System.Collections, System.ComponentModel, System.Windows.Forms, System.Data; type frmMessageTest = class(System.Windows.Forms.Form) {$REGION 'Vom Designer verwalteter Code'} strict private /// <summary> /// Erforderliche Designervariable. /// </summary> Components: System.ComponentModel.Container; Dummy: System.Windows.Forms.Label; /// <summary> /// Erforderliche Methode zur Unterstützung des Designers - /// ändern Sie die Methode nicht mit dem Quelltext-Editor /// </summary> procedure InitializeComponent; procedure frmMessageTest_Activated(sender: System.Object; e: System.EventArgs); procedure Dummy_Click(sender: System.Object; e: System.EventArgs); {$ENDREGION} strict protected /// <summary> /// Ressourcen nach der Verwendung bereinigen /// </summary> procedure Dispose(Disposing: Boolean); override; private { Private-Deklarationen } public constructor Create; end; TMyLabel = System.Windows.Forms.&Label; var MyLabel : TMyLabel; LabelArray : array[1..5,1..6] of TMyLabel; [assembly: RuntimeRequiredAttribute(TypeOf(frmMessageTest))] implementation {$AUTOBOX ON} {$REGION 'Vom Windows Form-Designer erzeugter Code'} /// <summary> /// Erforderliche Methode zur Unterstützung des Designers -- /// ändern Sie die Methode nicht mit dem Quelltext-Editor /// </summary> procedure frmMessageTest.InitializeComponent; begin Self.Dummy := System.Windows.Forms.Label.Create; Self.SuspendLayout; // // Dummy // Self.Dummy.Location := System.Drawing.Point.Create(24, 24); Self.Dummy.Name := 'Dummy'; Self.Dummy.TabIndex := 0; Self.Dummy.Text := 'Dummy'; Self.Dummy.Visible := False; Include(Self.Dummy.Click, Self.Dummy_Click); // // frmMessageTest // Self.AutoScaleBaseSize := System.Drawing.Size.Create(6, 15); Self.ClientSize := System.Drawing.Size.Create(688, 568); Self.Controls.Add(Self.Dummy); Self.Name := 'frmMessageTest'; Self.Text := 'MessageTest'; Include(Self.Activated, Self.frmMessageTest_Activated); Self.ResumeLayout(False); end; {$ENDREGION} procedure frmMessageTest.Dispose(Disposing: Boolean); begin if Disposing then begin if Components <> nil then Components.Dispose(); end; inherited Dispose(Disposing); end; constructor frmMessageTest.Create; begin inherited Create; // // Erforderlich für die Unterstützung des Windows Forms-Designers // InitializeComponent; // // TODO: Fügen Sie nach dem Aufruf von InitializeComponent Konstruktorcode hinzu. // end; procedure frmMessageTest.Dummy_Click(sender: System.Object; e: System.EventArgs); var i,j : integer; begin if Sender is &Label then (Sender as &Label).BackColor := System.Drawing.Color.Red; //////////////////////////////////////////////////////////////////////////// // Hier passiert's: nach MessageBox.Show('TEST!'); // wird das nicht mehr ausgeführt: for i := 1 to 5 do for j := 1 to 6 do if (i = 3) AND (j = 3) then LabelArray[i,j].Text := 'OK'; // und das wird wieder ausgeführt: Self.BackColor := System.Drawing.Color.LightBlue; end; procedure frmMessageTest.frmMessageTest_Activated(sender: System.Object; e: System.EventArgs); var i,j,n : integer; begin n := 0; for i := 1 to 5 do for j := 1 to 6 do begin inc(n); MyLabel := System.Windows.Forms.&Label.Create; With MyLabel do begin Height := 30; Width := 30; Left := 10 + i*40; Top := 10 + j*40; Text := n.ToString; BackColor := System.Drawing.Color.White; end; Self.Controls.Add(MyLabel); LabelArray[i,j] := MyLabel; Include(LabelArray[i,j].Click, Self.Dummy_Click); end; end; end. Es wäre schön, wenn das einmal jemand von Euch ausprobieren könnte - vielleicht tritt der Fehler ja nur bei mir auf. Auf alle Fälle ist das ganze höchst mysteriös. Vielen Dank im Voraus an alle, die sich damit beschäftigen möchten. Gruß Jürgen |
Re: Problem mit MessageBox.Show
ist das MessageBox ein Formular von Dir?
Falls nein, dann lass mal das Show weg und schreibe nur MessageBox(.....). |
Re: Problem mit MessageBox.Show
@ RavenIV
Geht nicht! - Kommt eine Fehlermeldung: ungültige Typumwandlung. Mir geht das ganze ziemlich auf die Nerven, weil ich relativ oft eine MessageBox verwende, um meine Projekte zu testen. Gruß Jürgen. |
Re: Problem mit MessageBox.Show
also ich verwende MessageBox so und habe nie Probleme:
Delphi-Quellcode:
Application.MessageBox ('Bei Logbucheintrag trat ein Fehler auf','Fehler', MB_ICONEXCLAMATION OR MB_OK);
|
Re: Problem mit MessageBox.Show
@ RavenIV
Ich verwende es ja auch laufend ohne Probleme. Es werden ja auch die Anweisungen nach dem gekennzeichneten Block ausgeführt - nur die Anweisung
Delphi-Quellcode:
nicht. Und wenn ich den Aufruf der MessageBox auskommentiere, dann klappt's wieder.
for i := 1 to 5 do
for j := 1 to 6 do if (i = 3) AND (j = 3) then LabelArray[i,j].Text := 'OK'; Gruß Jürgen. |
Re: Problem mit MessageBox.Show
Zitat:
Da hast Du bestimmt was verwechselt. Hier geht es Winforms und da hat das Objekt Application keine entsprechende Funktion. @Jürgen Habe Deinen Sourcecode getestet und die von Dir beschriebene Stelle wird ausgeführt, auch wenn vorher die Messagebox aufgerufen wird. Aber verfahre getreu nach Deinem Motto: Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE! |
Re: Problem mit MessageBox.Show
@ Heffalump
Vielen Dank, dass Du Dir die Mühe gemacht hast, das auszuprobieren. Leider gefällt mir Deine Antwort gar nicht! Mir wäre es viel lieber gewesen, Du hättest einen Fehler in meinem Quelltext gefunden. Jetzt bin ich genau so schlau wie vorher. Warum klappt's bei Dir und bei mir nicht? Aber trotzdem vielen Dank und noch einen schönen Abend. Gruß Jürgen PS. Jetzt hab ich zu dem Ganzen noch eine TextBox hinzu gefügt, die mir die Werte von i und j anzeigt: Die Schleife wird durchlaufen, jedoch wird
Delphi-Quellcode:
nicht ausgeführt.
if (i = 3) AND (j = 3) then LabelArray[i,j].Text := 'OK';
|
Re: Problem mit MessageBox.Show
@Jürgen
Ich habe das Problem gefunden :witch: . Du benutzt zum Erstellen der Labels das Ereignis "Activated". Rufst Du nun die MessageBox auf und schließt diese wieder, dann wird das Ereignis neu ausgelöst und alle Labels werden neu erzeugt und zwar nach dem die Funktion "Dummy_Click" ausgeführt wurde. Deine Funktion läuft korrekt. Benutze zum Erstellen das Ereignis "Load" und dann klappt es auch. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:41 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