Entwickler-Ecke

Sonstiges (Delphi) - Dialog mit beliebigen Buttons?


tommie-lie - So 29.09.02 15:05
Titel: Dialog mit beliebigen Buttons?
Hallo,

Ich will eine Dialog-Box öffnen, die vollkommen modifizierbar ist. Mit dem Delphi-Befehl "MessageDlg" ist schonmal gut geholfen. Allerdings will ich, daß es zwei Buttons gibt, deren Text ich frei whäeln kann. Also genauer gesagt soll auf dem einen "Text hinzufügen" stehen und auf dem anderen "Bild hinzufügen". Ich will also den Text zweier Buttons selbst bestimmen.
Kann ich das nur mit einer selbsterstellten Form lösen, die ich dann per ShowModal zeige?
Dann würde ich aber gerne wissen, wie ich das grüne Fragezeichen für eine Frage-Dialogbox in die selbstgemachte Form kriege.

Tschüß
Thomas


Delete - So 29.09.02 17:27
Titel: Re: Dialog mit beliebigen Buttons?
Zitat:
Dann würde ich aber gerne wissen, wie ich das grüne Fragezeichen für eine Frage-Dialogbox in die selbstgemachte Form kriege.

Ist das grün? Das einzige was ich kenne sind die "IDI_???"-Konstanten, die du im PSDK unter "LoadIcon" findest. Du meinst vielleicht "IDI_QUESTION"?!

@DeCodeGuru: Ihr Auftritt, Sir! :wink:


tommie-lie - So 29.09.02 18:03

ja müsste grün sein...
Zumindest in Win9x. Aber wie ich MS kenne haben die's mittlerweile (bei XP) wieder geändert...

Aber das ist nachrangig. Ich will erstmal wissen, wie ich die Buttons selbst beschriften kann.


Delete - So 29.09.02 18:26

Was das Fragezeichen angeht -
Offenbar reden wir von was anderem?! Ich sehe hier bloß eine weiße Sprechblase mit einem blauen Fragezeichen.

Mit den Buttons -
So auf die Schnelle fällt mir kein Weg ein. Die Funktionen, die ich kenne, erlauben zwar die freie Auswahl welche Buttons zu sehen sein sollen, aber die Beschriftung bleibt da außen vor.

Entweder machst du´s über eine Form, oder du nimmst den NonVCL-Weg und erstellst dir mit einem Ressourceneditor ein entsprechendes Dialogtemplate. Das hätte den Vorteil, dass es unabhängig von den Forms (VCL) ist und in vielen Anwendungen benutzt werden könnte. Außerdem wäre das Template (RES-Datei) recht klein.
Du müsstest dich dann nur mit der API-Funktion "DialogBox" beschäftigen und jedem Programm eine kleine API-Nachrichtenfunktion spendieren. Aber das ließe sich auch in eine Unit auslagern, so dass du beispielsweise eine Funktion schreibst, die die Dialogbox aufruft und der du die gewünschten Buttonnamen übergibst.

Mehr weiß ich im Moment nicht. :?


Delete - Mo 30.09.02 01:29
Titel: Re: Dialog mit beliebigen Buttons?
MathiasSimmack hat folgendes geschrieben:
die du im PSDK unter "LoadIcon" findest. Du meinst vielleicht "IDI_QUESTION"?!

:roll:

Für Messageboxen kenne ich nur: MB_ICONQUESTION.

Aber es dürfte wohl einfacher sein, wen du dir schnell selber ein Formular zusammenklickst und das modal aufrufst.

Von Mathias Methode würde ich wohl abraten: zu viel Aufwand. Und den Vorteil sehe ich nicht so recht.


Delete - Mo 30.09.02 06:48
Titel: Re: Dialog mit beliebigen Buttons?
Luckie hat folgendes geschrieben:
Für Messageboxen kenne ich nur: MB_ICONQUESTION.

Man könnte ja auf die Idee kommen, dass "MB_" für MessageBox steht. Schau mal bei "LoadIcon" rein - da findest du die "IDI_???"-Konstanten, die (rein optisch) nicht anders aussehen als ihre "MB_???"-Gegenstücke. Ich habe, um ehrlich zu sein, aber noch nicht versucht, das Icon von "MB_ICONQUESTION" via "LoadIcon" zu laden. Vielleicht geht´s ... das weiß ich nicht ...


