Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Tranformieren von C nach Delphi7
Wil - Do 30.09.10 21:10
Titel: Tranformieren von C nach Delphi7
Hallo!
Ich habe leider keine Ahnung von C. :cry:
Ich hoffe jemand kann das unterstehende algorithme umprogrammieren in Delphi7. Vielleicht ist es schwierig, aber ich bin ueberzeugt jemand wird es schaffen. :wink:
Ich waehre dafuer sehr dankbar! :D
Wil (aus Holland). :wink:
C#-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: 30:
| LRESULT CALLBACK RueckWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { WORD nummer, status; LONG ret = 0; if(message == msgApparaat) { switch(wParam) { case CLA_AKTIV: hApparaat = (HWND) lParam; ApparaatAusgabe(CLA_ANMELDUNG, (WORD) hApparaatMsgWnd); break;
case CLA_LOK_SPEEDINFO: nummer = HIWORD(lParam); status = LOWORD(lParam); int lokRicht = status & 0x8000 ? LR_VOR : LR_RUECK; Fahrrichtung status = status & 0x7FFF; } }
else ret = DefWindowProc(hWnd, message, wParam, lParam); return ret; } |
Moderiert von
Narses: C#-Tags hinzugefügt
Bergmann89 - Fr 01.10.10 05:50
Hey,
das müsste ungefähr so aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| function RueckWndProc(hWnd: HWND; Message: Cardinal; wParam: WPARAM, lParam: LPARAM): LRESULT; var nummer, status: Word; lokRichtung: Integer; begin result := 0; if (Message == msgApparaat) then begin case wParam of CLA_AKTIV: begin hApparaat := HWND(lParam); ApparaarAusgabe(CLA_ANMELDUNG, WORD(hApparaatMsgWnd)); end; CLA_LOK_SPEEDINFO: begin nummer := HiWord(lParam); status := LoWord(lParam); lokRichtung := status and $8000 mod LR_VOR / LR_RUECK; status := status and $7FFF; end; end; end else result := DefWindowProc(hWnd, message, wParam, lParam); end; |
Ich bin mir jetzt aber nicht sicher, ob es die Typen (WPARAM, LPARAM) so in Delphi gibt. Außerdem weiß ich nich genau ob der ":"-Operator in C das normale "/" in Delphi war...
MfG Bergmann
jaenicke - Fr 01.10.10 06:02
Bergmann89 hat folgendes geschrieben : |
Außerdem weiß ich nich genau ob der ":"-Operator in C das normale "/" in Delphi war... |
Das ist der sogenannte Konditionaloperator. Das entspricht dem IfThen in Delphi:
C#-Quelltext
1:
| int MyResult = a ? b : c; |
In Delphi ist das:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var MyResult: Integer; begin MyResult := IfThen(a, b, c); if a then MyResult := b else MyResult := c; |
Bergmann89 - Sa 02.10.10 17:58
Stimmt, jetz wo du' sagst fällt mir wieder ein, das ich da ma was drüber gelesen hab. Aber status & $8000 ist doch kein Boolean, also kann man das ja gar nicht so einfach übersetzen. Oder is da dann ein ByteBool gemeint?
MfG Bergmann.
Marc. - Sa 02.10.10 18:03
Bergmann89 hat folgendes geschrieben : |
Stimmt, jetz wo du' sagst fällt mir wieder ein, das ich da ma was drüber gelesen hab. Aber status & $8000 ist doch kein Boolean, also kann man das ja gar nicht so einfach übersetzen. Oder is da dann ein ByteBool gemeint?
MfG Bergmann. |
Es ist ein
bitweises Boolean. [
http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Operatoren#.26_.28bitweise_Und-Verkn.C3.BCpfung.29] ;)
Deswegen sollte das wohl dann so lauten:
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:
| function RueckWndProc(hWnd: HWND; AMessage: Cardinal; wParam: WPARAM; lParam: LPARAM): LRESULT; var nummer, status: Word; lokRichtung: Integer; begin result := 0; if (AMessage = msgApparaat) then begin case wParam of CLA_AKTIVE: begin hApparaat := HWND(lParam); ApparaarAusgabe(CLA_ANMELDUNG, WORD(hApparaatMsgWnd)); end; CLA_LOK_SPEEDINFO: begin nummer := HiWord(lParam); status := LoWord(lParam); if (status and $8000) <> 0 then LR_VOR else LR_RUECK; status := status and $7FFF; end; end; end else result := DefWindowProc(hWnd, AMessage, wParam, lParam); end; |
jaenicke - Sa 02.10.10 18:10
Bergmann89 hat folgendes geschrieben : |
Aber status & $8000 ist doch kein Boolean, also kann man das ja gar nicht so einfach übersetzen. |
0 ist False, alles andere True. Also kannst du einfach auf Boolean casten. Das ist ja auch genau der Punkt wo man stolpert, wenn man auf "= True" prüft. Weil man dann nur auf einen der möglichen Werte für True prüft.
Du kannst natürlich auch <> 0 extra abfragen. ;-)
Bergmann89 - Sa 02.10.10 19:43
Hey,
also das geht in D7 nicht. Is das bei den neuen Versionen möglich?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var i: Integer;
i := 0; if i then Caption := 'ja' else Caption := 'nein'; |
MfG Bergmann.
Marc. - Sa 02.10.10 19:47
Bergmann89 hat folgendes geschrieben : |
also das geht in D7 nicht. Is das bei den neuen Versionen möglich? |
Nein, deswegen auch der Cast nach Boolean. Das geht aber auch nur, weil "0" als FALSE definiert ist.
Bergmann89 - Sa 02.10.10 19:53
Hey,
das casten hab ich überlesen, sry :oops:
das lustige is, das mein AntiVir mein Programm jetz als Virus erkennt :D aber nur wenn der Integer-Wert ungleich 0 ist. Naja is ja auch ega, jetz weiß ich ja das es geht :P
Danke.
MfG Bergmann
Marc. - Sa 02.10.10 20:00
Bergmann89 hat folgendes geschrieben : |
das lustige is, das mein AntiVir mein Programm jetz als Virus erkennt :D aber nur wenn der Integer-Wert ungleich 0 ist. |
OT: Welchen Virenscanner benutzte denn? Ich schlag vor, Du schickst denen das Programm respektive die entsprechende Codestelle zur Analyse, damit die diese FalsePositive-Meldung beheben können. :D
Bei mir (BitDefender) passiert das nämlich nicht.
jaenicke - Sa 02.10.10 20:32
Antivir halt, was die da für einen Blödsinn produzieren ist ja nun hinlänglich bekannt. Antivir erkennt eh alles was sich bewegt als Virus. :mrgreen:
Bergmann89 - So 03.10.10 02:15
Mit Antivir meinte ich nicht Antivir, sonder mein Antivirus-Prgramm, welches avast! ist^^
Wil - Mo 04.10.10 00:09
Ich bin sehr froh das ihr alle solche gute Uebersezungen fuer mich macht (C==>D7). Jetzt bin wahrscheinlich gans nahe dran!!!!!!!!!!!!!!!!!!!!!!!!
Mit sehr freundlichen Gruese, Wil.
Bergmann89 - Mo 04.10.10 00:28
Hey,
wieso ganz na dran? Marc. hats doch fertig gepostet...
MfG Bergmann
iterion - Mo 04.10.10 01:07
Wil hat folgendes geschrieben : |
Ich bin sehr froh das ihr alle solche gute Uebersezungen fuer mich macht (C==>D7). Jetzt bin wahrscheinlich gans nahe dran!!!!!!!!!!!!!!!!!!!!!!!!
Mit sehr freundlichen Gruese, Wil. |
Vielleicht kann man in c++ eine dll daraus machen, da es sich um eine funktion handelt, ich habe selber noch keine ahnung von c++ aber hier steht wie mans macht :
http://logix4u.net/Programming/vc++/A_Tutorial_on_creating_DLLs_with_VC++.html
Dann brauchst du nur die dll in delphi laden und die funktion aufrufen, ist sicher einfacher.
Ueber die antiviren, kann ich nur eins sagen: Wenn man sie auschaltet und nur benutzt wenn man den programmen nicht traut sind sie am nützlichsten, ansonsten sind es nur Cpu killer, der beste antivirus ist Human IQ!!!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!