Avatar billede futterama Nybegynder
26. februar 2004 - 15:11 Der er 31 kommentarer og
2 løsninger

Ændre ikon på en MessageDlg

Hej,

Jeg ville høre om man på nogen måde kan ændre det ikon der kommer frem på en MessageDlg? - eller skal man selv hen og lave en form for at få dialogboxen som man vil ha den?
Avatar billede stone Forsker
26. februar 2004 - 15:30 #1
MessageDlg('valgfri tekst',DlgType,
        Buttons,HelpCtx);
MessageDlgPos('valgfri  tekst',
        DlgType,Buttons,HelpCtx,x,y);

//DlgType valg af bitmap:

mtWarning
mtError
mtConfirmation
mtInformation
mtCustom
Det er de muligheder ellers skal du selv lave en form
Avatar billede borrisholt Novice
26. februar 2004 - 15:39 #2
Hvis ikke du vil have et af de stabdard Ikoner som stone lister for dig skal du bruge MessageBoxEx funktionen fra widows api'en

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/dialogboxes/dialogboxreference/dialogboxfunctions/messageboxex.asp

Jens B
Avatar billede hrc Mester
26. februar 2004 - 15:57 #3
borrisholt> Jeg kan ikke se at man kan vælge andre ikoner end dem som er "predefined" jvf. informationen i MSDN. Det er nok heller ikke en svær en komponent at lave - og så stammer den ikke længere fra API'et, men er noget Delphi'sk.

Der er lidt flere muligheder:
MB_ICONEXCLAMATION: An exclamation-point icon appears in the message box.
MB_ICONWARNING: An exclamation-point icon appears in the message box.
MB_ICONINFORMATION: An icon consisting of a lowercase letter i in a circle appears in the message box.
MB_ICONASTERISK: An icon consisting of a lowercase letter i in a circle appears in the message box.
MB_ICONQUESTION: A question-mark icon appears in the message box.
MB_ICONSTOP: A stop-sign icon appears in the message box.
MB_ICONERROR: A stop-sign icon appears in the message box.
MB_ICONHAND: A stop-sign icon appears in the message box.
Avatar billede hrc Mester
26. februar 2004 - 15:59 #4
Det endte med at blive en lidt forvirrende tekst.

Det jeg mente var, at det ser ud til man må lave sig en komponent - og at den så ikke længere følger hvad Microsoft kan finde på at gøre ved GUI'et.
Avatar billede borrisholt Novice
26. februar 2004 - 16:33 #5
MessageDlg stammer ikke fra API'en

Jens B
Avatar billede borrisholt Novice
26. februar 2004 - 16:37 #6
Jeg mener at have læst at MB_XXX er et ResourceId som de loader ... Prøv at give den et andet nummer ind asom du freamskaffer med LoadIcon

Jens B
Avatar billede hrc Mester
26. februar 2004 - 17:33 #7
Åhh, Det var over min fattegrænse. Har ikke fået min windowsprogrammeringserfaring ind med handles og ressourceid's, startede med Delphi VCL. Det kan sikkert lade sig gøre så.
Avatar billede futterama Nybegynder
27. februar 2004 - 07:52 #8
Øhh jou jou, I snakker sort nu. Det ikon jeg gerne vil have ind er et jeg selv har tegnet. Så med mindre man kan erstatte det normale ikon, så må jeg vist lave en ny form.

Men så kommer spørgsmålet, hvordan sender man f.eks. en tekststreng med til formen når man kalder den, og hvordan får man den så hentet inde i den nye form?
Avatar billede borrisholt Novice
27. februar 2004 - 08:28 #9
futterama>> Lige bestemt tag dit Icon kompiler det ind i din fil. Med giv dit resourceId med in som parameret i stedet for hvad Microsoft sngiver som standart ! og se hvad der sker ....

Hvis du vil lave din egene MessageDLg kan du bare kopiere Borlands, de bruger nemlig ikke WinAPI'en til deres.

Jens B
Avatar billede borrisholt Novice
27. februar 2004 - 08:32 #10
Efter lidt søgen i MSDN (hvad skulle vi gøre uden ?) har jeg fundet ud af du skal funktionen MessageBoxIndirect 

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/DialogBoxes/DialogBoxReference/DialogBoxFunctions/MessageBoxIndirect.asp

se også MSGBOXPARAMS Structure :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/DialogBoxes/DialogBoxReference/DialogBoxStructures/MSGBOXPARAMS.asp

Citat :
lpszIcon
  Identifies an icon resource. This parameter can be either a null-terminated string or an integer resource identifier passed to the MAKEINTRESOURCE macro.
To load one of the standard system-defined icons, set the hInstance member to NULL and set lpszIcon to one of the values listed with the LoadIcon function.

