| | |
| Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
Autor | Správa |
---|
Registrovaný: 05.09.08 Prihlásený: 11.11.22 Príspevky: 69 Témy: 37 | Napísal jasug: 25.07.2011 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;
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 25.07.2011 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 );
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 25.07.2011 14:20 | |
|
Fico píše: 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 ?
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 25.07.2011 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 píše: 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.
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 25.07.2011 18:50 | |
|
otazne je ci NULL je to iste ako 0
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 25.07.2011 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.
|
|
Registrovaný: 05.09.08 Prihlásený: 11.11.22 Príspevky: 69 Témy: 37 | Napísal autor témy jasug: 26.07.2011 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
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 26.07.2011 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 ?
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 26.07.2011 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 píše: a sice, že nepozná triedu TLabeledEdit
Opat bude treba pridat unit ExtCtrls, kde sa nachadza deklaracia tohto typu.
|
|
Registrovaný: 05.09.08 Prihlásený: 11.11.22 Príspevky: 69 Témy: 37 | Napísal autor témy jasug: 26.07.2011 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.
|
|
| Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|