| Autor |
Beitrag |
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 24.12.08 03:28
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 24.12.08 04:59
Delphi-Quelltext 1:
| MessageBox(0, 'Deine Eingabe war: ' + PChar(IntToStr(Eing)) + #10#13 'Es sind aber nur Zahlen von x-y erlaubt', 'Fehler', MB_OK xor MB_ICONERROR); |
Die MessageBox möchte als Parameter einen PChar, was im Prinzip das gleiche wie ein String ist. Ein einfacher Typecast wandelt den von IntToStr zurückgegebenen String in einen PChar um, siehe oben. Ausserdem verknüpft man Flags generell mit xor, nicht mit +! Achtung, das mit + funktioniert nur in den seltensten Fällen durch Zufall! (Ich bin mir nicht ganz sicher, ob xor oder or die Regel ist. )
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 24.12.08 05:20
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.ShowMessage(txt, Caption: string; thehandle: HWND); begin Windows.MessageBox(thehandle,PChar(txt),PChar(Caption),MB_OK+MB_ICONerror) end;
procedure TForm1.ButtonClick(Sender: TObject); begin ShowMessage('Dein Text','Fehler', Handle); end; |
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 24.12.08 05:34
Es gibt da ja auch Application.MessageBox, das kapselt ohnehin schon Windows.MessageBox, da muss man das Rad gar nicht neu erfinden.
Und ShowMessage würde ich eine eigene Prozedur jetzt nicht gerade nennen, schließlich gibts das schon. 
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 24.12.08 07:00
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 24.12.08 07:19
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 24.12.08 10:43
Bei JayEff muss die Klammer natürlich um den ganzen Parameter. Und das Verknüpfen der Flags mit xor ist falsch. Sie müssen mit or verknüpft werden. Dass es auch mit einem Plus geht, ist reiner Zufall, weil die Werte der Konstanten zufällig so gewählt wurden, dass es funktioniert.
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 24.12.08 11:25
Frühlingsrolle hat folgendes geschrieben : | @ jaenicke
Application.MessageBox habe ich ja auch versucht jedoch kommt's aufs selbe hinaus, ist nur etwas anders geschrieben.
DAS TYPEN-PROBLEM MIT 'String' und 'PAnsiChar' BESTEHT NOCH IMMER !! |
Delphi-Quelltext 1: 2:
| Application.MessageBox(PChar('Deine Eingabe war: ' + IntToStr(Eing) + #10#13 + 'Es sind aber nur Zahlen von x-y erlaubt'), 'Fehler' , MB_OK or MB_ICONERROR); | 
|
|
Chemiker
      
Beiträge: 194
Erhaltene Danke: 14
XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit, Win 10, Win 11
BDS 2006, RAD Studio 2009+C++, Delphi 13, VS 2010 Prof.
|
Verfasst: Mi 24.12.08 11:47
Frohe Weihnachten jaenicke,
fehlt da nicht ein ) hinter Inttostr(Eing) ?
Bis bald Chemiker
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 24.12.08 12:09
Ebenfalls frohe Weihnachten
nein, das fehlt nicht, schau mal etwas weiter hinten vor der Klammer  . Da ich das ganze als ein PChar übergeben muss ist es logischer es am Ende des Parameters zu setzen. Und ich hatte es ja sogar gehighlightet  .
|
|
Chemiker
      
Beiträge: 194
Erhaltene Danke: 14
XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit, Win 10, Win 11
BDS 2006, RAD Studio 2009+C++, Delphi 13, VS 2010 Prof.
|
Verfasst: Mi 24.12.08 12:17
Frohe Weihnachten jaenicke,
hatte wohl Weihnachtsbäume auf den Augen. Sorry!
Bis bald Chemiker
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 24.12.08 16:45
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 24.12.08 22:47
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 24.12.08 22:59
Eine neue Frage gehört in einen neuen Thread! Für weitere Fragen also bitte einen aufmachen!
Ich glaube dir ist nicht so ganz klar, was du eigentlich genau machst.
Denn: MessageBox zeigt zwar eine Meldung an, aber mehr auch nicht. Val gibt dir zurück, ob die Umwandlung erfolgreich war. Und den Wert musst du benutzen.
Denn nur wenn Val True zurückgegeben hat, die Umwandlung also erfolgreich war, darf überhaupt die Berechnung durchgeführt werden.
Zudem ist dein Code nicht besonders übersichtlich:
with würde ich so wenig wie nur möglich benutzen, du handelst dir dadurch manchmal schwer zu findende Fehler ein, gerade wenn du dich noch nicht so gut auskennst und mit Fehlermeldungen nicht so viel anfangen kannst.
Und globale Variablen machen den Code auch unübersichtlich.
So ungefähr müsste es eigentlich gehen: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| procedure TForm2.Button1Click(Sender: TObject); function umwandeln(var zahl1, zahl2: Real): Boolean; var fcode: integer; begin Val(edit1.Text, zahl1, fcode); Result := fcode = 0; if fcode <> 0 then MessageBox(0,'Im ersten Eingabefeld steht keine Zahl Bitte Zahl Eingeben' +#10#13+'zB.:1,2,3','Fehler',(mb_ok+mb_iconerror)); Val(edit2.Text,zahl2,fcode); Result := Result and (fcode = 0); if fcode <> 0 then MessageBox(0,'Im zweiten Eingabefeld steht keine Zahl Bitte Zahl Eingeben' +#10#13+'zB.:1,2,3','Fehler',(mb_ok+mb_iconerror)); end;
var zahl1, zahl2, ergebnis: real; hilfstext: string; begin if umwandeln(zahl1, zahl2) and (sender = Button1) then begin Ergebnis := ((Zahl2 / Zahl1)*3+0.3)*100; str(ergebnis:8:2, hilfstext); Edit3.Text := hilfstext; end; end; |
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 24.12.08 23:10
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 25.12.08 00:28
Frühlingsrolle hat folgendes geschrieben : | | Danke für den Hinweis, wollte jedoch dieses Forum nicht zumüllen weil sich das zweite Problem genauso mit einer MessageBox befasst. |
Worum es dabei geht ist, dass jemand, der später nach einem Thema sucht und eins mit einem passenden Titel findet auch erwartet, dass es darin darum geht und nicht dann um andere Themen.
Umgekehrt, wenn jemand eine später aufgekommene Frage sucht, dann wird er das Thema, in dem es ja um etwas anderes ging nicht finden bzw. nicht beachten.
Frühlingsrolle hat folgendes geschrieben : | | Ich gebs gerne zu dass ich ein Delphi Anfänger bin, trotzdem möchte ich immer was dazulernen also nicht böse sein wenn ich mich verhältnismäßig zu euch, dumm anstelle ^^ |
Es gibt keine dummen Fragen, nur dumme Antworten, da ist dir niemand böse, jeder hat mal angefangen.
Du solltest dich nur bemühen zu verstehen was genau dein Quelltext macht und nachschauen oder nachfragen, wenn du es nicht weißt. Das meinte ich mit: jaenicke hat folgendes geschrieben : | | Ich glaube dir ist nicht so ganz klar, was du eigentlich genau machst. |
Denn du hast zwar eine Meldung angezeigt, danach aber immer die Berechnung "Zahl2 / Zahl1" ausgeführt, auch wenn es einen Fehler gegeben hatte.
Aber dass dir solche Fehler nicht unbedingt im Code auffallen ist klar.
Was du deshalb lernen solltest ist debuggen, d.h. Fehlerbehebung:
Heißt: Du setzt einen Haltepunkt auf eine Codezeile. (F5 oder links neben die Zeile klicken)
Danach startest du normal mit F9 das Programm und klickst den Button. Was jetzt passiert ist, dass Delphi das merkt und an der Stelle das Programm anhält wo du den Haltepunkt gesetzt hattest.
Jetzt kannst du mit F7 / F8 schrittweise durch den Code gehen. Dann hättest du hier nämlich gemerkt, dass nach der Anzeige deiner Fehler-Messageboxen der restliche Code inklusive Berechnung (Zahl2 / Zahl1 --> Division durch 0, wenn Zahl1 noch 0 war) trotzdem ausgeführt werden und dort der Fehler aufgetreten ist. 
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 25.12.08 01:15
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 25.12.08 01:17
Frühlingsrolle hat folgendes geschrieben : | Das Debuggen mach ich sowieso immer beim Programmieren, sowohl mit Borland Delphi7 wie auch mit Turbo Pascal.
Außerdem dürfte das Programm mit Fehlerinhalten garnicht compiliert werden. |
Beim Debuggen geht es ja gerade nicht um Fehler, die beim Kompilieren auftreten.
Sondern um genau solche wie einer bei dir aufgetreten ist.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 25.12.08 01:36
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
|