Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem mit MessageBox (https://www.delphipraxis.net/2453-problem-mit-messagebox.html)

CalganX 23. Jan 2003 19:40


Problem mit MessageBox
 
Hi,
ich will folgenden Text mit MessageBox ausgeben:
'Der angegebene User ('+CurSelUser+') wurde nicht gefunden.'.
Was mache ich? Ich gebe folgenden Source ein:
Delphi-Quellcode:
MessageBox(hWnd, PChar('Der angegebene User ('+CurSelUser+') wurde nicht gefunden.'), 'Bla, bla', MB_OK or MB_ICONINFORMATION);
EAccessViolation => Ende
Need help! Bin kurz vor'm durchdrehen!

Chris

Christian Seehase 23. Jan 2003 19:53

Moin Chris,

wie ist denn CurSelUser deklariert?
Ansonsten sehe ich da nichts, was eine Möglichkeit eines Fehlers bietet.

Oder hast Du MessageBox selber importiert, und stdcall weggelassen?

Udo 23. Jan 2003 22:01

Bei mir gehts. Schon "hwnd" gecheckt?
Scheib mal
Delphi-Quellcode:
if hWnd <> INVALID_HANDLE_VALUE then
davor.

Luckie 23. Jan 2003 22:34

hWnd wird keine EAccessViolation auslösen. Es gibt lediglich an welches fenster lahmgelegt wird. Du kannst da auch 0 übergeben und alles wird laufen.

Christian Seehase 23. Jan 2003 22:49

Moin Zusammen,

ergänzend sei erwähnt:
Wenn hwnd ein ungültiges Fensterhandle enthält, wird der Dialog gar nicht erst angezeigt.

CalganX 24. Jan 2003 08:39

Hi,
soweit ich mich erinnern kann (bin derzeit in der Schule; kann somit nicht in den Source gucken) ist CurSelUesr als PWideChar oder String deklariert. Ist aber egal, was ich nehme. Wenn ich nicht "PChar(" schreibe, dann kommt der Compile-Error "Incompatible types "string" and "PAnsiChar". Problem ist, dass CurSelUser Buffer in einer SendMessage-Anweisung ist (siehe dazu Beitrag "Problem mit NetUserGetInfo").

Chris

Luckie 24. Jan 2003 13:18

Deklarier den Buffer mal als array[0..255] of Char. Und dann sehen wir weiter. Wie ich die Benutzer-Infos bekomme habe ich ja gepostet. Aber hier noch mal:
Delphi-Quellcode:
SendDlgItemMessage(hDlg, IDC_CB, CB_GETLBTEXT, 0, Integer(@szBuffer));
GetUserInfo(String(szBuffer));
0, weil wir gleich den ersten anzeigen wollen. Und dann geht es so weiter:
Delphi-Quellcode:
procedure GetUserInfo(sUser: String);
var
  s   : String;
  ui3 : Pointer;
begin
  if sUser <> ''then
  begin
    if NetUserGetInfo(nil, PWideChar(WideString(sUser)), 3, ui3) = NERR_SUCCESS then
    begin
      s := String(PUserInfo3(ui3)^.usri3_name);
      SetDlgItemText(hApp, 103, @s[1]);

CalganX 24. Jan 2003 13:21

So, nach einem erholsamen Schultag, gibt es folgendes zu bemerken:
1. CurSelUser ist ein String
2. Der gleiche Source wie oben
3. MessageBox nehme ich aus der Unit Windows und deklariere die Funktion/Prozedur nirgends, da bereits in Unit Windows drin
4. Fehlerausgabe:
Zitat:

---------------------------
Application Error
---------------------------
Exception EAccessViolation in module OSInfo.exe at 00003E46.

Access violation at address 00403E46 in module 'OSInfo.exe'. Read of address 696D6439.


---------------------------
OK
---------------------------
Chris

PS: Hotkey zum kopieren der aktuellen Fehlermeldung gefunden!!! *freu*

PSS: @Luckie: Ich denke du bist im falschen Beitrag. ;)

Luckie 24. Jan 2003 13:36

Nein bin ich nicht. CurSelUser ist doch der Buffer für die Listbox, der dann den Benutzer enthält oder? Und genau den sollst du wie beschrieben deklarieren. Damit du mit deinem PWideChar keien Probleme bekommst, habe ich dir gepoatet, wie ich dann weiter gemacht habe. Nämlich der entsprechende Prozedur den Parameter als String übergeben. Und dazu mußt du den Buff of Char mit String casten, damit alles sauber läuft.

Wenn CurSelUser ein String ist und da der gewählte Eintrag aus der Listbox rein soll, dann kann das nicht klappen. Du brauchst dafgür einen Zeiger und ein Zeichen-Array ist ein Zeiger ein simpler String aber nicht.

Deswegen noch mal deklarier den Buffer als array[0..255] of Char. Dan bastelst du dir deine Message zusammen:
Delphi-Quellcode:
var
  s : String;
begin
  ...
  s := 'Blabal'+String(CurSelUser)+'Blubblub';
  Messagebox(hWnd, pointer(s), ' Meine Nachri9cht', 0);


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:02 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