Delete - Mo 30.09.02 11:05

Habe ich auch gesehen.

Mit LoadIcon kannst du sie nur benutzen, wenn du über MessageboxIndirect gehst. Ist natürlich Blödsinn, wenn sie mitr den MB_... Dingern identisch sind.


Delete - Mo 30.09.02 13:36

Ich weiß jetzt nicht, wie du das mit dem nur meinst:
Zitat:
Mit LoadIcon kannst du sie nur benutzen, wenn du über MessageboxIndirect gehst.

Aber die Benutzung der "IDI_???"-Icons ist natürlich nicht nur auf "MessageBoxIndirect" beschränkt. Du kannst die Icons auch so laden, und sie als TNA-Symbol nutzen, oder auf einem Formular anzeigen usw.

Wenn du das gemeint hast, dann stimme ich dir zu. Ansonsten sieh´s als Ergänzung.


Delete - Mo 30.09.02 13:40

Ich hatte mich speziell auf die Messagebox bezogen.


tommie-lie - Mo 30.09.02 14:16

Tja, ich dachte halt es gibt eine Möglichkeit ohne eigene Form. Dann werd' ich's halt so mache müssen.

Und was das Symbol betrifft:
Wenn ich das mit LoadIcon mache, habe ich es doch nicht im Fenster, oder?
Kennt ihr nicht diese ganzen Windows-Fragen, -Bemerkungen, -Aufforderungen? Da gibt's dann ein rotes Stopp-Schild, ein blaues Ausrufezeichen, oder eben auch ein grünes Fragezeichen. Die beiden letzteren dann mit einer weißen Blase unterlegt. Die Dinger befinden sich immer am linken Rand der Dialogbox, in der Vertikalen mittig ausgerichtet. Ich würde jetzt sowas mit einem Image machen in das ich einen selbsterstellten Shot des Fragezeichens lade. Wie mach' ich das jetzt mit dem LoadIcon?

Tschüß
Thomas


Delete - Mo 30.09.02 15:50

TImage-Kompo auf deine Form (Maße 32x32), und dann:

Quelltext
1:
Image1.Picture.Icon.Handle := LoadIcon(0,IDI_ERROR);                    

Die Möglichkeiten findest du in der Hilfe, bzw. im MSDN/PSDK zu "LoadIcon".

Zitat:
Tja, ich dachte halt es gibt eine Möglichkeit ohne eigene Form

Deswegen dachte ich ja an eine kleine eigene Dialogressource. Dieser Weg ist zwar nicht unbedingt der eleganteste, käme aber ohne Form aus, die RES-Datei wären bestenfalls ein paar KB groß, und du könntest diesen Dialog auch in anderen Programmen wiederverwenden (auch in NonVCL-Programmen, weil der Dialog ja auch der Ressource kommt).
Ich persönlich sehe den Aufwand dafür als nicht so groß an, aber das muss eben jeder für sich selbst entscheiden.

PS: Ich behaupte immer noch, dass das Fragezeichen blau und nicht grün ist. :)


Delete - Mo 30.09.02 17:35

Blau in einer weißen Sprechblase.


tommie-lie - Mo 30.09.02 18:42

Tatsächlich.
Blau.
Seltsam.
Wo habe ich denn dann das grüne gesehen? Linux war's nciht, Be war's nicht. Klnnte Win3.1 gewesen sein, aber das wäre mir nicht eingefallen, weil ich mindestens 3 Jahre nicht mehr vor Win3.1 saß. Ich sollte woll die schon vertrockneten grauen Zellen ausmisten und ein paar frsiche dabeitun. Vielleicht klappt's dann demnächst...

Aber unter welche Stichwort in der Hilfe finde ich denn das? Es gibt werder den Befehl Loadicon, noch das Stichwort IDI noch sonstirgendwas. Also zumindest nciht in der Delphi-Hilfe.
Nebenbei: den Befehl ShellExecute vermisse ich da irgendwie auch drin...

Gibt's irgendeine Sonderfunktion in der Hilfe?

Nachtrag: Ich habe noch ein bisschen in der Hilfe nachgesucht:
Es gibt tatsächlich ein grünes Fragezeichen. Und zwar wenn man die Funktion CreateMessageDialog nimmt. Die hat einen Parameter namens DlgType der gerne eine Konstante vom Typ TMsgDlgType hätte. Folgt man dem Link zu TMsgDlgType findet man unter anderem die Definition für die Konstante mtConfirmation:

