Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Prism Problem mit MessageBox.Show (https://www.delphipraxis.net/71292-problem-mit-messagebox-show.html)

gfjs 12. Jun 2006 19:41


Problem mit MessageBox.Show
 
Guten Abend, allerseits.

Ich habe ein mir unerklärliches Phänomen in folgendem Programmteil:

Delphi-Quellcode:
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;
Führe ich an der Stelle //==>

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

gfjs 16. Jun 2006 03:50

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.

gfjs 27. Jun 2006 15:09

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:
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.
Auf dem Formular liegt nur ein unsichtbares Label namens "Dummy".

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

RavenIV 27. Jun 2006 15:32

Re: Problem mit MessageBox.Show
 
ist das MessageBox ein Formular von Dir?
Falls nein, dann lass mal das Show weg und schreibe nur MessageBox(.....).

gfjs 27. Jun 2006 15:38

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.

RavenIV 27. Jun 2006 15:45

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);

gfjs 27. Jun 2006 16:02

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:
  for i := 1 to 5 do
    for j := 1 to 6 do
    if (i = 3) AND (j = 3) then LabelArray[i,j].Text := 'OK';
nicht. Und wenn ich den Aufruf der MessageBox auskommentiere, dann klappt's wieder.

Gruß Jürgen.

Heffalump 27. Jun 2006 16:13

Re: Problem mit MessageBox.Show
 
Zitat:

Zitat von RavenIV
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);

@RavenIV
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!

gfjs 27. Jun 2006 17:00

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:
if (i = 3) AND (j = 3) then LabelArray[i,j].Text := 'OK';
nicht ausgeführt.

Heffalump 28. Jun 2006 09:12

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 06:21 Uhr.
Seite 1 von 2  1 2      

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