This member is ignored if the dwStyle member does not specify the MB_USERICON flag.

JEns B
Avatar billede futterama Nybegynder
27. februar 2004 - 12:47 #11
borrisholt>> Okay, det lyder godt men jeg fatter paphat af alt det der, så et eksempel ville være guld værd :-)

Det med at kopiere Borlands MessageDlg, hvordan gør jeg det?
Avatar billede hrc Mester
27. februar 2004 - 15:21 #12
Jeg fandt dette eksempel på MessageBoxIndirect som er meget lettere at bruge i forhold til at skulle lave en form og få den til at opføre sig som MessageDlg.
Bemærk, at eksemplet bruger en ressource (noget du laver med "Image Editor" eller lign og linker til programmet vha {$R .. }.

procedure TfrmMain.Button3Click(Sender: TObject);
var
  MsgParams: TMsgBoxParams;
begin
  with MsgParams do begin // with
    cbSize := SizeOf(MsgParams);
    hInstance := SysInit.HInstance;
    hwndOwner := Handle;
    lpszText := 'This is a MessageBoxIndirect Message Box';
    lpszCaption := 'This is the Caption , ,';
    dwStyle := MB_OKCANCEL or MB_USERICON or MB_APPLMODAL;
    lpszIcon := 'MAINICON';
    dwContextHelpId := 0; //help context
    lpfnMsgBoxCallback := nil;
    dwLanguageId := LANG_NEUTRAL;
  end; //with
  MessageBoxIndirect(MsgParams);
end;
Avatar billede hrc Mester
27. februar 2004 - 15:57 #13
I øvrigt så kan jeg ikke få den til at vise MAINICON, men det kan andre måske. På nedenstående link er der også demonstration af hvordan man laver en form der ligner MessageDlg (ikke et kønt et, men dog et eksempel).

http://oldlook.experts-exchange.com:8080/Programming/Programming_Languages/Delphi/Q_20713772.html#9182587
Avatar billede borrisholt Novice
16. marts 2004 - 20:25 #14
Jeg ved ikke om dette stadig har interesse, men nu har jeg fundet løsningen :

procedure TForm1.Button1Click(Sender: TObject);
  function GetIconResNameFromStr(const Str: string): PChar;
    {Returns a pointer to given string resource name in the format expected by the
    MessageBoxIndirect API call: this is a PChar pointer to a wide char string
    under Windows NT and a PChar pointer to an ansi char string under Windows 9x}
  begin
    if Win32Platform = VER_PLATFORM_WIN32_NT then
      Result := PChar(PWChar(WideString(Str)))
    else
      Result := PChar(Str);
  end;

var
  MsgParams: TMsgBoxParams;
begin
  with MsgParams do
  begin // with
    cbSize := SizeOf(MsgParams);
    hInstance := SysInit.HInstance;
    hwndOwner := Handle;
    lpszText := 'This is a MessageBoxIndirect Message Box';
    lpszCaption := 'This is the Caption , ,';
    dwStyle := MB_OKCANCEL or MB_USERICON or MB_APPLMODAL;

    lpszIcon := GetIconResNameFromStr('MAINICON');
    dwContextHelpId := 0; //help context
    lpfnMsgBoxCallback := nil;
    dwLanguageId := LANG_NEUTRAL;
  end; //with
  MessageBoxIndirect(MsgParams);
end;

Microsoft havde glemt at fortælle det skulle være en pwideChar på WinNT ff og en alm pChar på Win9x.

Jens B
Avatar billede hrc Mester
17. marts 2004 - 11:28 #15
Glemsomme Microsoft, tst, tst. Eksemplet virker og ryger ned i kodeskuffen, arkiveret under diverse.
Avatar billede borrisholt Novice
17. marts 2004 - 14:18 #16
Lukker du så spøgsmålet ?

Jens B
Avatar billede hrc Mester
17. marts 2004 - 17:22 #17
Det ville jeg gerne, men det er ikke mig der har åbnet det...
Avatar billede futterama Nybegynder
18. marts 2004 - 07:51 #18
Det ser fint ud, men hvordan får jeg så mit eget ikon ind? - jeg mener et andet end det man sætter i Options -> Application. Skal jeg lave en ImageList eller hvordan? Og hvad skal der så stå ved lpszIcon?

Hvis jeg får svar på dette, så lukker jeg spørgsmålet og deler point ud :-)
Avatar billede borrisholt Novice
18. marts 2004 - 08:32 #19
Du skal kompilere et nyt Icon ind i din Exe fil, ved hjælp af et RC scritp. Det kan du finde 500 eksempler på her på Eksperten.

Når det er gjort får du et handle til dit Icon vha. LoadIcon !