Quelltext
1:
mtConfirmation | A message box containing a green question mark.                    

Also hatte ich doch recht mit dem grün. Jetzt muss man nur noch rausfinden, wie man an dieses Symbol rankommt...


DeCodeGuru - Mo 30.09.02 19:40

Zitat:
Wo habe ich denn dann das grüne gesehen? Linux war's nciht, Be war's nicht. Klnnte Win3.1 gewesen sein, aber das wäre mir nicht eingefallen, weil ich mindestens 3 Jahre nicht mehr vor Win3.1 saß. Ich sollte woll die schon vertrockneten grauen Zellen ausmisten und ein paar frsiche dabeitun. Vielleicht klappt's dann demnächst...


Neuer Monitor? :mrgreen:

Zitat:
Aber unter welche Stichwort in der Hilfe finde ich denn das? Es gibt werder den Befehl Loadicon, noch das Stichwort IDI noch sonstirgendwas. Also zumindest nciht in der Delphi-Hilfe.
Nebenbei: den Befehl ShellExecute vermisse ich da irgendwie auch drin...


Da wirste in der Delphi-Hilfe keinen Erfolg haben. Geh mal auf Start -> Programme -> Borland Delphi -> Hilfe -> Hilfdateien... -> Win32-SDK-Referenz und da kannste dann suchen. Allerdings ist das Ding meines Wissens nach recht alt. Deshalb würde ich dir mal empfehlen die PSDK zu installieren. Ist aber recht groß.

Damit du auch an die Infos kommst, habe ich hier einen Auszug aus der PSDK und weil mich Mathias so nett aufgefordert hat (
Zitat:
@DeCodeGuru: Ihr Auftritt, Sir! :wink:
) :beer: :

Zitat:
The LoadIcon function loads the specified icon resource from the executable (.exe) file associated with an application instance.

Note This function hase been superseded by the LoadImage function.

Syntax


Quelltext
1:
2:
3:
HICON LoadIcon(          HINSTANCE hInstance,
    LPCTSTR lpIconName
);


Parameters

hInstance
[in] Handle to an instance of the module whose executable file contains the icon to be loaded. This parameter must be NULL when a standard icon is being loaded.
lpIconName
[in]
Pointer to a null-terminated string that contains the name of the icon resource to be loaded. Alternatively, this parameter can contain the resource identifier in the low-order word and zero in the high-order word. Use the MAKEINTRESOURCE macro to create this value.

To use one of the predefined icons, set the hInstance parameter to NULL and the lpIconName parameter to one of the following values.

IDI_APPLICATION
Default application icon.
IDI_ASTERISK
Same as IDI_INFORMATION.
IDI_ERROR
Hand-shaped icon.
IDI_EXCLAMATION
Same as IDI_WARNING.
IDI_HAND
Same as IDI_ERROR.
IDI_INFORMATION
Asterisk icon.
IDI_QUESTION
Question mark icon.
IDI_WARNING
Exclamation point icon.
IDI_WINLOGO
Windows logo icon. Windows XP: Default application icon.

Return Value

If the function succeeds, the return value is a handle to the newly loaded icon.

If the function fails, the return value is NULL. To get extended error information, call GetLastError.


@MathiasSimmack: Da haste auch deine IDI_...-Dinger :wink:


Delete - Mo 30.09.02 19:59

Und noch mal meine Version der Antwort:
LoadIcon im MSDN [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/icons/iconreference/iconfunctions/loadicon.asp]

@DeCodeGuru: So hat er auch die weiterführenden Links. :wink:


DeCodeGuru - Mo 30.09.02 20:30

Zitat:
@DeCodeGuru: So hat er auch die weiterführenden Links. :wink:


stimmt


tommie-lie - Di 01.10.02 08:39

Hallo,
erstmal danke für die ganzen Infos.
'n neuen Monitor ahbe ich nicht und ich meine es war wirklich mal grün. Außerdem steht grün in der Hilfe.

Aber wo finde ich denn die aktuelle Version der PSDK?

Tschüß
Thomas


Delete - Di 01.10.02 08:43

