那位帮忙把下面这段代码,delphi的翻译成C#下,谢谢
procedure TForm1.BitBtn3Click(Sender: TObject);
VAR
   I,CARDNO,OVERFLAG:INTEGER;
   ROOM,STIME,GNAME,GID:STRING;
begin
     IF CHECKBOX2.Checked THEN
        OVERFLAG:=1
     ELSE
        OVERFLAG:=0;
     ROOM:=EDIT2.TEXT;
     STIME:=EDIT3.TEXT;
     GNAME:=EDIT10.TEXT;
     GID:=EDIT11.Text;
     IF LENGTH(ROOM)<>6 THEN BEGIN
        EDIT2.SetFocus;
        EXIT;
     END;
     IF LENGTH(STIME)<>24 THEN BEGIN
        EDIT3.SetFocus;
        EXIT;
     END;
     EDIT9.TEXT:='';
     I:=ISSUECARD(PCHAR(ROOM),nil,PCHAR(STIME),PCHAR(GNAME),PCHAR(GID),OVERFLAG,@CARDNO,NIL,NIL);
     EDIT9.TEXT:=INTTOSTR(CARDNO);
     SHOWMESSAGE('Result: '+inttostr(i));
end;

解决方案 »

  1.   

    自己也能写的差不多,就是一个地方没看明白 @CARDNO  
    这个改成C#是怎么样的
      

  2.   

    不行啊,外部函数是,如下int IssueCard(char *room,char *gate,char *stime,char *guestname,char *guestid, int  overflag, long *cardno,char * track1,char * track2);我改成ref long CARDNO 也不行啊
      

  3.   

    弄了一点,你照着弄吧,里面控件名自己改   int I,CARDNO,OVERFLAG;
       string ROOM,STIME,GNAME,GID;     if (checkBox1.Checked) 
         {
             OVERFLAG = 1;
         }
         else
         {
             OVERFLAG = 0;
         }
         ROOM = textBox1.Text;
         STIME =textBox1.Text;
         GNAME =textBox1.Text;
         GID =textBox1.Text;
         if (ROOM.Length > 6)
         {
             textBox1.Focus();
             return; ;
         }
      

  4.   


                int I, CARDNO, OVERFLAG;
                string ROOM, STIME, GNAME, GID;
                OVERFLAG = CheckBox1.Checked ? 1 : 0;
                ROOM = textBox2.Text;
                STIME = textBox3.Text;
                GNAME = textBox10.Text;
                GID = textBox11.Text;
                if (ROOM.Length != 6)
                {
                    textBox2.Focus();
                    return;
                }
                if (STIME != 24)
                {
                    textBox3.Focus();
                    return;
                }
                textBox9.Text = "";
                I = ISSUECARD(ROOM, null, STIME, GNAME, GID, OVERFLAG, CARDNO.ToString(), null, null);
                textBox9.Text = CARDNO.ToString();
                MessageBox.Show("Result: " + I.ToString());
      

  5.   

    long *cardno,
    这是cardno的原定义类型,改成CARDNO.ToString(), 不行吧
      

  6.   


    private void button1_Click(object sender, EventArgs e)
            {
                int I, CARDNO, OVERFLAG;
                string ROOM, STIME, GNAME, GID;            if (checkBox2.Checked)
                {
                    OVERFLAG = 1;
                }
                else
                {
                    OVERFLAG = 0;
                }
                ROOM = textBox2.Text;
                STIME = textBox3.Text;
                GNAME = textBox10.Text;
                GID = textBox11.Text;
                if(ROOM.Length != 6)
                {
                    textBox2.Focus();
                    return;
                }
                if (STIME.Length != 24)
                {
                    textBox3.Focus();
                    return;
                }
                textBox9.Text = "";
                //c#中没有pchar(字符指针型) 
                //delphi用@变量 是获取变量的地址
                //C#有关指针认为不安全的必须加unsafe修饰符
                //项目属性对话框->配置属性->生成->允许不安全代码块设为\"true\"
                unsafe
                {
                    I = ISSUECARD(Convert.ToChar(ROOM), null, Convert.ToChar(STIME), Convert.ToChar(GNAME), Convert.ToChar(GID), OVERFLAG, &CARDNO, null, null);
                }
                textBox9.Text = CARDNO.ToString();
                MessageBox.Show("Result: " + I.ToString());
            }
      

  7.   

    int CARDNO;
    int* p = &CARDNO;
      

  8.   

    int CARDNO;
    int* p = &CARDNO; 语法过不了啊
      

  9.   

    我引用一个外部dll,
    delphi 引用时的代码如下IssueCard(ROOMNO,GATE,STIME,GUESTNAME,GUESTID:PCHAR;OVERFLAG:INTEGER;CARDNO:PINTEGER;str1,str2:pchar):INTEGER;STDCALL;external dllname;
        function ReadCard(ROOMNO,GATE,STIME,GUESTNAME,GUESTID,track1,track2:pchar;CARDNO,st:pinteger):integer;stdcall;external dllname;
    我写的c# 的代码如下        [DllImport("LOCK3200.dll")]
            //发行客人卡。函数原形:
            public static extern int IssueCard(string room, string gate, string stime, string guestname, string guestid, int overflag, long cardno, string track1, string track2);            string room=this.txtroom.Text.ToString().Trim(); 
                string gate; 
                string stime=this.txtdatetime.Text.ToString().Trim();
                string guestname = this.txtcusname.Text.ToString().Trim();
                Int16 overflag; string track1; string track2;
               long cardno=0000;
                result = IssueCard(room, null, stime, null, null, 1, cardno, null, null);
    但是我写的C#的运行不起来,大家帮我看下,哪里有问题,怎么改呢?
      

  10.   


    unsafe public static extern int IssueCard(StringBuilder ROOMNO, StringBuilder GATE, StringBuilder STIME, StringBuilder GUESTNAME, StringBuilder GUESTID, int OVERFLAG, int* CARDNO, StringBuilder str1, StringBuilder str2); delphi中用PCHAR定义的c#中用StringBuilder
    delphi中用var申明变量的C#中要加refunsafe
                {
                    int CARDNO;
                    int* p = &CARDNO;
                }
      

  11.   

    我写的c#        [DllImport("LOCK3200.dll")]
            //发行客人卡。函数原形:
            unsafe public static extern int IssueCard(StringBuilder ROOMNO, StringBuilder GATE, StringBuilder STIME, StringBuilder GUESTNAME, StringBuilder GUESTID, int OVERFLAG, int* CARDNO, StringBuilder str1, StringBuilder str2);         private unsafe void button1_Click(object sender, EventArgs e)
            {
                StringBuilder room = new StringBuilder(this.txtroom.Text);
                StringBuilder gate;
                StringBuilder stime = new StringBuilder(this.txtdatetime.Text);
                StringBuilder guestname = new StringBuilder(this.txtcusname.Text.ToString());
                Int16 overflag; StringBuilder track1; StringBuilder track2;
                int CARDNO;
                int* p = &CARDNO;
                long cardno = 0000;
                result = IssueCard(room, null, stime, null, null, 1, &CARDNO, null, null);        }但是还是有问题啊
      

  12.   


    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
                    [DllImport("LOCK3200.dll")]
            //发行客人卡。函数原形:
            //unsafe public static extern int IssueCard(char* room, char* gate, char* stime, char* guestname, char* guestid, int overflag, long* cardno, char* track1, char* track2);
            unsafe public static extern int IssueCard(ref StringBuilder room, ref StringBuilder gate, ref StringBuilder stime, ref StringBuilder guestname, ref StringBuilder guestid, ref int overflag, out long* cardno, ref StringBuilder track1, ref StringBuilder track2);        private void button1_Click(object sender, EventArgs e)
            {
                string room, gate, stime, guestname, guestid;
                int overflag = 0;
                if (checkBox1.Checked)
                    overflag = 1;
                room = txtRoom.Text.ToString(); //"123456"
                gate = txtGate.Text.ToString(); //"010203"
                stime = txtStime.Text.ToString(); //"201303061200201303161200"
                guestname = txtStime.Text.ToString(); //"h_gxi"
                guestid = txtGuestid.Text.ToString(); //NULL            StringBuilder s_room = new StringBuilder(room);
                StringBuilder s_gate = new StringBuilder(gate);
                StringBuilder s_stime = new StringBuilder(stime);
                StringBuilder s_guestname = new StringBuilder(guestname);
                StringBuilder s_guestid = new StringBuilder(guestid);
                StringBuilder track1 = new StringBuilder();
                StringBuilder track2 = new StringBuilder();            if (room.Length != 6)
                {
                    txtRoom.Focus();
                    return;
                }
                if (stime.Length != 24)
                {
                    txtStime.Focus();
                    return;
                }
                unsafe
                {
                    long* cardno;
                    IssueCard(ref s_room, ref s_gate, ref s_stime, ref s_guestname, ref s_guestid, ref overflag, out cardno, ref track1, ref track2);
                    txtCardno.Text = Convert.ToString((int)*cardno);
                    MessageBox.Show("Result: " + cardno->ToString());
                }
            } 
        }这段编译通过,不知道返回参数是不是你要的数据。
    我也是刚学C# 慢慢研究吧肯定有可行的办法的!
      

  13.   

    (int)*cardno  改成 (int)cardno 看看
      

  14.   

    是这句IssueCard(ref s_room, ref s_gate, ref s_stime, ref s_guestname, ref s_guestid, ref overflag, out cardno, ref track1, ref track2); 
    我看这句的返回值是14,但是14,在接口文档的说明中是表示14-参数错误  
      

  15.   


    unsafe public static extern int IssueCard(ref StringBuilder room, ref StringBuilder gate, ref StringBuilder stime, ref StringBuilder guestname, ref StringBuilder guestid, ref int overflag, out IntPtr cardno, ref StringBuilder track1, ref StringBuilder track2);
    IntPtr cardno;
                    IssueCard(ref s_room, ref s_gate, ref s_stime, ref s_guestname, ref s_guestid, ref overflag, out cardno, ref track1, ref track2);
      

  16.   

    语法上说,应该对了,但是接口配置文件说明是0才是成功;
    3、 IssueCard
    发行客人卡。函数原形:
    int IssueCard(char *room,char *gate,char *stime,char *guestname,char *guestid, int  overflag, long *cardno,char * track1,char * track2);
    参数:
    room [in]:房号,6字节字符串,必须是门锁系统设置的房号。
    gate [in]:公共通道,字符串参数,“00”表示按默认授权通道,“99”表示授权所有公共通道,其他为指定通道代码。例如:“010203”表示授权01、02、03三个通道。
    Stime [in]:起止时间,24字节字符串,格式yyyymmddhhnnyyyymmddhhnn,例如:“200012311230200101011230”表示2000年12月31日12时30分到2001年1月1日12时30分。Lock9200:起止时间不能在同一天内,且不能超过1个月。
    Guestname [in]:客人姓名,最大30字节,可以为NULL。
    Guestid [in]:客人ID,最大30字节,可以为NULL。
    Overfla [in]:整形,是否覆盖当前卡上的内容。1-覆盖,当前卡不是新卡则自动注销(必须是客人卡)。0-不覆盖,不是新卡则返回。磁卡(手动发行机)忽略此参数,直接覆盖,不自动注销。
    Cardno [out]:长整形指针,接收卡号(发卡后分配的唯一卡代码)。可以为NULL。
    track1 [in]:字符串指针,磁卡第1轨数据,如不写此轨可为NULL。
    track2 [in]:字符串指针,磁卡第2轨数据,如不写此轨可为NULL。
    返回值:见注1。 0-操作成功  14-参数错误 
      

  17.   

    没有返回第几个参数错了?
    把ref去掉看看呢
      

  18.   

    我下DLL测试了下没返回14啊!
    IssueCard函数 返回20  
    Init函数 返回19
    返回14应该是给的值错了。[DllImport("LOCK3200.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            public static extern int Init(string server, int port, int Encoder, int TMEncoder);        [DllImport("LOCK3200.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            public static extern int IssueCard(string room, string gate, string stime, string guestname, string guestid, int overflag, ref int cardno, string track1, string track2);        private void button1_Click(object sender, EventArgs e)
            {
                string room, gate, stime, guestname, guestid;
                int overflag = 0;
                if (checkBox1.Checked)
                    overflag = 1;
                room = txtRoom.Text.ToString(); //"123456"
                gate = txtGate.Text.ToString(); //"010203"
                stime = txtStime.Text.ToString(); //"201303061200201303161200"
                guestname = txtStime.Text.ToString(); //"h_gxi"
                guestid = txtGuestid.Text.ToString(); //NULL            if (room.Length != 6)
                {
                    txtRoom.Focus();
                    return;
                }
                if (stime.Length != 24)
                {
                    txtStime.Focus();
                    return;
                }            unsafe
                {
                    int cardno = 0; 
                    int I = IssueCard(room, gate, stime, guestname, guestid, overflag, ref cardno, null, null);
                    txtCardno.Text = Convert.ToString(cardno);
                    MessageBox.Show("Result: " + I);
                }
            }        private void btnInit_Click(object sender, EventArgs e)
            {
                int I = 1;
                string s = "V26TR99M2V2DQFI";
                I = Init(s, 2, 1, 1);
                MessageBox.Show("Result: " + I);
            }
    说明文档我也下了,好像必须安装门锁系统才可以。
    必须用 CallingConvention.StdCall
    下面给你C++参数转C# 对照
    http://blog.csdn.net/zhouhuiah/article/details/6175817
      

  19.   

    大家帮我看下,下面这个应用哪里有问题?
    原delphi示例,调用说明
    int ReadCard(char *room, char *gate,char *stime, char *guestname, char *guestid, char *track1, char *track2, long *cardno, int *st);
    参数:
    room [out]:字符串指针,接收返回的房号,建议10字节。
    gate [out]:字符串指针,接收返回的授权公共通道,可以为NULL。
    Guestname [out]:字符串指针,接收返回的客人姓名,可以为NULL。
    Guestid [out]:字符串指针,接收返回的客人ID,可以为NULL。
    track1 [out]:接收磁卡第1轨数据,可以为NULL。
    track2 [out]:接收磁卡第2轨数据,可以为NULL。
    Cardno [out]:长整形指针,接收返回的卡号,可以为NULL。
    St [out]:整形指针,接收返回的卡状态,1-正常使用,3-正常注销,4-遗失注销,5-损毁注销,6-自动注销。可以为NULL。下面是我写的C#的调用
            [DllImport("LOCK3200.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
            //读卡。函数原形:
            unsafe public static extern int ReadCard(out StringBuilder room, out StringBuilder gate, out StringBuilder stime, out StringBuilder guestname, out StringBuilder guestid, out StringBuilder track1, out StringBuilder track2, out long* cardno, out int* st);
                StringBuilder s_room = new StringBuilder();            
                StringBuilder s_gate = new StringBuilder();
                StringBuilder s_stime = new StringBuilder();
                StringBuilder s_guestname = new StringBuilder();
                StringBuilder s_guestid = new StringBuilder();
                StringBuilder s_track1 = new StringBuilder();
                StringBuilder s_track2 = new StringBuilder();
                unsafe
                {
                    long* cardno;
                    int* st;
                    result = ReadCard(out s_room, out s_gate, out s_stime, out s_guestname, out s_guestid, out s_track1, out s_track2, out cardno, out st);
                }
      

  20.   

    下面这段DELPHI代码翻译成C#,怎么写啊
    VAR
       I:INTEGER;
       ROOM,STIME,GNAME,GID,gate:ARRAY[0..50] OF CHAR;
       CARDNO,ST:INTEGER;
    begin
          edit4.text:='';
          edit5.text:='';
          edit6.text:='';
          edit7.text:='';
          edit8.text:='';
          I:=READCARD(ROOM,gate,STIME,GNAME,GID,NIL,NIL,@CARDNO,@ST);
          SHOWMESSAGE('Result: '+inttostr(i));
     
    end;