IT NEWS PC REVUE PC FORUM FreeBSDInternet time: @764
Obsah fóra
Pravidlá  •  Kontakt  •  Prihlásenie  •  Registrácia

Ovládate žalúzie ručne?

Ovládanie žalúzií GrapaTEC pre nové aj namontované žalúzie! www.grapatec.com

Intenzívne zoštíhlenie

Chudnite pohodlne a účinne. Jedinečná technológia ktorá funguje. www.inalinia.sk

Tlakové postrekovače

Kvalitné ručné postrekovače pre záhradu. Ľahké plnenie a ovládanie. www.gardena.sk

Vyhraj s NIVEA

Nová online hra o luxusné hodinky, lístky a výrobky NIVEA Black&White. www.nivea.sk

Našiel som spôsob bieliť zuby

Podarilo sa mi vybieliť si zuby bez drahých procedúr u zubára. www.zuzaninblog.com

Problem s DLL

Zaslať odpoveď
AutorSpráva
jasug
Užívateľ
Užívateľ

Založený: 05.09.2008
Príspevky: 47

PríspevokZaslal: Po 25.07.11 13:49Odpovedať s citátomNávrat hore

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;
Zobraziť informácie o autoroviOdoslať súkromnú správu
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 1052

PríspevokZaslal: Po 25.07.11 13:57Odpovedať s citátomNávrat hore

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 );
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
coldak
Skúsený užívateľ
Skúsený užívateľ

Založený: 29.10.2008
Príspevky: 936

PríspevokZaslal: Po 25.07.11 14:20Odpovedať s citátomNávrat hore

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 ?
Zobraziť informácie o autoroviOdoslať súkromnú správu
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 1052

PríspevokZaslal: Po 25.07.11 14:31Odpovedať s citátomNávrat hore

@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.
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
coldak
Skúsený užívateľ
Skúsený užívateľ

Založený: 29.10.2008
Príspevky: 936

PríspevokZaslal: Po 25.07.11 18:50Odpovedať s citátomNávrat hore

otazne je ci NULL je to iste ako 0
Zobraziť informácie o autoroviOdoslať súkromnú správu
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 1052

PríspevokZaslal: Po 25.07.11 21:38Odpovedať s citátomNávrat hore

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.
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
jasug
Užívateľ
Užívateľ

Založený: 05.09.2008
Príspevky: 47

PríspevokZaslal: Ut 26.07.11 16:29Odpovedať s citátomNávrat hore

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
Zobraziť informácie o autoroviOdoslať súkromnú správu
coldak
Skúsený užívateľ
Skúsený užívateľ

Založený: 29.10.2008
Príspevky: 936

PríspevokZaslal: Ut 26.07.11 17:22Odpovedať s citátomNávrat hore

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 ?
Zobraziť informácie o autoroviOdoslať súkromnú správu
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 1052

PríspevokZaslal: Ut 26.07.11 17:23Odpovedať s citátomNávrat hore

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.
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
jasug
Užívateľ
Užívateľ

Založený: 05.09.2008
Príspevky: 47

PríspevokZaslal: Ut 26.07.11 20:40Odpovedať s citátomNávrat hore

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.
Zobraziť informácie o autoroviOdoslať súkromnú správu
Zobraziť príspevky z predchádzajúcich:    
Zaslať odpoveď
Nemôžete pridávať nové témy do tohto fóra.
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.
Nemôžete hlasovať v tomto fóre.

Powered by phpBB 2.x.x © 2005 - 2012 PCforum, webhosting by WebSupport, edited by JanoF

SEO - optimalizácia pre vyhľadávače

Freebsd