PSDK [http://www.microsoft.com/msdownload/platformsdk/sdkupdate/]


Tino - Di 01.10.02 09:00

tommie-lie hat folgendes geschrieben:
Aber wo finde ich denn die aktuelle Version der PSDK?

Bei uns in der Linkliste [http://www.auq.de/viewtopic.php?t=1242] gibt es auch ein paar hilfreiche Links. Wie zum Beispiel zum PSDK!

Gruß
TINO


tommie-lie - Di 01.10.02 13:05

Ähhh, und was mach' ich, wenn ich den IE5 nicht habe und auch nicht vorhabe ihn mir zuzulegen?


DeCodeGuru - Di 01.10.02 13:22

Zitat:
Ähhh, und was mach' ich, wenn ich den IE5 nicht habe und auch nicht vorhabe ihn mir zuzulegen?


Wofür brauchst du denn den IE 5? Welches Betriebsystem hast du denn?Denn der IE5 ist doch schon seit Win98 dabei, oder täusche ich mich da?


tommie-lie - Di 01.10.02 14:47

Man braucht ihn laut genialer Microsoft-Seite zum installieren des PSDK.
Und da ich durch 'ne Firewall surfe, ist der IE der letzte, dem ich Zugang zum Internet gewähren würde...


DeCodeGuru - Di 01.10.02 15:40

wenn du ne Flatrate hast, kannste du dir auch die komplette PSDk runterladen. Ist allerdings so um die 350 MB groß.


Delete - Di 01.10.02 15:54

Was? Wieso?


tommie-lie - Di 01.10.02 15:55

so groß?
Ich will doch nur die Referenz und die Beschreibung für die Befehle.
Gibt's da nix kleineres?


Delete - Di 01.10.02 16:02

tommie-lie hat folgendes geschrieben:
so groß?

Ja.
Zitat:

Ich will doch nur die Referenz und die Beschreibung für die Befehle.

Die API ist eben recht umfangreich.
Zitat:

Gibt's da nix kleineres?

Nein.


tommie-lie - Di 01.10.02 17:20

blödes ding.
Jetzt weiß ich auch, warum ich lieber ein anderes OS hätte...
Eines wo sowas schon dabei ist. Eines wie LINUX


phlux - So 06.10.02 11:33

Hoi!
Vllt hilft dir dieser link weiter http://www.d-tnt.co.uk/readArticle.asp?id=3605&pg=2&cat=Graphics&page=/delphitips.asp hab den code zwar nicht ausprobiert, dürfte aber in die richtung gehen, was du machen willst ;)


Moritz M. - So 06.10.02 12:21
Titel: Hi
Hi

Erstmal von allen anderen Diskussionen weg zur Ersten Frage:

Es gibt eine Möglichkeit. Du findest Sie hier [http://swissdelphicenter.ch/de/showcode.php?id=1241].

cu

Onz

@DeCodeGuru
Geh mal auf MSN Online(Wenn du nicht gerade in der Sonne am Pool liegst :wink: ). Ich schick dir das Configtool und den ToOserver zu


Delete - So 06.10.02 13:31

DeCodeGuru hat folgendes geschrieben:
Denn der IE5 ist doch schon seit Win98 dabei, oder täusche ich mich da?

So alt ist er ja nun auch nicht, DeCodeGuru. Bei Win98 war noch der IE4 dabei.

tommie-lie hat folgendes geschrieben:
Und da ich durch 'ne Firewall surfe, ist der IE der letzte, dem ich Zugang zum Internet gewähren würde...

Dann hast du keine gute Firewall. Mein IE darf gerade mal die Ports 80 und 443 nutzen, und nur lokal auf meinem PC darf er sämtliche Ports nehmen. Aber - *hüstel* - im Moment bin ich gerade mit dem Mozilla unterwegs. 8)


tommie-lie - So 06.10.02 16:01

okay, danke.
Das vom Delphi-Center war ideal. Das andere habe ich mir gar nicht vollständig durchgelesen. War zu lang und zu kompliziert.

@Mathias: Kommt drauf an. Bei Win98 FE war's der IE4, bei Win98SE der IE5.
Win98SE ist glaube ich Ende 1998 rausgekommen (November?) also ist der IE5 auch schon alt.

Aber Mozilla nehm ich auch. Der ist mir von allen Browsern der liebste, allein weil er sich an bestehende Standards hält, anstatt (wie Microsoft) alles umzurennen...