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:
//Fensterfunktion zur Message-Bearbeitung
LRESULT CALLBACK RueckWndProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
   WORD nummer, status;
   LONG ret = 0;
   if(message == msgApparaat) // Message von Apparaat
   {
      switch(wParam)
      {
         case CLA_AKTIV: // Apparaat meldet sein Fensterhandle
           hApparaat = (HWND) lParam;
           ApparaatAusgabe(CLA_ANMELDUNG, (WORD) hApparaatMsgWnd);
           break;

         case CLA_LOK_SPEEDINFO: // geschwindigkeit geändert
           nummer = HIWORD(lParam);
           status = LOWORD(lParam);
           int lokRicht = status & 0x8000 ? LR_VOR : LR_RUECK; //
Fahrrichtung
           status = status & 0x7FFF;
           // ... Auswertung der Geschwindigkeit
         // ... alle anderen Aktionen auswerten
       }
  }

  else
    ret = DefWindowProc(hWnd, message, wParam, lParam);
 return ret;
}


Moderiert von user profile iconNarses: 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; //":" ist gleich "/" ?!
        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

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
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);
// oder:
  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

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
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 //Anmrk.: Boolean(status and $8000) wäre die exakte Entsprechung ;-)
          LR_VOR
        else
          LR_RUECK;
        status := status and $7FFF;
        // ... Auswertung der Geschwindigkeit
        // ... alle anderen Aktionen auswerten
      end;
    end;
  end
  else
    result := DefWindowProc(hWnd, AMessage, wParam, lParam);
end;


jaenicke - Sa 02.10.10 18:10

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconWil hat folgendes geschrieben Zum zitierten Posting springen:
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!!!