Jens B
Avatar billede futterama Nybegynder
19. marts 2004 - 08:26 #20
Hmm, man søger efter rc script og finder nada!

Jens B, hvis du vil have nogle point, så må du lige gøre dig lidt fortjent til dem, vi er ude i et område hvor jeg er på dybt vand, så lidt mere sigende hjælp er nødvendig! ;-)
Avatar billede hrc Mester
19. marts 2004 - 11:01 #21
Uha da da. Nu er jeg ikke Borrisholt, men jeg synes det var et flabet svar til en der sikkert har brugt 2-3 timer på at finde løsningen. Jeg ville ikke gide svare dig efter sådan en melding!

For mig at se, så er opgaven løst mens du har stillet et tillægsspørgsmål som Internettet let kan forklare dig. Prøv Google: +delphi +ressource +script. Så ender man snart på Torry's (http://www.swissdelphicenter.ch/torry/showcode.php?id=302) hvor hele proceduren er beskrevet på tysk. Gør dig den ulejlighed at stave igennem teksten og du har løsningen - det tog mig under 5 minutter af finde, mens den nød som borrisholt har løst ikke står nogen steder.

borrisholdt: undskyld at jeg farer til pennen på dine vegne, men jeg blev sgu fornærmet.
Avatar billede borrisholt Novice
19. marts 2004 - 11:09 #22
hrc >> Søge funktionen her på Exp virker af h. til ellers er det et emne jeg har besvaret en 4-500 gange her inde på exp. endvidere har jeg vist en tendens til at svare sådan ....

Jeg laver et eksempel til manden, da jeg synes den anden "guide" er dum og besværlig, omstendig, direkte tåbelig og en masse andre grimme ord !!!!

jens B
Avatar billede borrisholt Novice
19. marts 2004 - 11:19 #23
1)
  I notepad laver du et RC script alla det her :

////// begin rc fil //////

//Name              TYPE            Filename
  103_55            ICON            103_55.ico
  103_56            ICON            103_56.ico
  103_67            ICON            103_67.ico
////// end rc fil //////

Typen kan udelades, men jeg plejer at sætte den på.
2)
  Tilføj denne rc fil til dit projekt ! Ikke noget med commandline compilere og alt andet snask !
3)
  Når du skal bruge Iconet kan du enten bruge LoadIcon, eller blot angive RESOURCE navnet, ikke filnavnet i GetIconResNameFromStr.

altså, i mit tilfælde hvis jeg ønsker at bruge iconet "103_55.ico", skriver jeg

    lpszIcon := GetIconResNameFromStr('103_55');

Etc. Håber det bragte klarhed over emnet !!

Jens B
Avatar billede borrisholt Novice
19. marts 2004 - 11:19 #24
hrc>> Næsten samme fremgangs måde hvis du skal kompilere noget andet ind i din exe fil !

Jens B
Avatar billede futterama Nybegynder
19. marts 2004 - 11:54 #25
Jeg vil godt lige undskylde mit lille "udbrud" efter at have set at det blev taget som en fornærmelse. Jeg mente bare at jeg ikke deler point ud til halvfærdige løsninger, og eftersom jeg ikke vidste at RC = Resource kunne jeg ikke bruge det til meget.

Jeg er da glad for jeres svar, men når man har fået mange (for mig) uforståelige svar med indforstået indhold, så bliver man lidt træt af det til sidst. Men igen, I ved ikke hvor meget jeg ved og hvor meget jeg ikke ved...

Undskyld til borrisholt for en måske flabet melding. Det var ikke ment sådan :-/

Og derefter tak til borrisholt for hans svar :-)
Avatar billede borrisholt Novice
19. marts 2004 - 11:57 #26
Jeg kabn saktens tåle et flabet svar .. Jeg giver selv nogen med jævne mellemrum

Jens B
Avatar billede futterama Nybegynder
19. marts 2004 - 12:05 #27
Sådan, svaret er testet OK og point er uddelt.

Tak til borrisholt og endnu engang undskyld, jeg skammer mig egentlig nu :-/

Og tak til hrc, både for svar og for at gøre mig opmærksom på min flabede kommentar...

Jeg håber ikke det har skræmt jer fra at svare mig en anden gang...
Avatar billede hrc Mester
19. marts 2004 - 12:59 #28
Jeg vil selv beklage; skal ikke blande mig så meget som jeg gør.

Er på det seneste stødt på lidt for mange, af hvad jeg vil kalde hjælpeløse spørgere, som forventer alt serveret på et sølvfad. Som følge deraf er jeg endt i gnavpot-hjørnet.

En del spørgsmål svarer jeg på efter et enkelt opslag på internettet - det kunne spørgeren ligeså godt selv have gjort (noget med google: +delphi +etellerandet).

