Avatar billede f2f4 Novice
20. maj 2006 - 11:08 Der er 6 kommentarer og
1 løsning

MessageDlg og Exceptions

Hej

Jeg har nogle problemer med exception der bl.a. ikke vises ens når jeg kører programmet inde fra Delphi og når jeg kører det via exe filen.

Kald ’der fejler’:
type
  ExceptionBeregnNyeStykvaerdier = class(Exception);
::
Procedure Test
Begin
  try
    //kald til dll der fejler (med vilje for at teste exceptions!!)
  except
    raise ExceptionBeregnNyeStykvaerdier.Create('BeregnNyeStykvaerdier');
  end;
end;

Kaldende sted i koden:
try
  Test
except
  on e: Exception do
      MessageDlg(e.Message + ' ' + e.ClassName, mtError, [mbOk], 0)
end;

Problemer:
1)    Når jeg kører testet inde fra Delphi kommer en fejl dialog boks med: ”BeregnNyeStykvaerdier Exception BeregnNyeStykvaerdier” hvilket er ok! Når jeg kører testen via exe filen kommer en fejl dialog boks med: ”BeregnNyeStykvaerdier.”. Hvorfor (er de ikke ens)!?
2)    Fejlboksen har (via Delphi) en pæn størrelse, men når den kommer via kald af exe filen er den (fejlboksen) meget højere?

Screendump af ovenstående kan ses her: http://www.mortenrasmussen.net/error.doc

Et tillægs spørgsmål:
MessageDlg vises på midten af skærmen, kan man få den vist på midten af formen (fra det kaldende program) i stedet!? MessageDlgPos kan bruges, men jeg kan ikke lige se at man kan styrer/fange højden og bredden og dermed og dermed er der jo svært at lave en korrekt placdering!

Mange tak for evt. hjælp.

/Morten
Avatar billede kroning Nybegynder
20. maj 2006 - 18:09 #1
Ved ikke hvorfor din MessageDlg ser sådan ud men hvis jeg kører samme kode på min Delphi 7 så er der ingen problemer.
Avatar billede kroning Nybegynder
20. maj 2006 - 18:32 #2
Her er en løsning på MessageDlg midt på skærmen, den måde jeg laver det på er at putte koden ind i en "grund form" som alle mine andre forme så arver fra.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const
    mbMessage = WM_USER+10;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
        p_msgCaption: PChar;
    procedure ChangeMessageBoxPosition(var Msg: TMessage); message mbMessage;
  public
    { Public declarations }
    function MyMessageBox(Text, Caption: String; Flags: Longint = MB_OK): Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.MyMessageBox(Text, Caption: String; Flags: Longint = MB_OK): Integer;
begin
    PostMessage(Handle, mbMessage, 0, 0);
  p_msgCaption:=PChar(Caption);
  result:=Application.MessageBox(PChar(Text), p_msgCaption, Flags);
end;

procedure TForm1.ChangeMessageBoxPosition(var Msg: TMessage);
var
  MbHwnd: longword;
  MbRect: TRect;
  x, y, w, h: integer;
    Point : TPoint;
begin
  MbHwnd:=FindWindow(MAKEINTRESOURCE(WC_DIALOG), p_msgCaption);
  if (MbHwnd<>0) then
  begin
        Point.X:=0;Point.Y:=0;
        Point:=ClientToScreen(Point);

    GetWindowRect(MBHWnd, MBRect);
        w:=MbRect.Right-MbRect.Left;
    h:=MbRect.Bottom-MbRect.Top;

    // center horzontal
    x:=Point.X+((Width-w) div 2);
    // keep on screen
    if x<0 then
      x:=0
    else
    if x+w>Screen.Width then
        x:=Screen.Width-w;

    //center vertical
    y:=Point.Y+((Height-h) div 2);
    // keep on screen
    if y<0 then
        y:=0
    else
    if y+h>Screen.Height then
        y:=Screen.Height-h;
    // set new windows position
    SetWindowPos(MBHWnd, 0, x, y, 0, 0, SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOZORDER);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    MyMessageBox('Dette er en test','Test',MB_ICONASTERISK or MB_YESNO);
end;

end.
Avatar billede f2f4 Novice
07. juni 2006 - 15:23 #3
>kroning
Tak, giv et svar ... undskyld forsinkelsen.
Det med 'den store' MessageDlg skyldes en uoverensstemmelse mellem en (ansi)strengs #0 og dens længdebyte ... nedenstående løser problemet:

function TrimErrorString(Str : string) : string;
var
  P : integer;
begin
  P:= Pos(#0, Str);
  if P <> 0 then
    Result:= Copy(Str, 1, P - 1)
  else
    Result:= Str;
end;
Avatar billede kroning Nybegynder
07. juni 2006 - 18:13 #4
ok
Avatar billede f2f4 Novice
15. juni 2006 - 15:36 #5
>kroning
Mon du ser hvis jeg fortsætter på denne tråd!? Jeg har forsøgt at ændre din kode så den bruger en MessageDlg istedet ... tror du dette er muligt? Mit problem er at FindWindow ikke 'finder den'!
Min problem med ovenstående er at [X] SC_CLOSE er disablet med din/ovenstående kode og denne linje hjælper mig ikke: EnableMenuItem(MbHwnd, SC_CLOSE, MF_ENABLED);
Avatar billede kroning Nybegynder
15. juni 2006 - 16:32 #6
Hvis du bruger MessageDlg i stedet for MessageBox så er teksten i caption og på knapperne på engelsk, men det er måske ikke et problem?
Mht. en løsning med MessageDlg så kan jeg ikke få kikket på det før i morgen (måske), er lige på vej ud af døren.
Avatar billede f2f4 Novice
16. juni 2006 - 11:00 #7
Tusinde tak!
Jeg har tilladt mig at lave et nyt spørgsmål herom: http://www.eksperten.dk/spm/715786, men så er der jo også lidt point! (-;
Jeg har deri angivet 3 (lidt forskellige) spørgsmål, det er meget muliget et af svarene gør de andre spørgsmål irrelevante.
Nej jeg tror ikke det er pga. sprog ... jeg bruger min egen 'danske' consts.pas.
Tak for eventuel hjælp.
Jeg får ikke tjekket eventuelle kommentarer/svar efter kl. 15 før søndag eller mandag |-:
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester