Autor Beitrag
Sledge_Hammer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32

Win 98 SE, Win XP
D7 Prof
BeitragVerfasst: Mi 16.10.02 20:31 
Hi
ich will eine Benutzereingabe einbauen, bei der ein kleines Fenster erscheint in dem man dann ja und nein, u.U. auch abbrechen anklicken kann. ich hab das irgendwann schonmal gemacht, aber mit fällt nicht mehr ein, wie das ging. Hab schon in der Hilfe nachgesehen, aber nichts gefunden.
THX Benni
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 16.10.02 20:42 
Such mal in der Hilfe nach Application.Messagebox.
majolo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334

Ubuntu 8.04, WinXP Prof.
D1, D6Pers, D7 Prof., D8 Prof., D2005 Pers
BeitragVerfasst: Mi 16.10.02 20:53 
Hi,

werde ein bisschen ausholen.
ausblenden Quelltext
1:
Application.MessageBox ('Hallo!','Überschrift',Symbol + Schaltfläche);					

So das war das Prinzip.Nun zu den Werten
Wert Schaltfläche
0 OK
1 OK und Abbrechen
2 Abbrechen,Wiederholen,Ignorieren
3 Ja,nein,Abbrechen
4 Wiederholen,Abbrechen

Wert Symbol
16 Warnkreuz
32 Fragezeichen
48 Ausrufezeichen
64 Infozeichen

Um also einen Dialog mit den Schaltfächen Ja,Nein,Abbrechen und dem Fragzeichen zu verwenden sieht das so aus
ausblenden Quelltext
1:
Application.MessageBox ('Hallo!','Überschrift',32 + 3);					


Die Ergebnisse werden so abgefangen:

wert Konstant Schaltfläche
1 idOk OK
2 idCancel Abbrechen
3 idAbort Beenden
4 idRetry Wiederholen
5 idIgnore Ignorieren
6 idYes Ja
7 idNo Nein

BSP-Code

ausblenden Quelltext
1:
2:
3:
4:
Knopf:= Application.MessageBox ('Hallo!','Überschrift',32 + 3);

if Knopf = IdYes then
ShowMessage('hallo');

Hoffe konnte dir helfen.
Gruss
majolo


Zuletzt bearbeitet von majolo am Do 17.10.02 16:42, insgesamt 1-mal bearbeitet
Sledge_Hammer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32

Win 98 SE, Win XP
D7 Prof
BeitragVerfasst: Mi 16.10.02 21:01 
Moin
Yo danke, jetzt wo ich das lese fällt mir das auch wieder ein. an den wert hinten hab ich gar nicht gedacht, hab immer nur 16, 32, 48 oder 64 eingesetzt. jedenfalls danke.
Benni
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 16.10.02 21:10 
Was habt ihr immer mit eurer MessageBox. Wenn einer mal nach einer Alternative zu ShowMessage fragt, dann kommt immer MessageBox. Nicht, daß die schlecht wäre, aber es gibt auch sowas wie MessageDlg:

ausblenden Quelltext
1:
MessageDlg('Das ist der Text', mtConfirmation, [mbYes, mbNo], 0);					


Ist doch auch toll. Ich fühle mich inzwischen wie ein Außenseiter. Kein Mensch scheint MessageDlg zu benutzen, nur Popov. Auf die Dauer kriegt ein sensibler Mensch wie ich noch Minderwertigkeitskomplexe.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 16.10.02 21:10 
Und ich nehme immer die Konstanten und verknüpfe sie mit or. Denn wer weiß schon was hinter 64 für ein Icon und welche Buttons stecken.

ausblenden Quelltext
1:
Messagebox(Handle, 'Text', 'Überschrift', MB_YESNOCANCEL or MB_ICONQUESTION);					


Da weiß ich 10 Jahren noch wie die Messagebox aussieht.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 16.10.02 21:16 
@Popov. Bei MessageDlg kannst du keine eigene Caption vergeben. Ich denke mal das ist der nachteil.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 17.10.02 08:17 
Wer ist eigentlich überhaupt auf die grandiose Idee gekommen, die numerischen Werte anstelle der Konstanten zu benutzen? Ah, majolo:
ausblenden Quelltext
1:
Application.MessageBox ('Hallo!','Überschrift','32 + 3');					

Zum einen funktioniert dieser Code sowieso nicht, weil der letzte Parameter ein Integer sein muss - kein String!
Und dann würde ich mir mal wünschen, dass Microsoft die Werte für Buttons usw. kurzerhand ändert. Dass beispielsweise der OK-Button den Wert 666 bekommt.

Was passiert?
Borland wird eine entsprechende Hinweismeldung auf der Homepage posten oder vielleicht sogar aktuelle Units herausgeben. Jeder vernünftige Programmierer, der die Konstanten benutzt hat, muss nun einfach nur die neuen Units verwenden und sein Programm neu kompilieren. Danach kann er sicher sein, dass das Programm wieder läuft.

Unser majolo dagegen muss seinen kompletten Quellcode (in all seinen Programmen) nach allen "MessageBox"-Anweisungen durchsuchen und dort die alten numerischen Werte an die neuen Werte anpassen. Denn er kann das Programm so oft kompilieren wie er will: durch die Verwendung der numerischen Werte nutzen ihm die neuen Units gar nichts.
Spätestens dann wird er wohl klüger sein und künftig auch nur noch die Konstanten benutzen. :twisted:
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 17.10.02 13:14 
Das ist jetzt aber echt etwas gemein und hart Mathias. Selbst in meinem Anfängerbuch stehen zwar die Namen der Konstanten drin, bei den Beispielen haben sie aber trotzdem die nummerischen Werte benutzt. Und ich muß sagen , ich habe sehr lange gebraucht, bis ich kappiert habe, wie das mit den Konstanten geht.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 17.10.02 13:27 
Ich weiß natürlich, dass du das ironisch meinst, Luckie. Und mal ernsthaft: natürlich wird Microsoft die Werte nicht ändern. Das wäre ja auch Blödsinn, weil dann von Heute auf Morgen kein Programm mehr funktioniert würde, das auf solche Systemkonstanten zurückgreift. (Microsofts Software eingeschlossen.) Es sollte nur ein Extrembeispiel sein.

Natürlich kann man das hier schreiben:
ausblenden Quelltext
1:
Application.MessageBox('Wollen Sie dies oder das tun?','Titel',3 + 32);					

Es funktioniert -keine Frage!- aber schon nach einem Monat wird man vielleicht nicht mehr wissen, was das "3 + 32" eigentlich bedeuten soll. (Es sei denn, man schreibt nur dieses eine Programm; dann merkt man sich das möglicherweise.)

Also benutzt man die Konstanten. Auswirkungen auf den ausführbaren Code der Exe gibt es nicht, bzw. der ist so minimal, dass man ihn vernachlässigen kann. (Ich glaube aber, dass es keinerlei Auswirkungen auf den Code hat, denn die Konstanten stehen in der "Windows"-Unit, und die wird sowieso in 99% aller Programme benutzt.)
Dafür wird der Quellcode übersichtlicher, und -wie du schon sagtest, Luckie - man weiß auch in 10 Jahren noch, welche Buttons bei der Anweisung
ausblenden Quelltext
1:
2:
Application.MessageBox('Wollen Sie dies oder das tun?','Titel',
  MB_YESNOCANCEL or MB_ICONQUESTION);

angezeigt werden.


Möglicherweise ist das or für Neulinge verwirrend, denn man könnte ja dahinter folgendes vermuten:
Zitat:
Zeige Ja/Nein/Abbrechen ODER das Fragezeichen-Symbol

Berechtigterweise könnte man dann fragen: "Wieso Oder? Warum nicht Und? Ich will ja die Buttons UND das Symbol sehen." Dazu ist zu sagen, dass es mit einem boolschen Vergleich wie
ausblenden Quelltext
1:
if(bedingung1) or (bedingung2)					

nichts zu tun hat. Das wird etwas deutlicher, wenn man sich die Zeilen mal im C-Code anschaut:
ausblenden Quelltext
1:
if(bedingung1 || bedingung2)					

aber:
ausblenden Quelltext
1:
MB_YESNOCANCEL | MB_ICONQUESTION					

Im letzteren Fall handelt es sich um ein bitweises Oder, d.h. die einzelnen Bits werden logisch miteinander verknüpft:
ausblenden Quelltext
1:
2:
3:
4:
000011 ( 3)
100000 (32)
------
100011 (35)

Weil man bei Delphi aber in beiden Fällen das or im Quellcode stehen hat, fällt einem Neuling der Unterschied nicht so auf. Zur Demonstration noch eine logische and-Verknüpfung. (Wie wir ja alle noch aus dem entsprechenden Unterricht/Lehre/Studium/usw. wissen, leuchtet in dem Fall die Lampe am Ausgang nur, wenn man am Eingang beide Schalter betätigt. :wink:)
ausblenden Quelltext
1:
2:
3:
4:
000011 ( 3)
100000 (32)
------
000000 ( 0)

Und weil Null dem Code des OK-Buttons entspricht, sieht man dann auch nur einen solchen, wenn man
ausblenden Quelltext
1:
MB_YESNOCANCEL and MB_ICONQUESTION					

benutzt. Ich empfehle einen Blick in die Delphi-Hilfe unter den Stichworten: "Logische (bitweise) Operatoren" und "Boolsche Operatoren", bzw. in einschlägige Bücher, Tutorials, usw.

Um aber auf das Thema zurückzukommen: den Quatsch mit den numerischen Werten würde ich mir ganz schnell abgewöhnen.

Zitat:
Selbst in meinem Anfängerbuch stehen zwar die Namen der Konstanten drin, bei den Beispielen haben sie aber trotzdem die nummerischen Werte benutzt.

