Codeconvertierung ICQClient-Komponente Delphi -> CB6



  • Hallo! Ich habe mir die Komponente ICQClient (für Delphi 5+) heruntergeladen und versuche diese nun mit dem CB6 zu verwenden. Der Login zum ICQ-Server, das senden von Nachrichten und sonstige Funktionen gehen einwendfrei. Nur mit dem Anfordern der Kontaktliste vom ICQ-Server habe ich einige Probleme.

    In der Hilfe der Komponente ist es so beschrieben:

    OnServerListRecv(Sender: TObject; SrvContactList: TList)
    
    A response to RequestContactList procedure.
    After using the SrvContactList you *must* call DestroyUINList procedure with SrvContactList as a parameter, required to free allocated data, otherwise you'll have memory leaks. Each SrvContactList is a pointer on a TUINEntry stucture (declared in ICQClient.pas). 
    
      TUINEntry = record
        UIN: LongWord;            //UIN in contact list
        Nick: ShortString;        //Nick of this UIN, can be null(empty)
        CType: Word;              //Type, can be U_NORMAL(Normal contact list entry), U_VISIBLE_LIST(user is in visible list)
                                  //, U_INVISIBLE_LIST(user is in invisible list), U_IGNORE_LIST(user is in ignore list)
        CGroupID: Word;           //Group's ID user belongs to
        CTag: Word;               //ID of the user
        CGroup: ShortString;      //Group name, UIN belongs to
      end;
    
      Example:
      procedure TMainForm.ICQClient1ServerListRecv(Sender: TObject;
        SrvContactList: TList);
      var
        i: Word;
        UserInfo: TUINEntry;
      begin
         if SrvContactList.Count > 0 then
           for i := 0 to SrvContactList.Count - 1 do
           begin
             UserInfo := PUINEntry(SrvContactList.Items[i])^;
             Memo1.Lines.Add(UserInfo.Nick + ' is in group ' + UserInfo.CGroup
               + ' and his uin is ' + IntToStr(UserInfo.UIN));
           end;
         ICQClient1.DestroyUINList(SrvContactList);
      end;
    

    Ich habe das jetzt mal versuch in CB6 zu übersetzen.

    void __fastcall TForm1::icqServerListRecv(TObject *Sender,
          TList *SrvContactList)
    {
    Memo1->Lines->Add("Kontaktliste anfordern...");
    
    TUINEntry test;
     LongWord UIN;
    }
    

    Weiter bin ich leider noch nicht gekommen 😞

    Außedem kann ich der Komponente nicht die UIN zuweisen:

    [C++ Error] Unit1.cpp(38): E2015 Ambiguity between '_fastcall Sysutils::StrToInt(const System::AnsiString)' and '_fastcall Icqworks::StrToInt(const System::AnsiString)'
    

    Gibt es hier vielleicht Jemanden, der mir helfen kann? Wäre echt super!! Danke!!!



  • Also "Count" der Kontaktliste kann ich abfragen aber wie die Einträge??

    ListBox1->Items->Add(SrvContactList->Count);
    

    Raus kommt "17"

    ListBox1->Items->Add(SrvContactList->Items[0]);
    

    da meint er:

    [C++ Error] Unit1.cpp(36): E2034 Cannot convert 'void *' to 'AnsiString'
    


  • Warum willst du es auch in AnsiString konvertieren? Glaubst du nicht, dass du da nen zwischenschritt vergessen hast?



  • UserInfo := PUINEntry(SrvContactList.Items[i])^;
    

    Hier geht es ja auch, nur weiß ich nicht wie ich

    UserInfo := PUINEntry
    

    auf den Builder übertragen kann.



  • Auf diese Idee

    UserInfo = PUINEntry(SrvContactList.Items[i]);
    

    bist du wahrscheinlich schon selbst gekommen... was kommt denn da für ne Meldung?



  • Da kommt

    E2451 Undefined symbol 'UserInfo'
    E2294 Structure required on left side of . or .*
    

    Das heißt ich muss "UserInfo" deklarieren aber wie??

    Vielleicht mit

    PUINEntry UserInfo;
    

    das funktioniert, aber wie dann weiter?



  • Na wohl eher

    TUINEntry
    

    Und dann halt

    UserInfo = PUINEntry(SrvContactList->Items[i]);
    

    Schon ein wenig scheiße, dass du der einzige bist, der das teste kann... 😃



  • Das geht leider auch nicht!

    Scheiss Delphi ^^

    Hier der Link zur Komponente: (ist ganz einfach zu bedienen nur halt dieses dumme anfordern der ContactList) 😉

    http://prdownloads.sourceforge.net/ticqlib/icq_20040630.zip?download



  • Wenn ichs so mache kommt nur noch der Fehler:

    TUINEntry UserInfo = PUINEntry(SrvContactList->Items[0]);
    
    E2034 Cannot convert 'TUINEntry *' to 'TUINEntry'
    

    Also ihrgendwie muss das schon stimmen hmm...



  • TUINEntry UserInfo;
    
    UserInfo = PUINEntry (SrvContactList->Items[0]);
    

    so gehts auch net und andersrum auch net... verstehe das nicht kennt sich denn hier keine mit Delphi aus?



  • Nun, das hat nicht unbedingt was mit delphi zu tun. Der dämliche Programmierstil ist halt ... dämlich.

    TUINEntry *UserInfo;
    

    Probier mal.



  • DANKSCHÖN!! DU BIST DER KING ^^
    FUNKTIONIERT EINWANDFREI 😃 :

    TUINEntry *UserInfo;
    int clcount = SrvContactList->Count;
    int i = 0;
    
    while (i < clcount)
    {
    UserInfo = PUINEntry (SrvContactList->Items[i]);
    ListBox1->Items->Add(UserInfo->Nick);
    i++;
    }
    

    Aber ich kann immernoch nicht

    StrToInt
    

    verwenden 😞



  • Der Compiler findet zwei Versionen von StrToInt und weiß nicht welche er verwenden soll. Du mußt den Namespace vor die Funktion stellen. z.B. Systutils::StrToInt(...).



  • Ah ja genau danke!!! Wusste das es zwei funktionen gab aber wie ich das lösen kann "wusste" ich nicht! DANKE! ^^



  • Was denn, ich bin kein King?? Den Unterschied zwischen Objekt und Zeiger hätte ich auch gewußt... grummel 😃



  • Doch, du auch 😉 !
    Ja aber das ist so dumm gemacht finde ich... außerdem in Delphi ^^



  • wäre es denn nicht einfacher die kompo direkt so zu verwenden, anstatt sie erst umständlich in den bcb zu konvertieren?


Anmelden zum Antworten