Derfra stammer min galde.
Avatar billede futterama Nybegynder
19. marts 2004 - 14:34 #29
hrc, forskellen på dig og de hjælpeløse brugere er at du har kompetencen til at søge efter det rigtige på google, og klikke på de rigtige søgeresultater - netop fordi du ved dét mere end spørgeren.

Jeg har faktisk et uddybende spørgsmål til borrisholt. Kan man ændre teksten på knapperne ligesom man kan ændre ikonet? Her hvor jeg arbejder bruger vi Windows i engelsk version, og det ville være smart hvis man kunne få Delphi til at skrive dansk på knapperne...

Er det muligt?
Avatar billede hrc Mester
19. marts 2004 - 16:07 #30
Tak for dine ord. Nu mener jeg slet ikke at tilhøre gruppen af eksperter; jeg er bare entusiastisk pointsjæger.

Til dit spg. har jeg en middelgod løsning. Delphi har deres eget oversættelsesværktøj (i alt fald den version jeg sidder med) og bygger man det ind i programmet så kan knapperne også oversættes.

Grunden til jeg siger det er en middelgod løsning er, at jeg synes det er ret besværligt i brug - især i forhold til eks. Multilizer. Man skal f.eks. definere alle sine tekster ("Vil du afslutte?" osv) som resourcestring-konstanter før man kan oversætte dem. Den anden ulempe er at de oversatte strenge placeres i en .DAN, .US og lignende resoursefiler som placeres ved siden af exe-filen. Fjerner man dem, så "taler" programmet originalsproget igen - lidt en fusket løsning synes jeg.
Avatar billede borrisholt Novice
20. marts 2004 - 09:24 #31
futterama>> Hvis nu jeg skal bakke hrc lidt op, så synes jeg ikke om dit ekstra spørgsmål. Jeg skal nok besvare det, men ... RTFM !

Read The Fucking Manual !

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/DialogBoxes/DialogBoxReference/DialogBoxStructures/MSGBOXPARAMS.asp

er linket til manualen, og hvad skriver Microsoft så ?

dwLanguageId
Specifies the language in which to display the text contained in the predefined push buttons. This value must be in the form returned by the MAKELANGID macro.
For a list of supported language identifiers, see Language Identifiers. Note that each localized release of Microsoft Windows 95/98/Me and Microsoft Windows NT typically contains resources only for a limited set of languages. Thus, for example, the U.S. version offers LANG_ENGLISH, the French version offers LANG_FRENCH, the German version offers LANG_GERMAN, and the Japanese version offers LANG_JAPANESE. Each version offers LANG_NEUTRAL. This limits the set of values that can be used with the dwLanguageId parameter. Before specifying a language identifier, you should enumerate the locales that are installed on a system.

Jeg du skulle tilægge dig en vane om læst først i Delphis online hjælp. Hvis det er sådan noget API snask som vi har gang i her så brug MSDN. Den mængde dokumentation, som MSDN hidbringer, for anu at bruge et gammelt ord, er imponerende. Dit spørgsmål beviser du slet ikek har læst det der stod på MDSN.

Nå men tilbage ti ldit spørgsmål :

Jeg kan saktens forstå hvis ikke du lige kan gennemskue det, fordi funktionen findes slet ikke i Delphi, men den er nu nem nok at lave ...

Lad os starte med at se hvad der står i delphis Online hjælp :
#define MAKELANGID(p, s) ((((WORD) (s)) << 10) | (WORD) (p))

Det er C++

<< Betyder Shift Left,som hedder shl i Delphi
|  Betyder et or på bitneveau, som bare hedder or i Delphi

Med den viden er det ikke så svært at skrive en MAKELANGID selv :

function MAKELANGID(usPrimaryLanguage, usSubLanguage: WORD): WORD;
begin
  Result := (usSubLanguage shl 10) or usPrimaryLanguage;
end;


Og med den viden i hånden burde det her give dig din dialog på Dansk :



dwLanguageId := MAKELANGID(LANG_DANISH, SUBLANG_DEFAULT);

Men indrømmet jeg har ikke testet det, fordi det vil kræve jeg gad starte Delphi op !


Jens B
Avatar billede futterama Nybegynder
22. marts 2004 - 07:41 #32
hcr: Det var da en løsning, men du har ret, det er lidt "fusk" - man skal jo huske at få den ekstra fil med sig...

borrisholt:
1. C++ siger mig intet, og gør mig bare mere forvirret, derfor går jeg i en fin bue uden om MSDN...
2. Det virker desværre ikke :-/ (selvom jeg har kigget og læst på MSDN! og prøvet forskellige ting...)
Avatar billede futterama Nybegynder
22. marts 2004 - 07:42 #33
Ups, hrc ikke hcr, sorry, det er mandag morgen ;-)
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