Da muss ich dann wohl mal Pit (sinngemäß) zitieren, der von bestimmten Büchern ja auch nicht begeistert ist und in etwa sagte, dass sich manche Autoren damit nur profilieren wollen und eigentlich ihre Unkenntnis unter Beweis stellen.
Das wäre dann wohl so ein Beweis. :twisted:

Abgesehen davon brauchst du ja nun kein Anfängerbuch mehr, Luckie. Oder? :roll: :wink:
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 17.10.02 13:34 
MathiasSimmack hat folgendes geschrieben:
Ich weiß natürlich, dass du das ironisch meinst, Luckie.

Mißverständnis. Ich habe nichts ironisch gemeint. Das wars du. :wink:
Zitat:

Da muss ich dann wohl mal Pit (sinngemäß) zitieren, der von bestimmten Büchern ja auch nicht begeistert ist und in etwa sagte, dass sich manche Autoren damit nur profilieren wollen und eigentlich ihre Unkenntnis unter Beweis stellen.
Das wäre dann wohl so ein Beweis. :twisted:

Autsch, ich sehe gerade, es ist von Doberenz / Kowalski (die mit dem Kochbuch, welches ich übrigens auch besitze). Na ja damals hatten wir noch kein Internet und ich kannte keine Foren und hatte keine Buchempfehlungen, da nimmt man, was man für gut hält.
Zitat:

Abgesehen davon brauchst du ja nun kein Anfängerbuch mehr, Luckie. Oder? :roll: :wink:

Wenn du weiterhin so gut erklärst, dann wohl nicht. Aber ein paar Lücken habe ich denn noch und ich überlege mir noch ein richtiges Grundlagenbuch zu zu legen. Ich weiß nur nicht welches.
majolo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334

Ubuntu 8.04, WinXP Prof.
D1, D6Pers, D7 Prof., D8 Prof., D2005 Pers
BeitragVerfasst: Do 17.10.02 16:41 
@MathiasSimmack: Stimmt.Ich habe den Code einmal eingtippt und dann weiter kopiert.Tippfehler.Sorry.Änder das gleich mal ab.
Gruss
majolo
majolo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334

Ubuntu 8.04, WinXP Prof.
D1, D6Pers, D7 Prof., D8 Prof., D2005 Pers
BeitragVerfasst: Do 17.10.02 16:43 
Jetzt stimmts. 8)
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 17.10.02 18:12 
Yo, kein Problem. Aber -wie gesagt!- verzichte auf diese Zahlen und nimm die Konstanten dafür. Du wirst dich an mich erinnern, wenn du irgendwann (in naher oder ferner Zukunft) vielleicht mal ein altes Programm rauskramst und ändern willst. Dann geht nämlich das Gegrübel los ... "wofür steht jetzt noch mal die 3?" ... :idea:
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 18.10.02 02:15 
hehe, aus diesem Grund hatte ich früher immer am Rechner einen Zettel kleben mit den Werten für die Konstanten. :wink:
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Fr 18.10.02 08:02 
...Ja, und einen für die wichtigsten ASCII-Codes, einen mit den Werten für die Standardfarben, wichtige Registryschlüssel und natürlich die 100 wichtigsten Telefonnummern. Und meine Frau versteht absolut nicht, warum ich nen 21'' Monitor brauche. :mrgreen:

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 18.10.02 08:21 
Ihr werdet es wahrscheinlich nicht glauben, aber ich poste euch mal eine Tastaturabfrage aus meinen alten TurboPASCAL-Zeiten:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
FUNCTION CheckKey(SetSound: BYTE): WORD;
VAR
  ch : CHAR;
  Z  : BYTE;
BEGIN
  Z := 0;
  ch:= ReadKey; if ch = #0 then begin
                                  ch:= ReadKey;
                                  Z := 1;
                                end;

  if (SetSound = 1) then LetsBeep(BYTE(ch));

  CheckKey:= (256 * Z) + BYTE(ch);
END;

(Ähem, ich bitte zu bedenken, dass diese Funktion mehrere Jahre alt ist ... :oops:)

So, und weil das Ergebnis nun ein WORD ist, habe ich mir bereits damals schon Konstanten dafür ausgedacht:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
const
  kb_Esc       =  27;
  kb_Enter     =  13;
  kb_Space     =  32;
  kb_BackSpace =   8;
  kb_Tab       =   9;
  { ... }

Und deswegen sehe ich auch heute noch bei meinen alten TP-Sourcen durch:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
case CheckKey(0) of
  kb_Up:
    // hoch;
  kb_Down:
    // runter;
  kb_Enter,
  kb_Space:
    // mach was
  kb_Esc:
    // raus aus der Schleife
end;

8)
majolo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334

Ubuntu 8.04, WinXP Prof.
D1, D6Pers, D7 Prof., D8 Prof., D2005 Pers
BeitragVerfasst: Fr 18.10.02 16:05 
Ho,ho,ho.Jetzt werden die alten Zeiten ausgegraben. :D