| Autor | Správa |
jasug
 Užívateľ
 Založený: 05.09.2008 Príspevky: 47
 | Zaslal: Po 25.07.11 13:49 |   |
Dobrý deň, poprosím o pomoc,
v projekte používam knižnicu DLL a v rámci zmeny grafiky výstupov som chcel vymeniť funkciu
MessageDlg za funkciu MessageBox. Pri kompilácii knižnice mi hlási chyby
[Error] : Incompatible types: 'HWND' and 'PChar'
[Error] : Incompatible types: 'Integer' and 'PChar'
pričom keď mám túto novú funkciu v projekte tak je to OK. Neviem, kde je chyba. Vďaka za Váš čas. Uvádzam fragment kódu.
| kód: |
uses
Windows,
Messages,
Dialogs,
SysUtils,
Classes;
{$R *.res}
function hlaska( jj : String) : Boolean;
begin
Result := true;
.......
// MessageDlg(' Zadaná hodnota nie je číslo !',mtError, [mbOK],0);
MessageBox(PChar('Zadaná hodnota nie je číslo !'),
'Upozornenie', mb_iconwarning + mb_ok);
end;
|
|
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Po 25.07.11 13:57 |   |
MessageBox ma totiz ako prvy parameter handle okna, ktoremu bude tento message box patrit. Viac info:
http://msdn.microsoft.com/en-us/library/ms645505(v=vs.85).aspx
Ak nevies alebo sa ti nechce zistovat, aky handle ma aplikacia, ktora tuto DLL pouziva, tak tam jednoducho daj nulu a message box nebude mat rodicovske okno. Cize mozes to upravit takto:
| kód: | MessageBox( 0, PChar('Zadaná hodnota nie je číslo !'),
'Upozornenie', mb_iconwarning + mb_ok ); |
|
| |
   |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 936
 | Zaslal: Po 25.07.11 14:20 |   |
| Fico napísal: |
Ak nevies alebo sa ti nechce zistovat, aky handle ma aplikacia, ktora tuto DLL pouziva, tak tam jednoducho daj nulu a message box nebude mat rodicovske okno. Cize mozes to upravit takto:
| kód: | MessageBox( 0, PChar('Zadaná hodnota nie je číslo !'),
'Upozornenie', mb_iconwarning + mb_ok ); |
|
hwnd=0 nepatri nahodou oknu desktopu ? |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Po 25.07.11 14:31 |   |
@coldak - tak som sa to ucil aj ja, ale v MSDN to teraz pise akosi inak, tak som radsej nechcel byt nepresny.
| MSDN napísal: | | A handle to the owner window of the message box to be created. If this parameter is NULL, the message box has no owner window. |
V kazdom pripade, na funkcnosti to nic nemeni. |
| |
   |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 936
 | Zaslal: Po 25.07.11 18:50 |   |
otazne je ci NULL je to iste ako 0  |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Po 25.07.11 21:38 |   |
Ak sa jedna o C++, tak NULL je 0.
| kód: | #if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif
|
Ak sa nejedna o C++, tak je to pretypovana nula na smernik na void. Dalo by sa povedat, ze v Delphi je ekvivalentom nil a ten nie je typovo zhodny s typom HWND, takze to je dalsia odpoved, ze za NULL je povazovana 0. |
| |
   |
 |
jasug
 Užívateľ
 Založený: 05.09.2008 Príspevky: 47
 | Zaslal: Ut 26.07.11 16:29 |   |
Vďaka za pomoc,
funguje to s hodnotou 0 teda
MessageBox( 0, PChar('Zadaná hodnota nie je číslo !'),
'Upozornenie', mb_iconwarning + mb_ok );
ale v aplikácii D6 mi to funguje podľa helpu
function MessageBox(const Text, Caption: PChar; Flags: Longint = MB_OK): Integer;
Neviem v čom je problém, ale ide to.
// pridané po 28 minútach od posledného príspevku
Ešte by som dal placu tento problém, ktorý sa mi v aplikácii D6 nevyskytuje
if Sender is TEdit then
begin
...
end;
if Sender is TLabeledEdit then
begin
...
end;
a sice, že nepozná triedu TLabeledEdit. Vďaka |
| |
  |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 936
 | Zaslal: Ut 26.07.11 17:22 |   |
uvediem ta trochu do obrazu, neviem presne ako je to v D6 no v D7 je to nasledovne:
mas standardne dve implementacie funkcie messageBox . prva je ta co ti popisoval fico. jedna sa iba o zavolanie api funkcie windows. ta vyzaduje ako prvy parameter handle vlastnickeho okna. ak tam das 0 cize za vlastnika urcis desktop tak to bude mat ine spravanie ako keby si messageboxu priradil handle samotnej aplikacie ktora messagebox vyvolala. to znamena ze v pripade ze vlastnikom sa stane desktop tak budes moct manipulovat nadalej s aplikaciou cize aj vyvolavat niekolkonasobne instancie messageboxu. pokial by si messageboxu pridelil handle vlastnickej aplikacie tak messagebox bude modalny cize ostatne okna aplikacie budu nedostupne pokym nezatvoris messagebox. pokial ti vyhovuje ze aplikacia bude aj nadalej pristupna aj ked budes mat vyvolany messagebox tak ti handle 0 staci . pokial vsak potrebujes zamedzit pristupu do aplikacie kym nebude potvrdeny messagebox tak zadaj handle aplikacie cize | kód: | MessageBox(application.handle, PChar('Zadaná hodnota nie je číslo !'),
'Upozornenie', mb_iconwarning + mb_ok ); |
odhladom druhej moznosti , miesto priameho zavolania windows api funkcie mozes zavolat metodu aplikacie | kód: | application.MessageBox( PChar('Zadaná hodnota nie je číslo !'),
'Upozornenie', mb_iconwarning + mb_ok ); | toto je ekvivalent k moznosti messagebox(application.handle, ...
| citácia: | | Ešte by som dal placu tento problém, ktorý sa mi v aplikácii D6 nevyskytuje | a v akej verzii sa ti ten problem vyskytuje ? |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Ut 26.07.11 17:23 |   |
coldak ti pekne vysvetlil ako to je s funkciou MessageBox, ja este dodam k tomu problemu, ze ta funkcia nejde v DLL projekte:
Tato metoda triedy Application, ktoru popisal coldak, sa nachadza v unite Forms, ktory standardne v DLL projekte nie je pripojeny. Skus ho teda pripojit v tvojom projekte, ci ti to bude fungovat i ked nie som si velmi isty, ak v DLL nevytvaras nejake okno.
| jasug napísal: | | a sice, že nepozná triedu TLabeledEdit |
Opat bude treba pridat unit ExtCtrls, kde sa nachadza deklaracia tohto typu. |
| |
   |
 |
jasug
 Užívateľ
 Založený: 05.09.2008 Príspevky: 47
 | Zaslal: Ut 26.07.11 20:40 |   |
Vďaka za perfektné vysvetlenie, je to ok, urobil som to volaním triedy Application, druhý problém som vyriešil pridaním unitu ExtCtrls a chodí to. Vďaka za Váš čas. |
| |
  |
 |
|